본문 바로가기
Study/Flutter

[Flutter] flutter_secure_storage를 이용한 자동 로그인

Flutter 에서 디바이스 내부에 정보를 저장하기 위해서 일반적으로 shared_preferences 패키지를 많이 사용하지만

로그인 정보들이 쉽게 노출이되기에 보안에 취약하므로

개인정보는 flutter_secure_storage 를 이용해서 저장하는것이 바람직하다.

 

Shared_preferences 는 왜 보안에 취약한가?

  • Android에서의 문제
    Android는 루팅을 통하여 루트 권한을 얻음으로 생산자, 판매자측에서 걸어 놓은 제약을 해제하면
    Shared Preference 같은 쉽게 사용할 수 있는 내부 저장소들은 간단한 루팅 과정만으로
    ADB(Android Debug Bridge)를 사용해서 저장되어있는 내용들을 쉽게 볼 수 있다고 한다.
  • iOS에서의 문제
    iOS는 탈옥(Jailbreaking) 을 통하여 iOS의 샌드박스 제한을 풀어 타 회사에서 사용하는 서명되지 않은 코드를 실행할 수 있게 된다.

 

FlutterSecureStorage는 왜 보안성을 보장하는가?

민감한 정보들을 저장할 때 flutter_secure_storage 라는 패키지를 사용하면 AES 비밀키는 RSA로 암호화되어 
Android에서는  keystore 영역에, iOS에서는 keychain라는 내부 저장소 영역을 사용하게 된다.

Android의 keystore은 소스코드 내부 어딘가가 아닌 시스템만이 접근할 수 있는 컨테이너에 저장 하기 때문에 루팅을 하여도 접근 할 수 없다. 그래서 앱에서 임의로 발급한 암호화 키만 저장하고 이 키를 이용해 정보를 암호화해 로컬 DB에 저장하고, 저장된 정보를 사용할 때는 복호화해 사용한다.

 

FlutterSecureStorage 사용법

  • V5.0.0부터 아래와 같이 Android 옵션에서 활성화하여 EncryptedSharedPreferences를 사용가능하며 해당 옵션을 권장합니다.
AndroidOptions _getAndroidOptions() => const AndroidOptions(
        encryptedSharedPreferences: true,
      );
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

// Create storage
final storage = new FlutterSecureStorage();

// Read value
String value = await storage.read(key: key);

// Read all values
Map<String, String> allValues = await storage.readAll();

// Delete value
await storage.delete(key: key);

// Delete all
await storage.deleteAll();

// Write value
await storage.write(key: key, value: value);

 

 

 

https://pub.dev/packages/flutter_secure_storage/example

 

flutter_secure_storage | Flutter Package

Flutter Secure Storage provides API to store data in secure storage. Keychain is used in iOS, KeyStore based solution is used in Android.

pub.dev

 

FlutterSecureStorage를 이용한 로그인 / 로그아웃 예제코드 (+ Dio를 이용한 Rest Api 호출)

https://velog.io/@jakob1/FlutterSecureStorage%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%83%81%ED%83%9C-%EC%9C%A0%EC%A7%80