2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

SharedPreferences의 데이터를 보안적으로 저장하는 방법은 무엇인가요?

_____
Q: SharedPreferences에 저장된 데이터를 어떻게 안전하게 보호할 수 있나요?

A: SharedPreferences는 기본적으로 평문으로 데이터를 저장하므로 중요한 정보를 직접 저장하는 것은 권장되지 않습니다. 데이터를 보안적으로 저장하기 위한 주요 방법은 다음과 같습니다.

1. 암호화 사용
- Android에서는 `Jetpack Security` 라이브러리의 `EncryptedSharedPreferences`를 활용해 자동으로 암호화 및 복호화를 수행할 수 있습니다.
- 이 라이브러리는 내부적으로 `MasterKey`를 생성해 AES-256 암호화를 적용하며, 저장 시 자동 암호화, 읽기 시 자동 복호화를 지원합니다.
- 사용법 예:
```kotlin
val masterKeyAlias = MasterKey.Builder(context).setKeyScheme(MasterKey.KeyScheme.AES256_GCM).build()
val sharedPreferences = EncryptedSharedPreferences.create(
context,
"secret_shared_prefs",
masterKeyAlias,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
```

2. 민감정보는 가능한 저장하지 않기
- 암호, 토큰 등 민감정보는 SharedPreferences에 저장하지 않고, 필요한 경우 인증 서버를 통해 매번 받아오거나 안전한 저장소를 활용합니다.

3. 키 관리에 신경쓰기
- 암호화 키는 안전한 환경, 예를 들어 Android Keystore 시스템을 이용해 관리해야 합니다.
- MasterKey는 Keystore 기반으로 생성되므로 별도의 키 저장 없이도 안정적인 보안을 제공합니다.

4. 파일 권한 설정
- 기본적으로 SharedPreferences 파일은 앱 내에서만 접근 가능하지만, 혹시 모를 취약점을 대비해 `MODE_PRIVATE` 모드로 설정해 외부 접근을 차단합니다.
- 예: `context.getSharedPreferences("prefs", Context.MODE_PRIVATE)`

5. 추가 보안 방안
- 데이터 무결성 확인을 위해 HMAC 등 인증 코드를 별도로 생성해 저장 또는 검증할 수 있습니다.
- 루팅, 탈옥된 기기에서는 데이터 유출 위험이 크므로, 보안 감지를 적용해 민감한 작업을 제한하는 것도 고려합니다.

---

요약: SharedPreferences 데이터를 보안적으로 저장하려면 가장 좋은 방법은 Jetpack Security의 `EncryptedSharedPreferences`를 사용하는 것입니다. 이를 통해 저장되는 모든 키와 값이 안전하게 암호화되어 저장되며, 키 관리는 Android Keystore에 의존하여 높은 보안을 유지할 수 있습니다. 민감정보 저장 시 직접 평문 저장은 피하고 반드시 암호화 및 권한 설정에 주의해야 합니다.
SharedPreferences는 Android 애플리케이션에서 간단한 데이터를 저장하는 데 사용되는 API입니다.

그러나 SharedPreferences에 저장된 데이터는 기본적으로 암호화되지 않기 때문에 보안에 취약할 수 있습니다.

따라서 민감한 정보를 저장할 때는 추가적인 보안 조치를 취하는 것이 중요합니다.

다음은 SharedPreferences의 데이터를 보안적으로 저장하는 방법에 대한 몇 가지 권장 사항입니다.

1. EncryptedSharedPreferences 사용하기 Android Jetpack의 `EncryptedSharedPreferences`를 사용하면 SharedPreferences에 저장된 데이터를 자동으로 암호화할 수 있습니다.

이 방법은 Google에서 제공하는 공식적인 방법으로, AES 알고리즘을 사용하여 데이터를 안전하게 저장합니다.

```kotlin val masterKeyAlias = MasterKey.Builder(context) .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) .build() val sharedPreferences = EncryptedSharedPreferences.create( context, "secure_prefs", masterKeyAlias, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) ``` 이렇게 설정하면, 모든 데이터가 자동으로 암호화되어 저장됩니다.

복호화는 자동으로 처리되므로, 사용자는 암호화된 데이터를 직접 다룰 필요가 없습니다.



2. 데이터 최소화 민감한 정보를 저장할 필요가 없는 경우, 가능한 한 적은 양의 데이터를 SharedPreferences에 저장하는 것이 좋습니다.

예를 들어, 사용자 인증 토큰이나 비밀번호와 같은 정보를 저장하는 대신, 서버에서 인증을 처리하고 필요한 경우에만 데이터를 요청하는 방법을 고려할 수 있습니다.



3. 데이터 암호화 `EncryptedSharedPreferences`를 사용하지 않는 경우, 데이터를 수동으로 암호화하여 저장할 수 있습니다.

AES와 같은 대칭 키 암호화 알고리즘을 사용하여 데이터를 암호화한 후, 암호화된 문자열을 SharedPreferences에 저장합니다.

복호화할 때는 동일한 키를 사용하여 데이터를 복원합니다.

```kotlin fun encryptData(data: String, key: SecretKey): String { // AES 암호화 로직 } fun decryptData(encryptedData: String, key: SecretKey): String { // AES 복호화 로직 } ```

4. 키 관리 암호화에 사용되는 키는 안전하게 관리해야 합니다.

Android Keystore System을 사용하여 암호화 키를 안전하게 저장하고 관리할 수 있습니다.

이 시스템은 키를 안전하게 저장하고, 앱이 종료되거나 재시작되더라도 키를 보호합니다.

```kotlin val keyStore = KeyStore.getInstance("AndroidKeyStore") keyStore.load(null) val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore") val keyGenParameterSpec = KeyGenParameterSpec.Builder( "my_key_alias", KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT ).setBlockModes(KeyProperties.BLOCK_MODE_GCM) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) .build() keyGenerator.init(keyGenParameterSpec) val secretKey = keyGenerator.generateKey() ```

5. 사용자 인증 민감한 데이터에 접근하기 전에 사용자 인증을 요구하는 방법도 고려할 수 있습니다.

예를 들어, 생체 인식(지문, 얼굴 인식 등)이나 PIN 코드 입력을 통해 사용자가 인증된 경우에만 데이터를 접근하도록 설정할 수 있습니다.



6. 보안 감사 및 테스트 애플리케이션의 보안을 정기적으로 감사하고 테스트하는 것이 중요합니다.

보안 취약점이 발견되면 즉시 수정하고, 최신 보안 패치를 적용하여 애플리케이션을 안전하게 유지해야 합니다.

결론 SharedPreferences에 민감한 데이터를 저장할 때는 항상 보안에 유의해야 합니다.

`EncryptedSharedPreferences`를 사용하는 것이 가장 간단하고 안전한 방법이며, 추가적으로 데이터 최소화, 키 관리, 사용자 인증 등의 방법을 통해 보안을 강화할 수 있습니다.

이러한 방법들을 통해 애플리케이션의 데이터 보안을 높이고, 사용자 정보를 안전하게 보호할 수 있습니다.

작성자: 이서아 [비회원] | 작성일자: 1년 전 2024-11-24 06:31:58
조회수: 150 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.