프로젝트에서 백엔드에게 토큰을 얻어와서 이를 보관해야 하는데, 어디다 보관할지 고민할일이 좀 생겼다.

백엔드에서 발급해준 토큰은 App 내부에서 API를 요청할 때 Client의 주민등록증 같은것이라고 생각하면 되겠다.

그래서 우연히 찾아본 결과, Flutter Secure Storage 라는 것을 발견하게 됬다.

 

Pub.dev의 Package Docs에서 찾아봤더니, 보안이 강화된 일종의 memory 영역이라고 보면 되겠다. 

iOS 같은경우 secure storage에 데이터를 넣으면 KeyChain에 저장되고

Android 같은경우 Keystore에 저장된다고 한다.

 

사용법을 알아보기전에 우선 설치부터 먼저해보자!

pubspec.yaml에서 아래 구문을 추가해준 뒤, Pub get을 시도해주자.

  flutter_secure_storage: ^9.0.0

 

공식 Docs를 보니 코드가 정말 간단하다.

 

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);

 

CRUD기능이 전부 한줄 안에 끝나며, Key, Value 형식으로 저장된다.

 

사용하는데는 문제가 없어 보이는데, 한가지좀 걸리는게 있다.

"토큰을 사용할 일이 많은데 일일히 생성자를 통해 선언해주기엔 조금 아까운데.." 라는 생각이 들것이다.

이때를 위해서 필요한게 바로 디자인 패턴중 하나인 'SIngleton Pattern' 이다.

 

작성한 코드를 한번 살펴보자.

import 'package:flutter_secure_storage/flutter_secure_storage.dart';
class SecureStorage{
  SecureStorage._privateContructor();

  static final SecureStorage _instance = SecureStorage._privateContructor();

  factory SecureStorage(){
    return _instance;
  }
  // contructor
  final FlutterSecureStorage storage = FlutterSecureStorage();

  Future<void> writeSecureData(String key, String value) async {
    await storage.write(key: key, value: value);
  }
  Future<String?> readSecureData(String key) async {
    return await storage.read(key: key);
  }
  Future<void> deleteSecureData(String key) async{
    await storage.delete(key: key);
  }
}

 

 

싱글턴 패턴은 객체가 프로젝트에서 '단 한번' 만 선언되어 객체가 여러개 생성될 일이 없게 되어있다. 그래서 싱글톤이라 불리는 것 같다.

그래서 static과 privateConstructor를 통해 객체가 단 한번만 선언이 되도록 코드를 수정합니다.

_privateConstructor를 통해 생성자를 외부에서 접근하지 못하도록 한다.

Factory 키워드는 dart 특유에 constructor 같은 느낌인데, 다음 시간에 글로 정리해보겠습니다.

 

정리하면, 외부에서 클래스의 객체를 원할때마다 factory SecureStorage()를 통해 이미 생성된 객체를 반환하는 것이다.

 

 

 

 

참고자료:

https://pub.dev/packages/flutter_secure_storage

https://jay-flow.medium.com/dart%EC%97%90%EC%84%9C-singleton-pattern%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-2312616bbb7e