안드로이드 개발일기
[Firebase] AppCheck 적용하기 (Play Integrity) 본문
AppCheck
Firebase의 Storage, Realtime DB 등 api에 접근해야 하는 상황에서
승인되지 않은 클라이언트가 액세스하는 것을 방지하여 api 리소스를 보호합니다.
안드로이드에서는 PlayIntegrity, SafetyNet을 이용해 앱 체크를 적용할 수 있습니다.
SafetyNet은 deprecated 되었기 때문에, 여기서는 PlayIntegrity 사용을 설명하겠습니다.
Play Integrity
play integrity api는 사용자가 정품 android 기기에서, Google Play 등 정상적인 루트로
플레이 스토어의 서명이 된 정상적인 앱을 설치하여 실행한 것인지 확인합니다.
이 과정을 위해 플레이 콘솔에서 firebase 프로젝트 연결, firebase 콘솔에서 앱 등록, 마지막으로 코드 추가가 필요합니다.
1. Firebase 세팅
1-1. key 추가
SHA-256 key 를 추가합니다.
플레이 콘솔에서 확인할 수 있습니다.
1-2. 디버그 토큰 추가
앱 체크는 플레이 스토어의 사이닝을 받은 앱에서 동작하는데, 안드로이드 스튜디오에서 빌드할 때마다 플레이 콘솔에 등록할 수는 없습니다.
따라서 디버그 모드일 때는 디버그 토큰을 사용하여 앱 체크를 통과할 수 있게 코드를 추가해줘야 합니다.
토큰 생성을 통해 토큰을 발급받을 수 있습니다.
CustomAppCheckProviderFactory
class CustomAppCheckProviderFactory : AppCheckProviderFactory {
private val customProvider = CustomProvider()
private val backgroundPriorityThreadFactory = SimpleThreadFactory()
private val executor = ThreadPoolExecutor(
NUMBER_OF_CORES,
NUMBER_OF_CORES,
KEEP_ALIVE_TIME,
TimeUnit.SECONDS,
LinkedBlockingQueue(),
backgroundPriorityThreadFactory
)
override fun create(firebaseApp: FirebaseApp): AppCheckProvider {
return DebugAppCheckProvider(
firebaseApp,
customProvider,
executor,
executor,
executor
)
}
companion object {
private val instance = CustomAppCheckProviderFactory()
private const val NUMBER_OF_CORES = 2
private const val KEEP_ALIVE_TIME = 60L
@JvmStatic
fun getInstance(): CustomAppCheckProviderFactory {
return instance
}
}
}
internal class CustomProvider : Provider<InternalDebugSecretProvider> {
private val debugSecretProvider = CustomDebugSecretProvider()
override fun get(): InternalDebugSecretProvider {
return debugSecretProvider
}
}
internal class CustomDebugSecretProvider : InternalDebugSecretProvider {
override fun getDebugSecret(): String? {
return BuildConfig.APPCHECK_DEBUG_TOKEN
}
}
internal class SimpleThreadFactory : ThreadFactory {
override fun newThread(r: Runnable?): Thread {
return Thread(r)
}
}
MainApplication
Firebase.initialize(this)
Firebase.appCheck.installAppCheckProviderFactory(
if (BuildConfig.IS_DEBUG) {
PlayIntegrityAppCheckProviderFactory.getInstance()
} else {
CustomAppCheckProviderFactory.getInstance()
}
)
그리고 프로젝트에 해당 코드를 추가합니다.
이 코드는 앱이 디버그 모드인지 여부에 따라 Play Integrity api를 쓸 지, 디버그 토큰을 가지고 있는 CustomAppCheckProviderFactory를 쓸 지 결정합니다.
2. 플레이 콘솔 세팅
적용할 앱의 출시 섹션에서 설정 > 앱 무결성에 들어갑니다.
Integrity API 페이지의 프로젝트 연결에서 세팅한 firebase 프로젝트를 선택합니다.
(참고로 파이어베이스 소유자 계정으로 플레이 콘솔에서 세팅해야 정상 등록됩니다.)
'android' 카테고리의 다른 글
[TIL] Jetpack Compose remember와 rememberSavable (0) | 2025.04.01 |
---|---|
[WorkManager + Flow] doWork 후 flow의 onCompletion이 호출되지 않는다 (0) | 2024.05.03 |
[Android] PDF 로드 및 관리 with Compose (0) | 2024.03.23 |
[Clean Architecture] UseCase를 사용하는 이유 (0) | 2023.12.14 |
[Android] Retrofit multiple API 결합하기 (Flow combine 사용) (0) | 2023.09.12 |