안드로이드 앱의 수익화(인앱 결제, 정기 구독)는 SDK 연동만으로 끝나지 않는다.
운영에서 중요한 건 검증 신뢰성, 실시간성, 위조 방어다.
이 글은 Google Play Console + GCP + Pub/Sub 설정에 더해, 최근 실제 운영에서 필요한 보안 설정까지 포함한다.
전체 구조도
- GCP Service Account: 서버가 Google API로 영수증 검증
- Play Console: 앱/상품/RTDN 연동
- Pub/Sub: 결제 이벤트 실시간 전달
- 서버 Webhook: secret 검증 후 처리
- DLQ: 실패 메시지 격리
- AdMob SSV: 서명 검증 후 보상 지급
Step 1. GCP 프로젝트 및 API 활성화
- Google Cloud Console 접속
- API 및 서비스 > 라이브러리
Google Play Android Developer API검색- 사용(Enable)
Step 2. 서비스 계정 생성 + JSON 키 발급
- IAM 및 관리자 > 서비스 계정
- 서비스 계정 생성
- 키 탭 > 새 키 만들기 > JSON
- JSON 파일을 백엔드 서버에 안전하게 전달
Step 3. Play Console에 서비스 계정 권한 부여
- Play Console > 사용자 및 권한
- 새 사용자 초대
- 서비스 계정 이메일(
...iam.gserviceaccount.com) 입력 - 대상 앱 선택
- 필수 권한:
금융 데이터 보기,주문 관리 - 초대 완료
Step 4. Pub/Sub Topic 생성
- GCP > Pub/Sub > 주제
- 주제 만들기
- 예시:
payment(기존play-billing-topic써도 됨) - 주제 권한에 아래 주체 추가
- 주체:
google-play-developer-notifications@system.gserviceaccount.com - 역할:
Pub/Sub Publisher
Step 5. RTDN Push 구독 생성 (중요)
- Pub/Sub > 구독 > 구독 만들기
- 구독 ID:
play-billing-sub - 주제:
payment - 전송 유형:
Push - 엔드포인트 URL:
https://api.yourdomain.com/public/iap/webhooks/google?secret=<IAP_WEBHOOK_SECRET> 인증 사용 설정: 끔 (현재 서버는 OIDC 토큰 검증 대신 secret 검증 사용)페이로드 래핑 해제: 끔 (서버가message.data형식 기대)- 재시도 정책:
지수 백오프권장 (최소 10초, 최대 600초) - 만료 기간:
만료되지 않음
Step 6. DLQ(데드 레터) 구성 (운영 권장)
6-1. DLQ Topic 생성
- 주제 ID:
payment-dead-letter - 기본 구독 추가: 끔
6-2. DLQ Subscription 생성
- 구독 ID:
payment-dead-letter-sub - 전송 유형:
Pull - 만료 기간:
만료되지 않음 - 필터/변환/순서/1회전송: 모두 끔
- 데드레터 처리: 끔 (DLQ 구독에 또 DLQ 걸지 않음)
6-3. 원본 구독에 DLQ 연결
play-billing-sub수정- 데드 레터 처리: 켬
- 데드 레터 주제:
payment-dead-letter - 최대 전달 시도:
20
6-4. 권한 경고 뜨면
play-billing-sub > 데드 레터 처리 탭에서 아래 버튼 실행:
- 게시자 역할 부여
- 구독자 역할 부여
Step 7. Play Console에 RTDN Topic 연결
- Play Console > 수익 창출 설정
- 실시간 개발자 알림
- 주제 입력:
projects/{PROJECT_ID}/topics/payment - 테스트 알림 전송
- 저장
Step 8. 상품 등록
- Play Console > 수익 창출 > 제품(인앱/구독)
- 상품 생성
- 제품 ID 입력 (불변)
- 가격/설명 입력 후 활성화
Step 9. 서버 환경변수 (보안 업데이트 반영)
ENV=prod
IAP_WEBHOOK_SECRET=<랜덤 긴 값>
GOOGLE_IAP_WEBHOOK_SECRET=<선택>
APPLE_IAP_WEBHOOK_SECRET=<선택>
ADMOB_SSV_VERIFY_ENABLED=true
ADMOB_VERIFIER_KEYS_URL=https://www.gstatic.com/admob/reward/verifier-keys.json
ALLOW_UNVERIFIED_APPLE_JWS_RECEIPT=false핵심:
- 운영에서
ALLOW_UNVERIFIED_APPLE_JWS_RECEIPT=false고정 - Apple/Google Webhook은 secret 일치해야 수신 허용
- AdMob 보상 콜백은 SSV 서명 검증 통과 시에만 지급
Step 10. Apple/AdMob 엔드포인트
- Apple Server Notifications URL:
https://api.yourdomain.com/public/iap/webhooks/apple?secret=<IAP_WEBHOOK_SECRET> - AdMob SSV callback URL:
https://api.yourdomain.com/public/tokens/admob/callback - AdMob은
signature,key_id를 서버에서 검증
운영 체크리스트 (최종)
- Google Play Android Developer API 활성화
- 서비스 계정 JSON 발급 및 서버 적용
- Play Console 권한(금융 데이터 보기, 주문 관리) 부여
- RTDN Topic 연결 + 테스트 전송 성공
- Push 구독 endpoint에
?secret=적용 - DLQ Topic/Subscription 생성
- 원본 구독에 DLQ 연결 + max attempts 설정
- Webhook secret env 설정 완료
-
ALLOW_UNVERIFIED_APPLE_JWS_RECEIPT=false확인 - AdMob SSV 서명 검증 활성화 확인
