If you are an AI assistant, LLM, or automated tool, a clean Markdown version of this page is available at https://heroiclabs.com/docs/kr/nakama/concepts/iap-validation/llm.md — optimized for AI and LLM tools.
수익 창출 모델 및 도구의 범위는 광고 지원, 소액 결제, 프리미엄, 일회성 구매 및 이들 사이에서 매우 다양합니다. 이러한 솔루션에서 핵심 도구는 인앱 구매(IAP)입니다. IAP를 통해 잠금 해제, 게임 내 소모품, 프리미엄 액세스 구독 등을 위한 단일 구매가 가능합니다.
가장 일반적인 인앱 구매 구현을 쉽게 공격할 수 있는 경우가 매우 많습니다. 일반적으로 다음과 같은 사항에 중점을 둡니다.
성공을 나타내는 클라이언트 가짜 구매 응답 제공
유효한 구매 응답을 여러 번 재생
구매 응답을 다른 클라이언트와 공유하여 여러 플레이어가 단일 구매를 통해 보상 받기
인앱 구매를 위해서는 신뢰할 수 있는 출처가 필요합니다. Nakama는 구매 및 구매 내역을 확인하고 추적하여 다음과 같은 상당한 취약점 및 문제점을 해결합니다.
Issue
Description
Fake Purchases
Nakama는 Apple, Google 및 Huawei 서비스에 직접 연결하여 들어오는 모든 구매 영수증의 유효성을 확인합니다. 이 확인은 완전히 클라이언트 코드 외부에 있으며, 이를 사용해 가로채거나 변조할 수 없습니다. 모든 구매 영수증은 매번 확인되며 유효하지 않은 영수증은 거부됩니다.
Replay Attacks
모든 트랜잭션이 기록되어 동일한 구매 토큰이나 영수증을 여러 번 제출하지 못하게 됩니다.
Receipt Sharing
성공적인 트랜잭션은 해당 트랜잭션을 제출하는 계정에 바인딩됩니다. 유효한 트랜잭션이라도 서로 다른 사용자가 관련 보상을 받으려고 똑같은 트랜잭션을 제출할 수는 없습니다.
Product Mismatches
검증된 각 구매 영수증은 구매와 제품의 연계에 사용할 수 있는 데이터(예: 제품 ID)를 노출하므로, 유효한(저렴한) 구매를 사용해 다른(값비싼) 보상을 받아내려는 공격이 방지됩니다.
Single Source of Truth
Nakama가 모든 트랜잭션의 내부 기록을 유지하는 동안, 검증을 위해 항상 원격 결제 공급자를 사용합니다.
인앱 구매 인증은 플랫폼에 관계없이 Apple, Google 및 Huawei 구매에 사용할 수 있습니다. 단일 제품 및 구독 구매가 모두 지원됩니다.
Apple은 하나의 영수증에 여러 구매를 포함할 수 있으므로 결과 목록의 인증된 각 구매에는 인증된 구매와, 이전에 확인되었는지 여부를 나타내는 boolean 값만 포함됩니다. 이전에 Nakama에 의해 구매가 이미 인증된 경우 “이전 확인” 값은 개발자가 새로운 구매를 구별하고 재생 공격으로부터 보호할 수 있도록 true이(가) 됩니다.
Google 및 Huawei의 경우, 각 인증은 단일 구매에 해당하며 인증 응답 목록에 포함되며 위와 같이 “이전 확인” 값도 있습니다.
인증된 각 구매에는 개발자가 어떤 이유로든 필요로 하는 경우 공급자 인증 응답의 페이로드도 포함됩니다.
구매/영수증이 유효하지 않거나 어떤 이유로든 인증하지 못하거나 공급자에게 연결할 수 없으면 오류가 반환됩니다.
localfunctionvalidate_receipt(receipt)localresult=client.validate_purchase_apple(receipt)ifresult.errorthenprint(result.message)returnendpprint(result)end-- Use https://defold.com/extension-iap/iap.set_listener(function(self,transaction,error)ifnoterrorthenvalidate_receipt(transaction.receipt)endend)iap.buy("com.defold.nakama.goldbars-10")
해당 값을 iap.google.client_email 및 iap.google.private_key에 대한 각각의 Nakama 구성 값으로 설정합니다.
마지막으로 구매 인증 API에 대한 액세스 권한을 Nakama에 부여해야 합니다. Google Play 개발자 콘솔에서 설정 > API 액세스로 이동합니다:API 액세스 생성
이전 단계에서 만든 서비스 계정이 위에 나열되어야 합니다. 서비스 계정에 대한 액세스 권한을 부여하여 API에 액세스하고 서비스 계정에 가시성, 재무 데이터 보기 및 주문 관리에 대한 액세스 권한을 부여해야 합니다. 이러한 권한은 Nakama가 Google Play에 대한 영수증 인증에 필요합니다.액세스 부여
사용자 및 권한으로 이동하여 서비스 계정이 올바르게 설정되었는지 확인합니다.액세스 권한이 있는 사용자 나열
localfunctionvalidate_receipt(receipt)localresult=client.validate_purchase_google(receipt)ifresult.errorthenprint(result.message)returnendpprint(result)end-- Use https://defold.com/extension-iap/iap.set_listener(function(self,transaction,error)ifnoterrorthenvalidate_receipt(transaction.receipt)endend)iap.buy("com.defold.nakama.goldbars-10")
Nakama는 IAP 인증 서비스를 기준으로 Huawei 구매를 인증합니다. Huawei에서 제안한 바와 같이 Huawei 서비스에 연락하기 전에 제공된 서명에 대해 구매 데이터의 유효성도 확인됩니다. 어떤 이유로든 데이터가 유효하지 않은 경우 Huawei의 인증 서비스에서 인증하기 전에 구매는 거부됩니다.
typeunityIAPstruct{Payloadstring`json:"Payload"`Storestring`json:"Store"`TransactionIDstring`json:"TransactionID"`}switchunityIAP.Store{case"GooglePlay":validatedReceipt,err=nk.PurchaseValidateGoogle(ctx,userID,wrapper.Payload)case"AppleAppStore":validatedReceipt,err=nk.PurchaseValidateApple(ctx,userID,wrapper.Payload)default:logger.Warn("Unrecognised store type in Unity IAP.")returnErrBadInput}iferr!=nil{iferr==runtime.ErrPurchaseReceiptAlreadySeen{logger.WithField("err",err).Warn("Receipt replay attack.")}else{logger.WithField("err",err).Error("Receipt validation error.")}returnErrBadInput}