SafetyNet Attestation API에서 이전

이미 신뢰할 수 있는 서버를 사용하여 응답을 확인하고 있다면 SafetyNet Attestation API에서 Play Integrity API로 간단하게 이전할 수 있습니다. Play Integrity API는 라이선스 확인 라이브러리(LVL)에서 실행되는 것과 같이 AIDL을 통해 Play 스토어 앱에서 직접 실행되는 앱 라이선스 확인을 대체할 수도 있습니다. 필요한 변경사항은 대부분 Play Integrity 응답 토큰을 읽고 분석해야 하는 신뢰할 수 있는 서버 측에 있습니다. 이전하는 동안 아직 업데이트되지 않은 이전 클라이언트를 지원하도록 애플리케이션과 서버가 모두 두 API를 동시에 지원해야 합니다.

앱에서 SafetyNet Attestation API의 증가된 할당량 한도를 부여받은 경우 Play Integrity API에 할당된 사용 등급을 확인하고 필요한 경우 높은 등급으로 이동하도록 요청해야 합니다.

Play Integrity API를 지원하려면 다음 변경사항이 필요합니다.

Android 클라이언트

  • 코드가 올바른 형식의 nonce를 IntegrityTokenRequest 빌더에 전달하는지 확인합니다.
    • String(바이트 배열 대신)
    • URL 안전
    • Base64로 인코딩되고 래핑되지 않음
    • 최소 16자(영문 기준)
    • 최대 500자(영문 기준)
  • 재시도 로직을 검토하고 애플리케이션이 오류를 적절하게 처리하는지 확인합니다.
  • 신뢰할 수 있는 서버로 전송된 응답 데이터가 SafetyNet Attestation API 응답과 Play Integrity API 응답을 구별하도록 허용하는지 확인합니다.

신뢰할 수 있는 서버

  • nonce 생성 로직을 검토하여 Play Integrity API 요구사항을 충족하는지 확인합니다.
  • 서버 코드가 SafetyNet Attestation API 응답과 Play Integrity API 응답을 구별할 수 있는지 확인합니다. 코드가 이러한 응답을 올바르게 파싱하고 검증하는지 확인합니다.
  • Play Integrity API 응답을 검증하고 파싱하는 로직을 추가합니다.
  • 새로운 Play Integrity API 응답은 추가 세부정보를 제공하므로 의사 결정 로직과 클라이언트 기기로 다시 전송되는 피드백 데이터를 개선해야 할 수 있습니다. 자세한 내용은 이 주제 내의 API 응답 매핑 섹션을 참고하세요.

nonce 인코딩

무결성 관련 nonce는 Base64로 인코딩되고, URL 안전성을 가지며, 래핑되지 않은 String으로 Play Integrity API에 전달되어야 합니다. 이 형식은 byte[]가 필요한 SafetyNet Attestation API와 다릅니다.

  • 'URL 안전'은 Base64의 'URL 및 파일 이름 안전' 변형(RFC 4648 섹션 5 참고)을 사용함을 의미합니다. 여기서 '-' 및 '_'는 '+' 및 '/' 대신 사용됩니다. Base64 인코딩에 관한 자세한 내용은 RFC 4648을 참고하세요.
  • '래핑되지 않음'은 모든 줄 마침 표시를 생략하는 것을 의미합니다. 즉, 출력이 긴 한 줄입니다.
.setNonce(Base64.encodeToString(NONCE_BYTES,
        Base64.URL_SAFE | Base64.NO_WRAP))

또한 nonce 생성이 Play Integrity API 가이드라인과 일치하는지 확인합니다.

API 응답 매핑

다음 표에서는 SafetyNet Attestation API 필드를 상응하는 Play Integrity API와 매핑합니다.

SafetyNet Attestation API Play Integrity API 참고
timestampMs requestDetails.timestampMillis
nonce requestDetails.nonce
apkPackageName appIntegrity.packageName
apkCertificateDigestSha256 appIntegrity.certificateSha256Digest appRecognitionVerdictPLAY_RECOGNIZED로 설정되어 있는지 확인합니다.
ctsProfileMatch deviceIntegrity.deviceRecognitionVerdict에 결합되었습니다.
basicIntegrity deviceIntegrity.deviceRecognitionVerdict에 결합되었습니다.
evaluationType deviceIntegrity.deviceRecognitionVerdict에 결합되었습니다.
advice Not available
error Not available 기기 무결성 라벨 목록은 비어 있습니다.

기기 무결성 확인 결과 매핑

SafetyNet Attestation API Play Integrity API
ctsProfileMatch basicIntegrity evaluationType deviceRecognitionVerdict
FALSE FALSE 라벨 없음
FALSE TRUE MEETS_BASIC_INTEGRITY
TRUE FALSE 라벨 없음
TRUE TRUE BASIC MEETS_DEVICE_INTEGRITY, MEETS_BASIC_INTEGRITY
TRUE TRUE HARDWARE_BACKED MEETS_STRONG_INTEGRITY, MEETS_DEVICE_INTEGRITY, MEETS_BASIC_INTEGRITY

애플리케이션에서 복잡한 시행 전략을 사용하고 가능한 모든 값이 필요한 경우 기기 무결성 응답 집합을 구성해야 할 수 있습니다.

Play Integrity API 재시도 로직

특정 오류 코드가 발생하면 앱에서 API 호출을 다시 시도해야 합니다. 모든 오류 코드를 검토했는지 확인하고 필요한 경우 애플리케이션이 지수 백오프로 다시 시도하도록 합니다. 기기 및 애플리케이션 무결성을 평가하는 데 충분한 시간을 API에 제공하도록 최소 지연이 5초 이상이고 기하급수적으로 증가(5초, 10초, 20초, 40초 등)하는지 확인합니다.

선택적 App Licensing API 교체

App Licensing API를 사용하는 경우 Play Integrity API 토큰에 애플리케이션의 라이선스 정보가 포함되어 있으므로 선택적으로 Play Integrity API를 사용하도록 이전할 수 있습니다. SafetyNet Attestation API 이전과 마찬가지로 많은 기기에서 이전 버전의 애플리케이션을 유지한다고 예상해야 합니다. 신뢰할 수 있는 서버는 App Licensing API 응답과 Play Integrity API 응답을 모두 처리할 수 있어야 합니다.

전체 서비스 종료 시까지 응답 받기

이전 기한(2024년 1월 31일)까지 Play Integrity API로 이전하거나 SafetyNet Attestation을 삭제하지 않았다면 이 양식을 작성하여 연장을 요청할 수 있습니다. 연장이 승인되면 앱은 전체 서비스 종료 기한(2025년 1월 31일)까지 SafetyNet Attestation으로부터 응답을 계속 받게 됩니다.