> ## 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.

# 서비스 간 인증을 위한 User Store ID 요청

> Microsoft Store 서비스 API로 서비스 간 인증을 위한 User Store ID를 얻는 데 필요한 구성 및 단계를 설명합니다.

이 문서에서는 Microsoft Store 서비스 간 인증을 위한 User Store ID를 얻기 위한 설정 및 단계를 설명합니다.

User Store ID는 특정 사용자를 대신하여 Microsoft Store API에 대한 서비스 호출을 인증합니다. XBOX 콘솔의 이 identity는 `XUser` 개체의 계정에 연결됩니다. PC에서는 identity가 Microsoft Store 앱에 로그인되어 구매에 사용된 계정에 연결됩니다.

<Note>
  PC에서는 Microsoft Store 앱 간의 계정 identity가 XBOX Live에 로그인해서 게임을 플레이하는 계정과 다를 수 있습니다.
</Note>

플레이 계정과 구매 계정이 어떻게 다를 수 있는지에 대한 자세한 내용은 [PC에서 스토어 계정 불일치 시나리오 처리](/publishing/xstore-commerce/xstore-mismatched-accounts)를 참고하세요.

User Store ID 키에는 두 가지 유형이 있습니다.

1. Microsoft Store Collections 서비스로 인증하기 위한 [User Collections ID](#to-create-a-user-collections-id-key-for-the-microsoft-store-collections-service)
2. Microsoft Store Purchase 서비스로 인증하기 위한 [User Purchase ID](#to-create-a-user-purchase-id-key-for-the-microsoft-store-purchase-service)

다음 섹션에서는 각 서비스를 호출하기 위한 User Store ID를 얻는 프로세스를 설명합니다.

1. [Microsoft Entra ID 애플리케이션 구성](#step-1-configure-a-microsoft-entra-id-application).
2. [Partner Center에서 Microsoft Entra 애플리케이션 ID를 클라이언트 앱과 연결](#step-2-associate-your-microsoft-entra-application-id-with-your-client-app-in-partner-center).
3. 서비스에서 게시자 identity를 나타내는 [Microsoft Entra ID 액세스 토큰 생성](#step-3-creating-microsoft-entra-id-access-tokens).
4. 게임에서 사용자의 identity를 나타내는 [User Store ID 키 생성](#step-4-create-a-user-store-id-key)하고 이 키를 서비스에 다시 전달합니다.
5. [Microsoft Store API에 대한 요청 인증](#step-5-authenticate-calls-to-the-microsoft-store-apis).
6. 만료된 경우 [User Store ID 키 갱신](/publishing/xstore-commerce/xstore-renew-userstoreid).

이 프로세스에는 두 가지 소프트웨어 구성 요소가 관련됩니다.

* **서비스:** Microsoft Entra 액세스 토큰을 만들고 스토어 API를 호출하는 안전한 백엔드.
* **게임:** 로그인한 사용자에 대한 User Store ID 키를 만들어 서비스에 전달하는 클라이언트.

## Microsoft.StoreServices .NET 라이브러리 및 샘플

통합을 간소화하려면 GitHub의 Microsoft.StoreServices를 사용하세요. 라이브러리는 인증 및 키 흐름을 처리하고 스토어 서비스 호출을 위한 래퍼를 제공합니다. 샘플에는 소모품, 환불 조정, 키 갱신에 대한 종단 간 패턴이 포함되어 있습니다.

* [Microsoft.StoreServices library](https://github.com/microsoft/Microsoft-Store-Services)
* [Microsoft.StoreServices sample](https://github.com/microsoft/Microsoft-Store-Services-Sample)

## 1단계: Microsoft Entra ID 애플리케이션 구성

Microsoft Store API를 사용하기 전에 API 호출 시 서비스를 식별하는 Microsoft Entra 웹 애플리케이션을 만드세요. 등록된 웹 앱에서 이후 단계에서 필요한 액세스 토큰을 생성하기 위한 테넌트 ID, 애플리케이션 ID, 비밀 키를 얻으세요.

<Note>
  게시자 아래 여러 게임 및 제품에서 웹 앱의 테넌트 ID, 애플리케이션 ID, 비밀 키를 재사용할 수 있습니다. 각 게임마다 새로 만들 필요는 없습니다.
</Note>

1. 아직 하지 않았다면, [빠른 시작: Microsoft ID 플랫폼에 애플리케이션 등록](https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-integrating-applications)의 지침에 따라 Microsoft Entra ID로 **Web app / API** 애플리케이션을 등록합니다.
   > \[!NOTE] 애플리케이션을 등록할 때 애플리케이션 유형으로 **Web app / API**를 선택합니다. 이 유형을 사용하면 애플리케이션에 대한 키(*client secret* 이라고도 함)를 검색할 수 있습니다. Microsoft Store API를 호출하려면 이후 단계에서 Microsoft Entra ID에서 액세스 토큰을 요청할 때 클라이언트 비밀을 제공해야 합니다.
2. [Azure Management Portal](https://portal.azure.com/)에서 **Microsoft Entra ID**로 이동합니다. 왼쪽 창에서 디렉터리, **App registrations**, 애플리케이션을 선택합니다.
3. 나중에 사용할 **Application (client) ID** 및 **Directory (tenant) ID** 값을 복사합니다.
4. 왼쪽 창에서 **Certificates & Secrets**에서 새 클라이언트 비밀을 만들고 복사합니다.

## 2단계: Partner Center에서 Microsoft Entra 애플리케이션 ID를 클라이언트 앱과 연결

1. [Partner Center](https://partner.microsoft.com/dashboard)에 로그인한 다음 게임을 선택합니다.
2. **Services** > **Product collections and purchases**를 선택합니다. Microsoft Entra 애플리케이션 ID를 사용 가능한 **Client ID** 필드 중 하나에 입력합니다.
3. **Save**를 선택합니다.
4. 게임과 추가 기능을 스토어에 다시 게시합니다.

<Note>
  추가 기능 제품은 상위 게임의 **Product collections and purchases** 페이지에 저장된 Client ID를 상속합니다. 게임 번들 제품에는 Client ID를 추가해야 하는 자체 **Product collections and purchases** 페이지가 있습니다.
</Note>

## 3단계: Microsoft Entra ID 액세스 토큰 생성

모든 API 요청에는 Authorization 헤더에 Service 액세스 토큰이라는 Bearer 토큰이 필요합니다. 필요한 다른 액세스 토큰은 호출하려는 서비스 또는 API에 따라 다릅니다.

<Info>
  Microsoft Entra ID 액세스 토큰은 앱에서가 아니라 서비스의 컨텍스트에서만 만드세요. 클라이언트 비밀을 앱에 전송하면 손상될 수 있습니다.
</Info>

### 서로 다른 액세스 토큰 및 대상 URI 이해

각 액세스 토큰은 생성 시 사용된 서로 다른 대상 URI와 연결됩니다.

| 액세스 토큰 유형          | 대상 URI                                                                | 사용                                                                                       |
| ------------------ | --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| Service 액세스 토큰     | `https://onestore.microsoft.com/.default`                             | 스토어 서비스 엔드포인트에 대한 Authorization 헤더의 Bearer 토큰                                            |
| Collections 액세스 토큰 | `https://onestore.microsoft.com/b2b/keys/create/collections/.default` | b2bLicensePreview 또는 publisherQuery를 호출하기 위한 User Collections ID(`UserCollectionsId`) 생성 |
| Purchase 액세스 토큰    | `https://onestore.microsoft.com/b2b/keys/create/purchase/.default`    | Recurrence 또는 기타 Purchase 서비스를 호출하기 위한 User Purchase ID(`UserPurchaseId`) 생성             |

<Info>
  `https://onestore.microsoft.com/.default` 대상을 사용하는 서비스 액세스 토큰을 클라이언트에 절대 보내지 마세요. 서비스 내에 안전하게 저장하세요.
</Info>

### 액세스 토큰 만들기

액세스 토큰을 만들려면 서비스에서 OAuth 2.0 API를 사용하세요. [Microsoft ID 플랫폼 및 OAuth 2.0 클라이언트 자격 증명 흐름](https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow)의 지침에 따라 `https://login.microsoftonline.com/<tenant_id>/oauth2/v2.0/token` 엔드포인트에 HTTP POST를 전송하세요. 다음 예제는 샘플 요청을 보여줍니다.

```syntax theme={null}
POST https://login.microsoftonline.com/<tenant_id>/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8

grant_type=client_credentials
&client_id=<your_client_id>
&client_secret=<your_client_secret>
&resource=https://onestore.microsoft.com/.default
```

각 토큰 요청에 대해:

* `client_id`와 `client_secret`을 [Azure Management Portal](https://portal.azure.com/)에서 앱 등록 값으로 설정합니다.
* `resource`를 필요한 토큰 유형의 대상 URI로 설정합니다. [서로 다른 액세스 토큰 및 대상 URI 이해](#understanding-the-different-access-tokens-and-audience-uris)를 참고하세요.

기존 액세스 토큰이 만료되기 전이나 후에 새 액세스 토큰을 만들 수 있습니다.

액세스 토큰의 구조에 대한 자세한 내용은 [보안 토큰](https://learn.microsoft.com/en-us/azure/active-directory/develop/security-tokens)을 참고하세요.

## 4단계: User Store ID 키 만들기

요청에서 사용자를 식별하기 위해 서비스는 User Store ID 키를 얻습니다. **User Store ID**는 User Collections ID 또는 User Purchase ID의 일반적인 용어로 사용됩니다. 이러한 키의 유일한 차이점은 해당 키가 인증할 수 있는 해당 서비스입니다.

GDK API를 사용하여 클라이언트에서 User Store ID 키를 생성하거나 서비스에서 생성할 수 있습니다. 이 섹션은 GDK API를 통해 클라이언트에서 User Store ID 키를 생성하는 데 초점을 맞춥니다. 서비스에서 User Store ID 키를 생성하는 방법에 대한 자세한 내용은 [X-token 또는 OAuth 2.0으로 서비스에서 User Store ID 요청](/publishing/xstore-commerce/xstore-requesting-userstoreid-oauth)을 참고하세요.

User Store ID 키는 Microsoft Store 앱에 로그인한 사용자를 나타내는 JSON Web Token(JWT)입니다. 이 키의 클레임에 대한 자세한 내용은 [User Store ID 키의 클레임](#claims-in-a-user-store-id-key)을 참고하세요.

<Note>
  각 User Store ID 키는 30일 동안 유효합니다. 서비스는 만료되기 전에 키를 갱신할 수 있습니다. 사용자의 사용 권한을 계속 쿼리하려면 서비스가 새 키를 만드는 대신 Microsoft Store ID 키를 갱신하세요. 자세한 내용은 [User Store ID 키 갱신](/publishing/xstore-commerce/xstore-renew-userstoreid)을 참고하세요.
</Note>

### Microsoft Store Collections 서비스용 User Collections ID 키 만들기

User Collections ID 키를 사용하면 Collections API를 사용해 사용자가 소유한 제품을 쿼리하고 소모품 제품을 관리할 수 있습니다. 소모품 관리에 대한 자세한 내용은 [서비스에서 소모품 제품 관리](/publishing/xstore-commerce/xstore-managing-consumables)를 참고하세요.

1. [3단계](#step-3-creating-microsoft-entra-id-access-tokens)에서 만든 Collections 액세스 토큰을 게임에 전달합니다.
2. 게임에서 [XStoreGetUserCollectionsIdAsync](/reference/system/xstore/xstore_members)를 호출하여 User Collections ID 키를 검색합니다. Collections 액세스 토큰을 `serviceTicket` 매개 변수로 전달합니다. 선택적으로 내부 사용자 식별자를 `publisherUserId`에 전달합니다.
3. 앱이 User Collections ID 키를 성공적으로 만든 후 키를 서비스에 다시 전달합니다.

### Microsoft Store Purchase 서비스용 User Purchase ID 키 만들기

User Purchase ID 키를 사용하면 Purchase API를 사용해 사용자가 소유한 제품을 쿼리하고 소모품 제품을 관리할 수 있습니다. 소모품 관리에 대한 자세한 내용은 [서비스에서 소모품 제품 관리](/publishing/xstore-commerce/xstore-managing-consumables)를 참고하세요.

1. [3단계](#step-3-creating-microsoft-entra-id-access-tokens)에서 만든 Purchase 액세스 토큰을 게임에 전달합니다.
2. 게임에서 [XStoreGetUserPurchaseIdAsync](/reference/system/xstore/xstore_members)를 호출하여 User Purchase ID 키를 검색합니다. Purchase 액세스 토큰을 `serviceTicket` 매개 변수로 전달합니다. 선택적으로 내부 사용자 식별자를 `publisherUserId`에 전달합니다.
3. 앱이 User Purchase ID 키를 성공적으로 만든 후 키를 서비스에 다시 전달합니다.

## 5단계: Microsoft Store API에 대한 호출 인증

지침은 [Microsoft Entra ID 및 User Store ID로 인증](/publishing/xstore-commerce/xstore-authenticating-service#authenticating-with-microsoft-entra-id-and-user-store-ids)을 참고하세요.

## 6단계: 만료 시 User Store ID 키 갱신

지침은 [User Store ID 키 갱신](/publishing/xstore-commerce/xstore-renew-userstoreid)을 참고하세요.

## 추가 정보

### User Store ID 키 생성 다이어그램

다음 다이어그램은 User Store ID 키를 만드는 프로세스를 보여줍니다.

<img src="https://mintcdn.com/microsoft-4404708b/iADzli99B7EWodAv/images/xstore/b2b-1.png?fit=max&auto=format&n=iADzli99B7EWodAv&q=85&s=36a35f930c664b1ccc2b49b2ec430d9d" alt="User Store ID 키를 만드는 프로세스를 보여주는 다이어그램. 왼쪽에서 오른쪽으로, 블록은 서비스, Microsoft Entra ID, 앱, Windows SDK, 스토어를 나타냅니다. 번호가 매겨진 화살표는 서비스에서 Microsoft Entra ID로, 서비스에서 앱으로, 앱에서 Windows SDK 및 스토어로, 그런 다음 앱에서 서비스로 다시 돌아가는 흐름을 보여줍니다." width="1021" height="414" data-path="images/xstore/b2b-1.png" />

### User Store ID 키의 클레임

User Store ID 키는 제품 소유권 정보에 액세스하려는 사용자의 identity를 나타내는 JWT입니다. Base64로 디코딩하면 User Store ID 키에는 다음 표에 표시된 클레임이 포함됩니다.

| 매개변수                                                                     | 유형       | 설명                                                                                                                                                   |
| ------------------------------------------------------------------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `iat`                                                                    | `int`    | 키가 발급된 시간이 epoch 시간으로 표현됩니다. 이 값을 사용해 토큰의 나이를 결정합니다.                                                                                                 |
| `iss`                                                                    | `string` | 발급자를 식별합니다. `aud` 클레임과 동일한 값을 가집니다.                                                                                                                  |
| `aud`                                                                    | `string` | 대상(audience)을 식별합니다. 다음 값 중 하나여야 합니다: `https://collections.mp.microsoft.com/v6.0/keys` 또는 `https://purchase.mp.microsoft.com/v6.0/keys`.             |
| `exp`                                                                    | `int`    | 키가 처리를 위해 유효하지 않게 되는 만료 시간을 식별합니다. 키 갱신은 예외입니다. 이 클레임의 값은 epoch 시간으로 표현됩니다.                                                                          |
| `nbf`                                                                    | `int`    | 토큰이 처리에 유효한 시간을 식별합니다. 이 클레임의 값은 epoch 시간으로 표현됩니다.                                                                                                   |
| `http://schemas.microsoft.com/marketplace/2015/08/claims/key/clientId`   | `string` | 개발자를 식별하는 클라이언트 ID입니다.                                                                                                                               |
| `http://schemas.microsoft.com/marketplace/2015/08/claims/key/payload`    | `string` | Microsoft Store 서비스만 사용하도록 되어 있는 정보를 포함하는 불투명 페이로드(암호화되고 Base64로 인코딩됨)입니다.                                                                           |
| `http://schemas.microsoft.com/marketplace/2015/08/claims/key/userId`     | `string` | 서비스 컨텍스트에서 현재 사용자를 식별하는 사용자 ID입니다. [User Store ID 키를 만드는 데 사용하는 메서드](#step-4-create-a-user-store-id-key)의 선택적 `publisherUserId` 매개 변수에 전달한 값과 동일합니다. |
| `http://schemas.microsoft.com/marketplace/2015/08/claims/key/refreshUri` | `string` | 키를 갱신하는 데 사용할 수 있는 URI입니다.                                                                                                                           |

다음 예제는 디코딩된 User Store ID 헤더를 보여줍니다.

```json theme={null}
{
    "typ":"JWT",
    "alg":"RS256",
    "kid": "36D101AF67A9F61B8017FB96F91EDD4B22F05804",
    "x5t":"agA_pgJ7Twx_Ex2_rEeQ2o5fZ5g"
}
```

JWT 서명과 `kid` 클레임은 클라이언트 및 타이틀 서비스에서 불투명 값으로 처리하세요. Store API가 서명을 검증합니다.

디코딩된 User Store ID 클레임 세트의 예입니다.

```json theme={null}
{
    "http://schemas.microsoft.com/marketplace/2015/08/claims/key/clientId": "1d577369placeholder7393beef1e13d",
    "http://schemas.microsoft.com/marketplace/2015/08/claims/key/payload": "placeholderytCRzCHSqnfczv3f0343wfSydx7hghfu0snWzMqyoAGy5DSJ5rMSsKoQFAccs1iNlwlGrX+/eIwh/VlUhLrncyP8c18mNAzAGK+lTAd2oiMQWRRAZxPwGrJrwiq2fTq5NOVDnQS9Za6/GdRjeiQrv6c0x+WNKxSQ7LV/uH1x+IEhYVtDu53GiXIwekltwaV6EkQGphYy7tbNsW2GqxgcoLLMUVOsQjI+FYBA3MdQpalV/aFN4UrJDkMWJBnmz3vrxBNGEApLWTS4Bd3cMswXsV9m+VhOEfnv+6PrL2jq8OZFoF3FUUpY8Fet2DfFr6xjZs3CBS1095J2yyNFWKBZxAXXNjn+zkvqqiVRjjkjNajhuaNKJk4MGHfk2rZiMy/aosyaEpCyncdisHVSx/S4JwIuxTnfnlY24vS0OXy7mFiZjjB8qL03cLsBXM4utCyXSIggb90GAx0+EFlVoJD7+ZKlm1M90xO/QSMDlrzFyuqcXXDBOnt7rPynPTrOZLVF+ODI5HhWEqArkVnc5MYnrZD06YEwClmTDkHQcxCvU+XUEvTbEk69qR2sfnuXV4cJRRWseUTfYoGyuxkQ2eWAAI1BXGxYECIaAnWF0W6ThweL5ZZDdadW9Ug5U3fZd4WxiDlB/EZ3aTy8kYXTW4Uo0adTkCmdLibw=",
    "http://schemas.microsoft.com/marketplace/2015/08/claims/key/userId": "infusQplaceholder/SZWoPB4FqLEwHXgZFuMJ6TuTY=",
    "http://schemas.microsoft.com/marketplace/2015/08/claims/key/refreshUri": "https://collections.mp.microsoft.com/v6.0/b2b/keys/renew",
    "iat": 1442395542,
    "iss": "https://collections.mp.microsoft.com/v6.0/keys",
    "aud": "https://collections.mp.microsoft.com/v6.0/keys",
    "exp": 1450171541,
    "nbf": 1442391941
}
```

## 참조 API 문서

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

## 참고

[서비스에서 제품 관리](/publishing/xstore-commerce/xstore-authenticating-service)

[Microsoft Store API로 서비스 인증](/publishing/xstore-commerce/xstore-authenticating-service)

[X-token 또는 OAuth 2.0으로 서비스에서 User Store ID 요청](/publishing/xstore-commerce/xstore-requesting-userstoreid-oauth)

[User Store ID 키 갱신](/publishing/xstore-commerce/xstore-renew-userstoreid)

[Microsoft.StoreServices library](https://github.com/microsoft/Microsoft-Store-Services)

[Microsoft.StoreServices sample](https://github.com/microsoft/Microsoft-Store-Services-Sample)


## Related topics

- [Microsoft Store API로 서비스 인증하기](/ko/publishing/xstore-commerce/xstore-authenticating-service.md)
- [User Store ID 키 갱신](/ko/publishing/xstore-commerce/xstore-renew-userstoreid.md)
- [X-token 또는 OAuth 2.0으로 User Store ID 요청](/ko/publishing/xstore-commerce/xstore-requesting-userstoreid-oauth.md)
- [GDK 커머스 시스템 개요](/ko/publishing/xstore-commerce/xstore-overview.md)
- [서비스에서 소모품 제품 관리](/ko/publishing/xstore-commerce/xstore-managing-consumables.md)
