> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 기본 DRM 및 라이선스 검사

> PC 타이틀이 불법 복제를 방지하고 게임이 유효한 라이선스로 실행되도록 하기 위해 취해야 할 고려 사항 및 예방 조치에 대해 설명합니다.

Microsoft Store를 통해 배포된 게임이 실행되면 Microsoft Store 라이선스 시스템이 라이선스 검사를 수행합니다. OS는 사용자가 직접 소유권, [공유 라이선스](/publishing/xstore-commerce/xstore-product-sharing) 또는 디스크 라이선스(XBOX 콘솔에만 해당)를 포함한 유효한 제품 라이선스를 가지고 있지 않는 한 게임을 실행하지 않습니다. 그러나 PC에서는 사용자가 유효한 라이선스를 얻은 후 콘텐츠를 쉽게 복호화하고 Microsoft Store의 컨텍스트 외부에서 실행하고 다른 사람들과 공유할 수 있으며 Microsoft Store 라이선스 시스템을 우회할 수 있습니다. 따라서 이러한 동작으로부터 보호하려는 모든 PC 게임에 기본 라이선스 검사를 추가하는 것이 좋습니다.

## 디지털 저작권 관리(DRM) 보호 수준

PC의 Microsoft Store 라이선스 시스템은 가장 기본적인 공격만 방어합니다. 보호가 필요한 콘텐츠에 대해서만 이 시스템에 의존해서는 안 됩니다. 다음은 보다 고급 공격에 대한 보호 계층을 추가할 수 있는 몇 가지 단계입니다.

1. 게임 시작 시 게임에서 시작한 라이선스 검사
2. 게임의 라이선스 검사에 대한 변조 방지 보호
3. [라이선스 토큰](/publishing/xstore-commerce/xstore-license-tokens)을 사용한 서비스 측 라이선스 확인

### 기본 라이선스 검사

최소한 DRM 보호가 필요한 모든 게임에 대해 기본 라이선스 검사를 추가하는 것이 좋습니다. 다음 코드 예제는 다른 Gaming Runtime 관련 API 호출을 사용하지 않더라도 이 검사를 수행하는 기본 구현을 보여줍니다. 시작 경로에 코드를 추가하고 라이선스 검사 실패 시 표시되는 특정 UI를 추가할 수 있습니다.

```cpp theme={null}
void CALLBACK LicenseCheck(XAsyncBlock *async)
{
    XStoreGameLicense license;
    HRESULT hr = XStoreQueryGameLicenseResult(async, &license);
    if (SUCCEEDED(hr))
    {
        if (!license.isActive)
        {
            // Failed to retrieve a license
            // Consider the title to be unlicensed
        }
        else
        {
            if (license.isTrial)
            {
                // Validated that the user has a trial license
                // Check additional attributes to ensure active trial
                // See "Implementing Trials for your game"
            }
            else
            {
                // Validated that the user has a real license
                // Consider the title to be licensed and continue
            }
        }
    }
    else
    {
        // Failed to retrieve a license
        // Consider the title to be unlicensed
    }

    delete async;
}

void CheckLicense()
{
    auto async = new XAsyncBlock{};
    async->context = this;
    async->queue = m_asyncQueue;
    async->callback = LicenseCheck;

    HRESULT hr = XStoreQueryGameLicenseAsync(
        storeContext,
        async);

    if (FAILED(hr))
    {
        // StoreContext may be invalid
        // If loose deployed or side-loaded package, check that the game configured to be licensed
        // See "Enabling XStore development and testing"

        delete async;
    }
}
```

<Note>
  XBOX Game Pass를 통해 부여된 라이선스는 구매한 라이선스와 마찬가지로 `isActive = true`를 반환합니다. [XStoreGameLicense](/reference/system/xstore/structs/xstoregamelicense) 구조체에는 라이선스 획득 방식을 식별하는 필드가 포함되어 있지 않으므로, 클라이언트 라이선스 검사로는 Game Pass 액세스와 직접 구매를 구분할 수 없습니다. 이를 구분하려면 [서비스에서 XBOX Game Pass 구독 액세스 감지](/publishing/xstore-commerce/xstore-detecting-game-pass)에 설명된 서비스 측 쿼리를 사용하세요.
</Note>

### 비Microsoft 변조 방지 보호

기본 라이선스 검사 예제는 어느 정도 보호를 제공하지만 공격자가 이 검사를 우회하도록 게임 실행 파일을 수정하여 이 유형의 보호를 우회하는 것은 흔한 일입니다. 따라서 게임을 보호하기 위한 다음 단계는 이러한 공격 경로를 차단하기 위해 비Microsoft 변조 방지 제품을 사용하는 것입니다. GDK PC 게임용으로 사용할 수 있는 옵션이 있습니다. 이 보호를 게임에 통합하는 방법에 대한 자세한 지침은 변조 방지 공급업체와 함께 진행하세요.

### 서비스 측 라이선스 확인

변조 방지 보호는 출시 시점의 타이틀을 보호하는 데 효과적이지만 결국에는 많은 경우 우회됩니다. 한 단계 더 나아가려면 온라인 지원 게임은 서비스 측 라이선스 확인 검사를 수행하고 많은 클라이언트 측 공격을 차단할 수 있습니다. 자세한 내용은 [라이선스 토큰 개요](/publishing/xstore-commerce/xstore-license-tokens)를 참고하세요.

기본 개요는 다음과 같습니다.

1. 게임 서비스는 게임 클라이언트에 라이선스 토큰을 요청하며 해당 고유 요청을 나타내는 게임 서비스에서 생성한 GUID를 포함합니다.
2. 클라이언트는 클라이언트 API [XStoreQueryLicenseTokenAsync](/reference/system/xstore/xstore_members)를 호출합니다.
3. API는 라이선스 서비스를 호출하고 해당 사용자에게 라이선스를 반환해야 하는지 여부를 결정합니다.
4. API가 유효한 라이선스를 얻을 수 있는 경우 서비스에서 제공한 세션 식별자가 포함된 서명된 라이선스 토큰이 반환됩니다.
5. 클라이언트는 라이선스 토큰을 다시 게임 서비스로 전달합니다.
6. 게임 서비스는 서명을 검증하여 라이선스가 Microsoft Store에서 온 것이며 수정되지 않았음을 확인합니다.
7. 그런 다음 게임 서비스는 세션 GUID가 1단계에서 클라이언트에 전달된 것과 일치하는지 확인합니다.
8. 그 후 게임 서비스는 토큰의 라이선스 정보가 유효하다고 신뢰할 수 있습니다.

이 기법은 온라인 상태에서만 작동하며 게임이 자체 서비스를 갖추어야 합니다. 현재 사용 가능한 가장 높은 수준의 보호를 제공합니다.

## 참조 API 문서

* [XStore (API 내용)](/reference/system/xstore/xstore_members)
  * 함수
    * [XStoreQueryLicenseTokenAsync](/reference/system/xstore/xstore_members)

## 참조

[PC 지원 타이틀 관련 커머스 정보](/publishing/xstore-commerce/xstore-pc)

[게임의 제품 공유 모델](/publishing/xstore-commerce/xstore-product-sharing)

[라이선스 토큰 개요](/publishing/xstore-commerce/xstore-license-tokens)

[커머스 개요](/publishing/xstore-commerce/xstore-commerce-overview)

[XStore API 참조](/reference/system/xstore/xstore_members)


## Related topics

- [XStoreQueryLicenseTokenAsync](/ko/reference/system/xstore/functions/xstorequerylicensetokenasync.md)
- [PC의 XStore — DRM, 라이선스 토큰, 샌드박스](/ko/publishing/xstore-commerce/xstore-pc.md)
- [다운로드 가능한 콘텐츠(DLC) 관리 및 라이선스](/ko/publishing/xstore-commerce/xstore-dlc.md)
- [개방형 및 제한적 라이선스 모델](/ko/publishing/game-publishing/concepts/licensing/open-and-restrictive-licensing.md)
- [RapidJSON 라이선스](/ko/services/playfab/sdks/cocos2d-x/Licenses/rapidjson-license.md)
