배경
모바일 리워드 앱은 사용자 보상 구조상 “정상 사용자 vs 자동화/매크로/다계정 유저 등의 어뷰저” 간의 싸움이 항상 존재한다.
특히 글로벌 시장(예: 미국, 캐나다 등)에서는
한국과 달리 본인 인증 수단이 약하기 때문에 디바이스 단위의 보안 중요하다.
구글 Play Integrity API는 구글에서 제공하는 안드로이드 보안 도구로, 앱과 디바이스의 무결성을 확인해 악성 사용자(루팅 디바이스, 클론 앱 사용자 등)를 식별하고 차단하는 데 활용할 수 있다.
서비스에 이 API를 어떻게 활용해 어뷰저를 차단하고, 어떤 값들을 어떤 방식으로 활용할 수 있는지 알아보자.
Play Integrity API란?
Play Integrity API는 사용자의 디바이스와 앱이 정상적인 환경에서 실행되고 있는지 확인할 수 있도록 구글이 제공하는 보안 API이다.
디바이스 루팅 여부, 앱 위변조, 인증 상태 등을 체크할 수 있으며, 클라이언트가 발급한 토큰을 서버에서 검증하는 구조입니다.
주요 기능
- 디바이스 무결성 검사 (루팅, 에뮬레이터 등)
- 앱 무결성 검사 (APK 위변조, 비공식 설치 등)
- 앱 라이선스 상태 확인
- 요청 유효성 검증 (nonce, timestamp)
사용 흐름 요약
- 클라이언트 앱에서 integrityToken을 생성
- 해당 토큰을 백엔드 서버에 전달
- 서버는 Google API에 토큰 검증 요청
- Google이 반환한 Payload(JSON) 을 바탕으로 유저 차단 여부 판단
응답 Payload 주요 프로퍼티
1. deviceIntegrity
디바이스의 무결성 수준
각 값의 의미
| MEETS_DEVICE_INTEGRITY | 정상 디바이스 (루팅/에뮬 아님) |
| MEETS_BASIC_INTEGRITY | 기본 무결성은 충족 (루팅 추정됨) |
| NO_INTEGRITY | 루팅/에뮬레이터/위조 환경일 가능성 높음 |
2. appIntegrity
앱의 설치 상태 및 서명 정보
각 값의 의미
| PLAY_RECOGNIZED | Play 서명으로 설치된 앱 |
| UNRECOGNIZED_VERSION | 비공식 빌드 or 변경된 APK |
| UNEVALUATED | 평가 불가 (일시적 오류) |
3. accountDetails.appLicensingVerdict
앱 라이선스 검증 결과
각 값의 의미
| LICENSED | 정상 사용자 |
| UNLICENSED | Play Store 외부 설치 사용자 (불법 복제 가능성 포함) |
| UNKNOWN | 평가 불가 |
4. requestDetails
요청의 상세 정보
- requestPackageName: 클라이언트에서 설정한 패키지명
- nonce: 요청 위변조 방지를 위한 임의 문자열
- timestampMillis: 토큰 발급 시각 (UTC)
실무 적용 시 고려할 것들
1. 어떤 시점에 API를 호출할 것인가?
- 로그인 시점 또는 앱 실행 초기
- 너무 잦은 호출은 비용 낭비
- 신뢰 수준 높은 시점에 1회 호출하는 것이 일반적
2. 차단 기준 설정하기
예시:
if (
response.deviceIntegrity.includes("NO_INTEGRITY") ||
response.appIntegrity === "UNRECOGNIZED_VERSION"
) {
blockUser("Integrity policy violation")
}
블락 외에도 모니터링, 기능 제한, 추가 인증 요구 등 유연한 대응이 가능
3. 비용 정책
- 계정별 일일 무료 호출 한도가 정해져 있음
- 초과 시 비용 청구됨
4. 보안 강화 팁
- nonce는 서버에서 생성하여 클라이언트에 전달 (Replay 방지)
- 결과 토큰은 반드시 서버에서 검증
- 검증 실패 시(유효하지 않거나 디코드 불가) → 차단 or 로깅
흔한 실수 & 주의사항
| 클라이언트에서만 검증 | 무의미. 반드시 서버에서 검증해야 함 |
| nonce를 사용하지 않음 | 동일 토큰 재사용 가능성 생김 |
| 결과 로그 저장 안 함 | 분석/이슈 대응 시 어려움 |
| 모든 NO_INTEGRITY를 블락 | 오탐 가능성 있음 (기업용 디바이스, 일부 개발자 환경 등) |
테스트 방법
- 루팅된 디바이스, 에뮬레이터, 클론 앱 등 다양한 환경에서 테스트 필요
- Play Integrity 응답은 Google 서버에서 평가되므로, 일부 결과는 수 분 지연 가능
분석에 활용 가능한 항목
- 일일 무결성 실패율 (NO_INTEGRITY 비율)
- 앱 무결성 위반률 (UNRECOGNIZED_VERSION)
- requestHash, IP, Device ID 기반 다계정 시도 탐지
- Integrity 응답 결과 기반 사용자 클러스터링
참고 자료
Play Integrity API 개요 | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. Play Integrity API 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Play Integrity API를 사용하면 사용자
developer.android.com