# 영수증 확인

> 구매 영수증의 유효성을 검증하여 부정 행위를 방지하고 안전한 거래를 보장합니다.

구매 영수증은 성공적인 거래를 증명하는 데 사용되는 앱 스토어 안전한 디지털 기록입니다. 사용자가 구매를 완료하면 애플리케이션에 이 영수증이 제공됩니다.

Unity IAP는 상점별 페이로드와 상세한 거래 데이터가 포함된 통합된 영수증 구조를 제공합니다. 에서 `OnPurchasePending`를 `PendingOrder` 수신하면 부정 행위를 방지하기 위해 해당 를 확인해야 합니다. 이 프로세스를 거래 확인이라고 합니다.

## 영수증 구조##receipt-structure

Unity IAP는 다양한 스토어에 걸쳐 일관된 구조의 JSON 객체 영수증을 포맷합니다.

다음은 주요 필드입니다.

| Key             | 값                                                            |
| :-------------- | :----------------------------------------------------------- |
| `Store`         | 구매가 발생한 상점의 이름(예: `GooglePlay` 또는 `AppleAppStore`).          |
| `TransactionID` | 스토어에서 제공하는 이 거래의 고유 식별자입니다.                                  |
| `Payload`       | 스토어별 원시 영수증 데이터입니다. 이 필드는 거래 확인에 필요한 정보를 포함하므로 가장 중요한 필드입니다. |

## 거래 확인##transaction-verification

거래 확인을 통해 구매가 적합한지 확인합니다. 따라서 사용자는 실제로 구매한 콘텐츠에만 액세스할 수 있습니다.

검증을 통해 애플리케이션을 다음과 같은 일반적인 부정 행위 유형으로부터 보호할 수 있습니다.

* 가짜 영수증: 악의적인 사용자는 결제 없이 콘텐츠를 잠금 해제하기 위해 가짜 영수증을 생성하려고 시도할 수 있습니다.
* 리플레이 공격 사용자는 여러 계정에 유효한 단일 영수증을 재사용하거나 동일한 비소모품 아이템을 반복적으로 청구할 수 있습니다.

원본 앱 스토어 영수증을 확인하면 콘텐츠에 대한 액세스 권한을 부여하기 전에 거래가 정확하고 올바른 사용자와 제품과 연결되어 있는지 확인할 수 있습니다.

## 확인 방법##validation-methods

사용자의 디바이스(로컬 확인) 또는 자신이 제어하는 보안 서버(원격 확인)에서 영수증을 확인할 수 있습니다.

* 로컬 확인
  * 기기에서 직접 확인을 수행합니다.
  * 애플리케이션에 포함된 콘텐츠(예: 캐릭터 잠금 해제 또는 기능 활성화)에 적합합니다.
  * > **Important:**
    >
    > 악의적인 사용자가 자신의 디바이스의 코드를 더 쉽게 조작하여 확인을 우회할 수 있으므로 로컬 확인은 안전하지 않습니다.
  * > **Note:**
    >
    > 로컬 확인은 StoreKit 2에서 자동으로 수행됩니다.

* 원격(서버 측) 확인

  * 모든 거래에 권장되며, 가상 화폐 또는 다운로드 가능한 아이템을 허용하는 등 서버에서 제공되는 콘텐츠에 필수적입니다.
  * 앱이 백엔드 서버에 영수증 [`Payload`](https://docs.unity3d.com/Packages/com.unity.purchasing@latest?subfolder=/api/UnityEngine.Purchasing.UnifiedReceipt.html#UnityEngine_Purchasing_UnifiedReceipt_Payload)를 전송합니다.
  * 서버는 앱 스토어 확인 서비스(예: Apple 또는 Google)와 안전하게 통신하여 콘텐츠를 출시하기 전에 영수증의 유효성을 확인합니다.

  > **Note:**
  >
  > Unity IAP는 빌트인 원격 확인 서비스를 제공하지 않지만 직접 구현하거나 타사 솔루션을 사용할 수 있습니다.
  >
  > * Google 서버 측 확인을 위해 영수증 `Payload`를 사용합니다.
  > * Apple - : 전통적으로 영수증 `Payload`는 확인에 사용되었지만, 이 방법은 이제 Apple에서 지원이 중단되었습니다. 하지만 StoreKit 1에는 여전히 `Payload`가 필요하며 지금은 유지해야 합니다.
  > * Apple(새로운 메서드): 새 구현의 경우 서버 측 확인에 [`OrderInfo.Apple.jwsRepresentation`](https://docs.unity3d.com/Packages/com.unity.purchasing@latest?subfolder=/api/UnityEngine.Purchasing.IAppleOrderInfo.html#UnityEngine_Purchasing_IAppleOrderInfo_jwsRepresentation)를 사용합니다.

> **Note:**
>
> 가능한 한 빨리 StoreKit 1 영수증에서 [StoreKit 2 jwsRepresentation](https://developer.apple.com/documentation/storekit/verificationresult/jwsrepresentation-21vgo)으로 전환하여 신뢰성, 보안, 성능을 향상시키고 최종적으로 사용자에게 더 나은 경험을 제공합니다.

> **Note:**
>
> 서버 측 확인을 위해 [OrderInfo.Apple.jwsRepresentation](https://docs.unity3d.com/Packages/com.unity.purchasing@latest?subfolder=/api/UnityEngine.Purchasing.IAppleOrderInfo.html#UnityEngine_Purchasing_IAppleOrderInfo_jwsRepresentation)을 사용합니다.
