2025년 11월 10일
5

[Android] 인앱 결제 완벽 도입 가이드: GCP, Console, Pub/Sub 필수 세팅 총정리

서비스 운영
KKingmo

Changmo Oh

@KKingmo

전체 글 보기

안드로이드 앱의 수익화(인앱 결제, 정기 구독)는 SDK 연동만으로 끝나지 않는다.
운영에서 중요한 건 검증 신뢰성, 실시간성, 위조 방어다.
이 글은 Google Play Console + GCP + Pub/Sub 설정에 더해, 최근 실제 운영에서 필요한 보안 설정까지 포함한다.

전체 구조도

  1. GCP Service Account: 서버가 Google API로 영수증 검증
  2. Play Console: 앱/상품/RTDN 연동
  3. Pub/Sub: 결제 이벤트 실시간 전달
  4. 서버 Webhook: secret 검증 후 처리
  5. DLQ: 실패 메시지 격리
  6. AdMob SSV: 서명 검증 후 보상 지급

Step 1. GCP 프로젝트 및 API 활성화

  1. Google Cloud Console 접속
  2. API 및 서비스 > 라이브러리
  3. Google Play Android Developer API 검색
  4. 사용(Enable)

Step 2. 서비스 계정 생성 + JSON 키 발급

  1. IAM 및 관리자 > 서비스 계정
  2. 서비스 계정 생성
  3. 키 탭 > 새 키 만들기 > JSON
  4. JSON 파일을 백엔드 서버에 안전하게 전달

Step 3. Play Console에 서비스 계정 권한 부여

  1. Play Console > 사용자 및 권한
  2. 새 사용자 초대
  3. 서비스 계정 이메일(...iam.gserviceaccount.com) 입력
  4. 대상 앱 선택
  5. 필수 권한: 금융 데이터 보기, 주문 관리
  6. 초대 완료

Step 4. Pub/Sub Topic 생성

  1. GCP > Pub/Sub > 주제
  2. 주제 만들기
  3. 예시: payment (기존 play-billing-topic 써도 됨)
  4. 주제 권한에 아래 주체 추가
  5. 주체: google-play-developer-notifications@system.gserviceaccount.com
  6. 역할: Pub/Sub Publisher

Step 5. RTDN Push 구독 생성 (중요)

  1. Pub/Sub > 구독 > 구독 만들기
  2. 구독 ID: play-billing-sub
  3. 주제: payment
  4. 전송 유형: Push
  5. 엔드포인트 URL:
    https://api.yourdomain.com/public/iap/webhooks/google?secret=<IAP_WEBHOOK_SECRET>
  6. 인증 사용 설정: 끔 (현재 서버는 OIDC 토큰 검증 대신 secret 검증 사용)
  7. 페이로드 래핑 해제: 끔 (서버가 message.data 형식 기대)
  8. 재시도 정책: 지수 백오프 권장 (최소 10초, 최대 600초)
  9. 만료 기간: 만료되지 않음

Step 6. DLQ(데드 레터) 구성 (운영 권장)

6-1. DLQ Topic 생성

  1. 주제 ID: payment-dead-letter
  2. 기본 구독 추가: 끔

6-2. DLQ Subscription 생성

  1. 구독 ID: payment-dead-letter-sub
  2. 전송 유형: Pull
  3. 만료 기간: 만료되지 않음
  4. 필터/변환/순서/1회전송: 모두 끔
  5. 데드레터 처리: 끔 (DLQ 구독에 또 DLQ 걸지 않음)

6-3. 원본 구독에 DLQ 연결

  1. play-billing-sub 수정
  2. 데드 레터 처리: 켬
  3. 데드 레터 주제: payment-dead-letter
  4. 최대 전달 시도: 20

6-4. 권한 경고 뜨면

play-billing-sub > 데드 레터 처리 탭에서 아래 버튼 실행:

  1. 게시자 역할 부여
  2. 구독자 역할 부여

Step 7. Play Console에 RTDN Topic 연결

  1. Play Console > 수익 창출 설정
  2. 실시간 개발자 알림
  3. 주제 입력: projects/{PROJECT_ID}/topics/payment
  4. 테스트 알림 전송
  5. 저장

Step 8. 상품 등록

  1. Play Console > 수익 창출 > 제품(인앱/구독)
  2. 상품 생성
  3. 제품 ID 입력 (불변)
  4. 가격/설명 입력 후 활성화

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

핵심:

  1. 운영에서 ALLOW_UNVERIFIED_APPLE_JWS_RECEIPT=false 고정
  2. Apple/Google Webhook은 secret 일치해야 수신 허용
  3. AdMob 보상 콜백은 SSV 서명 검증 통과 시에만 지급

Step 10. Apple/AdMob 엔드포인트

  1. Apple Server Notifications URL:
    https://api.yourdomain.com/public/iap/webhooks/apple?secret=<IAP_WEBHOOK_SECRET>
  2. AdMob SSV callback URL:
    https://api.yourdomain.com/public/tokens/admob/callback
  3. 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 서명 검증 활성화 확인