Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

안드로이드 개발일기

[Firebase] AppCheck 적용하기 (Play Integrity) 본문

android

[Firebase] AppCheck 적용하기 (Play Integrity)

lolvlol 2024. 9. 7. 12:38

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 프로젝트를 선택합니다.

(참고로 파이어베이스 소유자 계정으로 플레이 콘솔에서 세팅해야 정상 등록됩니다.)

Comments