본문 바로가기
Android/Android Core

[Android/Kotlin] EncryptedSharedPreferences 사용하기: 보안 강화된 데이터 저장 방법

by quessr 2024. 11. 8.

 

안드로이드 앱 개발 시, 간단한 데이터 저장을 위해 흔히 SharedPreferences를 사용합니다.

하지만 이 방식은 기본적으로 암호화되지 않은 데이터를 저장하므로 보안에 취약할 수 있습니다.

특히 사용자의 인증 토큰, 계정 정보와 같은 민감한 데이터를 다룰 때는 암호화가 필수적입니다.

여기서 EncryptedSharedPreferences가 유용하게 사용될 수 있습니다.

이번 글에서는 EncryptedSharedPreferences가 무엇인지, 왜 더 안전한지, 어떻게 사용하는지에 대해 다뤄보겠습니다.

 

1. EncryptedSharedPreferences란?

EncryptedSharedPreferences는 안드로이드에서 민감한 데이터를 안전하게 저장하기 위해 제공하는 암호화된 데이터 저장 방식입니다. 일반 SharedPreferences와 사용법은 비슷하지만, 데이터를 AES 암호화 방식으로 암호화하여 저장하므로 보안성이 크게 향상됩니다.

EncryptedSharedPreferences의 주요 특징:

  • AES 암호화: AES256_GCM 및 AES256_SIV와 같은 강력한 암호화 방식을 사용해 데이터를 보호합니다.
  • 마스터 키 관리: 암호화에 필요한 키는 안드로이드의 MasterKey 라이브러리를 사용해 안전하게 관리할 수 있습니다.
  • 간편한 사용법: 기존 SharedPreferences와 거의 동일한 방식으로 접근 가능하므로 쉽게 암호화된 데이터 저장을 구현할 수 있습니다.

2. SharedPreferences와의 차이점

기존 SharedPreferences는 데이터가 일반 텍스트로 저장됩니다. 따라서 기기가 루팅되거나 데이터가 외부에 노출될 경우, 저장된 정보가 쉽게 유출될 수 있는 위험이 있습니다. 반면 EncryptedSharedPreferences는 다음과 같은 장점이 있습니다:

  • 보안성 강화: EncryptedSharedPreferences는 저장되는 데이터가 AES256 암호화로 보호됩니다.
  • 내장 암호화 처리: 암호화 및 복호화 처리를 자동으로 수행하여, 개발자가 직접 암호화 로직을 구현할 필요가 없습니다.
  • 안드로이드의 안전한 키 관리: MasterKey 라이브러리를 통해 암호화 키를 안전하게 생성하고 관리할 수 있습니다.

3. EncryptedSharedPreferences 설정하기

먼저 EncryptedSharedPreferences를 사용하기 위해서는 프로젝트에 필요한 라이브러리를 추가해야 합니다.

 

Gradle 종속성 추가

dependencies {
    implementation 'androidx.security:security-crypto:1.1.0-alpha03'
}

 

4. EncryptedSharedPreferences 사용 예제

아래는 사용자 토큰과 UUID를 안전하게 저장하고 불러오는 예제 코드입니다.

object UserDataStore {
    private val TOKEN_KEY = "token"
    private val UUID_KEY = "uuid"
    private val PREFERENCE_NAME = "encrypted_preferences"

    private fun getSharedPreferences(context: Context): SharedPreferences {
        val masterKey = MasterKey.Builder(context)
            .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
            .build()

        return EncryptedSharedPreferences.create(
            context,
            PREFERENCE_NAME,
            masterKey,
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
        )
    }

    // 토근 저장하기
    fun saveToken(context: Context, token: String) {
        val sharedPreferences = getSharedPreferences(context)
        with(sharedPreferences.edit()) {
            putString(TOKEN_KEY, token)
            commit()
        }
    }

    // UUID 저장하기
    fun saveUUID(context: Context, uuid: String) {
        val sharedPreferences = getSharedPreferences(context)
        with(sharedPreferences.edit()) {
            putString(UUID_KEY, uuid)
            commit()
        }
    }

    // 토큰 가져오기
    fun getToken(context: Context): String {
        val sharedPreferences = getSharedPreferences(context)
        return sharedPreferences.getString(TOKEN_KEY, "") ?: ""
    }

    // UUID 가져오기
    fun getUUID(context: Context): String {
        val sharedPreferences = getSharedPreferences(context)
        return sharedPreferences.getString(UUID_KEY, "") ?: ""
    }

    // EncryptedSharedPreferences 제거하기
    fun removeToken(context: Context) {
        val sharedPreferences = getSharedPreferences(context)
        with(sharedPreferences.edit()) {
            remove(TOKEN_KEY)
            apply()
        }
    }
}

 

코드 설명:

  • 마스터 키 설정: MasterKey.Builder를 통해 암호화에 사용할 키를 생성합니다. 이 키는 안전하게 관리되며, AES256_GCM 방식으로 암호화됩니다.
  • EncryptedSharedPreferences 생성: EncryptedSharedPreferences.create() 메서드를 통해 암호화된 SharedPreferences 객체를 생성합니다.
  • 데이터 저장 및 조회: putString과 getString을 사용하여 데이터를 저장하고 불러올 수 있습니다. 이때 EncryptedSharedPreferences는 자동으로 데이터를 암호화하여 저장하고, 조회 시 복호화하여 제공합니다.

5. EncryptedSharedPreferences를 사용해야 하는 경우

보안을 중요하게 고려해야 하는 다음과 같은 상황에서 EncryptedSharedPreferences를 사용하는 것이 좋습니다.

  • 사용자 인증 토큰, 계정 정보 저장
  • 암호와 같은 민감 정보 저장
  • 기타 민감한 설정 데이터 관리


참고: https://developer.android.com/reference/androidx/security/crypto/EncryptedSharedPreferences 

 

EncryptedSharedPreferences  |  Android Developers

androidx.appsearch.builtintypes.properties

developer.android.com

 

반응형