Android SharedPreferences 평문 저장

Android SharedPreferences에 민감 정보 평문 저장

설명

SharedPreferences는 앱 내부 저장소에 값을 쉽게 저장하기 위한 API입니다. 인증 토큰, 세션 ID, 개인 식별 정보 같은 민감한 값을 평문으로 저장하면 루팅된 기기, 백업 파일, 디버그 추출, 악성 앱과의 조합을 통해 값이 노출될 수 있습니다.

잠재적 영향

  • 인증 토큰 또는 세션 탈취
  • 개인정보와 앱 내부 설정 노출
  • 탈취한 값 재사용을 통한 계정 접근

해결 방법

  1. 민감한 값은 가능한 한 기기에 저장하지 않습니다.
  2. 저장이 필요하면 키를 Android Keystore로 보호하고, 유지 관리되는 플랫폼 암호화 API나 검토된 암호화 저장 계층을 사용하세요. EncryptedSharedPreferences는 AndroidX Security 1.1.0부터 사용 중단(deprecated) 상태이므로 새 코드의 기본 선택으로 사용하지 마세요.
  3. 로그, 백업, 디버그 경로를 통해 같은 값이 추가로 노출되지 않는지 함께 점검합니다.

예시

변경 후 코드는 기존 EncryptedSharedPreferences 사용을 설명하는 레거시 예시입니다. context와 Keystore 기반 masterKey의 준비는 생략했습니다. 이 파일은 키가 복원되지 않을 수 있으므로 Auto Backup에서 제외해야 합니다.

변경 전

java
preferences.edit().putString("auth_token", token).apply();

변경 후

java
SharedPreferences preferences = EncryptedSharedPreferences.create(
    context,
    "secure_prefs",
    masterKey,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);
preferences.edit().putString("auth_token", token).apply();

설명:

  • 변경 전: SharedPreferences에 비밀번호, 토큰, API 키 같은 민감 값을 평문으로 저장하면 백업, 루팅된 기기, 디버그 추출, 취약한 로컬 접근 경로를 통해 값이 노출될 수 있습니다.
  • 변경 후: 기존 EncryptedSharedPreferences가 키와 값을 암호화해 저장합니다. 새 구현에서는 앞서 설명한 현재 지원되는 암호화 방식을 선택하세요. 기기나 앱 프로세스가 침해된 상태까지 암호화만으로 방어할 수는 없습니다.

참조