민프
[Flutter] 민감한 정보는 SharedPreferences 대신 FlutterSecureStorage를 사용하여 저장하자(android-KeyChain, IOS - KeyStore) 본문
[Flutter] 민감한 정보는 SharedPreferences 대신 FlutterSecureStorage를 사용하여 저장하자(android-KeyChain, IOS - KeyStore)
민프야 2023. 12. 20. 17:00이번 프로젝트에서 같이 일하는 팀원분의 코드를 보는 도중 모든 유저의 정보(Token 값들 포함)를 SharedPreferences다 넣고 사용하는 것을 목격했습니다..
그래서 이런 부분은 SharedPreferences보다는 android-KeyChain, IOS - KeyStore로 적용하는게 보안적으로 더 좋다고 말씀드렸고, 리펙토링을 진행하여 수정을 완료했습니다.
그럼 왜 SharedPreferences말고 SecureStorage를 사용해야 하는걸까요?
Flutter에서 정보를 저장하기 위해서 일반적으로 SharedPreferences 패키지를 많이 사용합니다
근데 토큰과 같이 민감한 정보 or 로그인 정보 or 유저정보 들이 쉽게 노출이되기에 보안에 취약하므로 개인정보는 SecureStorage 를 이용해서 저장하는것이 바람직합니다.
안드로이드의 KeyStore을 기준으로 더 설명해보자면
SharedPreferences와 KeyStore는 모두 안드로이드 애플리케이션에서 데이터를 저장하는 메커니즘을 제공하지만, 그 목적과 보안 수준에서 차이가 있는데 간단하게 설명해보겠습니다.
SharedPreferences
- 저장 위치와 방식: SharedPreferences는 간단한 키-값 쌍 형태로 데이터를 저장하며, 일반적으로 앱의 내부 저장소에 텍스트 파일로 저장됩니다. 이는 앱의 설정 값이나 상태 정보를 저장하는 데 적합합니다.
- 보안 수준: SharedPreferences에 저장된 데이터는 기본적으로 암호화되지 않아서 루팅된 기기에서는 이 데이터에 쉽게 접근할 수 있으며, 앱의 데이터를 추출할 수 있는 경우에도 민감한 정보가 노출될 위험이 있습니다.
- 사용 용도: 사용자의 설정, 상태 유지, 간단한 정보 저장 등 비교적 민감하지 않은 데이터를 저장하는 데 주로 사용됩니다.
KeyStore
- 저장 위치와 방식 : KeyStore는 암호화 키를 안전하게 저장하는 시스템으로, 안드로이드의 KeyChain (iOS에서는 Keychain) 시스템을 활용해 키를 보안이 강화된 영역에 저장합니다. 이는 암호화된 형태로 저장되며, 키 자체는 애플리케이션 코드나 다른 앱에서 접근할 수 없습니다.
- 보안 수준: KeyStore는 하드웨어 기반의 보안 요소를 사용하여 키를 보호합니다.
이는 키가 물리적으로 분리된 안전한 환경에 저장됨을 의미하며, 소프트웨어 및 물리적 공격에 대한 강력한 보안을 제공합니다.
- 사용 용도: 암호화 키의 안전한 생성, 저장, 사용을 위한 목적으로 사용되고, 이를 통해 앱 내부 또는 앱 간의 안전한 데이터 전송, 사용자 인증 정보의 보호 등에 사용됩니다.
그래서 무슨차이?
SharedPreferences와 KeyStore의 가장 큰 차이는 보안 수준에 있습니다.
SharedPreferences는 일반 텍스트 형태로 데이터를 저장하기 때문에, 민감한 정보를 저장하기에는 적합하지 않는 반면, KeyStore는 키 관리를 위한 보안 시스템으로, 키를 안전한 환경에 저장하고 암호화하여 사용합니다.
이를 통해 높은 수준의 보안을 제공하며, 특히 금융 앱, 기업용 앱, 개인 정보를 다루는 앱 등에서 중요한 역할을 합니다.
결론적으로, SharedPreferences는 간단한 정보 저장용으로 적합하고, KeyStore는 높은 보안이 요구되는 키 관리에 적합합니다.
https://developer.android.com/training/articles/keystore?hl=ko
https://developer.apple.com/documentation/security/keychain_services
'[Flutter]' 카테고리의 다른 글
[Flutter] Flutter에서 인앱결제를 해보자 (IOS) (1) | 2024.03.21 |
---|---|
[Flutter] 애플 로그인을 구현해보자 (IOS) (0) | 2024.03.18 |
[Flutter] BLoC - 3. 목록 튜토리얼 앱에 적용해보기 (without Cubit) (4) | 2023.10.20 |
[Flutter] stream_transform 라이브러리에 대해서 알아보자 (0) | 2023.10.20 |
[Flutter] Bloc Concurrency 라이브러리에 대해서 알아보자 (0) | 2023.10.20 |