# 서비스 및 액세스 토큰 지원

> Use Access Tokens and Service Tokens to authenticate requests in Cloud Code scripts.

스크립트에서 `context` 오브젝트는 `accessToken`과 `serviceToken`을 제공합니다.

| 토큰 유형          | 출처                                                              | 데이터 액세스          | 사용                                                                                                      |
| -------------- | --------------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------- |
| `accessToken`  | [Authentication 서비스](/authentication/use-anon-sign-in.md) 에서 생성 | 인증된 플레이어만        | `AccessToken`은 Cloud Code 호출을 인증하는 데 사용하는 JWT입니다. 인증된 플레이어의 데이터에 액세스하기 위해 다른 UGS 서비스에 이 토큰을 전달할 수 있습니다. |
| `serviceToken` | Cloud Code에서 생성                                                 | 크로스 플레이어 데이터 액세스 | `ServiceToken`은 다른 UGS 서비스를 호출하고 크로스 플레이어 데이터와 상호 작용하는 데 사용하는 토큰입니다.                                    |

다른 UGS 서비스를 호출할 때 이러한 토큰을 사용하여 플레이어나 Cloud Code로 인증할 수 있습니다.

자세한 내용은 [인증](./authentication.md) 페이지를 참고하십시오.

## 개요##overview

플레이어로 인증할지 신뢰할 수 있는 클라이언트로 인증할지 평가합니다.

스크립트 `context` 오브젝트는 `accessToken`과 `serviceToken`을 제공합니다.

스크립트의 목적이 인증된 플레이어의 데이터에만 액세스하는 것이라면, `accessToken`을 사용하여 스크립트를 호출하는 플레이어로 인증해야 합니다. 그러면 플레이어가 자신의 데이터에만 액세스하고 상호 작용할 수 있습니다.

스크립트의 목적이 크로스 플레이어 데이터에 액세스하는 것이라면, `serviceToken`을 사용하여 Cloud Code로 인증해야 합니다. 그러면 스크립트가 크로스 플레이어 데이터에 액세스하고 상호 작용할 수 있습니다. 그러나 이 방법을 사용하면 악의적인 플레이어가 스크립트를 호출하여 의도하지 않은 부분에서 크로스 플레이어 데이터에 액세스하게 될 수 있습니다. 이를 방지하기 위해 모듈을 [액세스 제어](./access-control.md) 규칙으로 보호해야 합니다.

크로스 플레이어 데이터와 상호 작용하는 방법을 자세히 알아보려면 [플레이어 간 데이터](./cross-player-data.md) 기술 자료를 참고하십시오.

## 액세스 토큰 지원##access-token-support

액세스 토큰은 [Authentication 서비스](/authentication/use-anon-sign-in.md) 에서 생성하는 [JWT](https://jwt.io/)입니다. 액세스 토큰을 사용하여 플레이어를 인증할 수 있습니다.

인증된 플레이어가 Cloud Code 모듈을 호출하면, 플레이어의 액세스 토큰을 `context` 오브젝트의 `AccessToken` 프로퍼티로 모듈에 전달합니다.

Cloud Code JavaScript SDK로 액세스 토큰을 사용할 수 있습니다. 다른 UGS API에서 액세스 토큰을 사용하려면, 인증 헤더에서 토큰을 bearer 토큰으로 전달해야 합니다.

구성된 모든 [액세스 제어](./access-control.md) 규칙은 `accessToken`에 영향을 줍니다.

### 지원되는 서비스##supported-services

액세스 토큰을 지원하는 서비스를 확인하려면 아래 표를 참고하십시오.

| 제공자                       | 지원되는 서비스                                                                                                            |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| Cloud Code JavaScript SDK | Authentication 서비스와 함께 온보딩된 모든 [Cloud Code JavaScript SDK](https://cloud-code-sdk-documentation.cloud.unity3d.com/) |
| UGS 클라이언트 API             | Authentication 서비스와 함께 온보딩된 모든 UGS 서비스                                                                              |
| UGS 관리자 API               | 지원되지 않습니다. 대신 [서비스 계정 인증](./authentication.md#cloud-code-admin-api-basic-authentication)을 사용하십시오.                   |

> **Note:**
>
> **참고:** 대부분의 UGS 서비스는 Authentication 서비스와 함께 온보딩되어 있으며 액세스 토큰을 지원합니다.

### Cloud Code JavaScript SDK로 토큰 사용##use-tokens-with-cloud-code-javascript-sdks

Cloud Code JavaScript SDK로 `accessToken`을 사용하려면 `context` 오브젝트에서 토큰을 전달해야 합니다.

> **Note:**
>
> **참고:** 기본적으로 Cloud Code JavaScript SDK는 `context` 오브젝트의 `serviceToken`을 사용합니다. 이 토큰을 사용하려면 SDK 생성자에 `accessToken`을 명시적으로 전달해야 합니다.

아래는 스크립트를 호출하는 플레이어의 재화 잔액을 늘리는 예시로, 재화 ID를 파라미터로 사용합니다.

#### JavaScript##javascript

```javascript
const { CurrenciesApi } = require("@unity-services/economy-2.4");

module.exports = async ({ params, context, logger }) => {
  const { projectId, playerId, accessToken } = context;
  const { currencyId } = params;

  // Use the accessToken from the context object to authenticate the call as the player
  const currencies = new CurrenciesApi({accessToken});

  try {
    const result = await currencies.incrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 10 } });
    return result.data;
  } catch (err) {
    logger.error("Failed to update currency balance", {"error.message": err.message}, {"currencyId" : currencyId});
    throw err;
  }
}
```

### UGS 클라이언트 API로 토큰 사용##use-tokens-with-ugs-client-apis

UGS 클라이언트 API로 `accessToken`을 사용하려면 인증 헤더에 토큰을 bearer 토큰으로 전달해야 합니다.

> **Note:**
>
> **참고:** 호출하려는 서비스에서 Cloud Code JavaScript SDK를 제공하는 경우, 서비스 API를 직접 호출하는 대신 SDK를 사용할 수 있습니다. 사용할 수 있는 SDK 목록은 [Cloud Code 서비스 SDK](https://cloud-code-sdk-documentation.cloud.unity3d.com/) 페이지를 참고하십시오.

아래는 스크립트를 호출하는 플레이어의 친구 목록을 가져오는 예시입니다.

#### JavaScript##javascript

```javascript
const axios = require("axios-0.21");

module.exports = async ({ params, context, logger }) => {
  const config = {
    headers: {
      'Content-Type': 'application/json',
      // Pass the accessToken from the context object as a bearer token
      Authorization: `Bearer ${context.accessToken}`
    }
  };

  try {
    const friendsGetUrl = `https://social.services.api.unity.com/v1/relationships?type=FRIEND_REQUEST`
    var res = await axios.get(friendsGetUrl, config);
    return res.data;
  } catch (err) {
    logger.error("Failed to retrieve Friends", {"error.message": err.message});
    throw err;
  }
};

```

## 서비스 토큰 지원##service-token-support

서비스 토큰은 Cloud Code가 생성하는 [JWT](https://jwt.io/)입니다. 서비스 토큰을 사용하여 Cloud Code로 서비스를 인증할 수 있습니다. 이 토큰은 [토큰 교환](./authentication.md#cloud-code-client-api-bearer-authentication) 프로세스를 거친 서비스 계정 토큰입니다.

Cloud Code JavaScript SDK로 서비스 토큰을 사용할 수 있습니다. 다른 API로 서비스 토큰을 사용하려면 인증 헤더에서 토큰을 bearer 토큰으로 전달해야 합니다.

자세한 내용은 [Authentication 기술 자료](./authentication.md#cloud-code-client-api-bearer-authentication)를 참고하십시오.

### 지원되는 서비스##supported-services

서비스 토큰을 지원하는 서비스 목록은 아래 표를 참고하십시오.

| 제공자                       | 지원되는 서비스                                                                                                                                                                                                              |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Cloud Code JavaScript SDK | [Cloud Save][Cloud Save JS SDK][Economy][Economy JS SDK][Lobby][Lobby JS SDK][Leaderboards][Leaderboards JS SDK] [Player Names][Player Names JS SDK][Matchmaker][Matchmaker JS SDK][Multiplayer][Multiplayer JS SDK]  |
| UGS 클라이언트 API             | [Cloud Save][Cloud Save Client API][Economy][Economy Client API][Leaderboards][Leaderboards Client API] [Player Names][Player Names Client API][Matchmaker][Matchmaker Client API]                                    |
| UGS 관리자 API               | 지원되지 않습니다. 대신 [서비스 계정 인증](./authentication.md#cloud-code-admin-api-basic-authentication)을 사용하십시오.                                                                                                                     |

자세한 내용은 [Cloud Code 서비스 SDK](https://cloud-code-sdk-documentation.cloud.unity3d.com/) 기술 자료를 참고하십시오.

[Cloud Save JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/cloud-save/v1.3

[Economy JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/economy/v2.4

[Lobby JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/lobby/v1.2

[Leaderboards JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/leaderboards/v1.1

[Player Names JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/player-names/v1.0

[Matchmaker JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/matchmaker/v2.0

[Multiplayer JS SDK]: https://cloud-code-sdk-documentation.cloud.unity3d.com/multiplay/v1.0

[Cloud Save Client API]: https://services.docs.unity.com/cloud-save/v1/

[Economy Client API]: https://services.docs.unity.com/economy/v2/

[Leaderboards Client API]: https://services.docs.unity.com/leaderboards/v1/

[Player Names Client API]: https://services.docs.unity.com/player-names/v1/

[Matchmaker Client API]: https://services.docs.unity.com/matchmaker/v2/

### Cloud Code JavaScript SDK로 토큰 사용##use-tokens-with-cloud-code-javascript-sdks

Cloud Code JavaScript SDK로 `serviceToken`을 사용하려면 `context` 오브젝트에서 토큰을 전달해야 합니다.

아래는 플레이어 ID와 재화 ID를 파라미터로 사용하여 해당 플레이어의 재화 잔액을 늘리는 예시입니다.

#### JavaScript##javascript

```javascript
const { CurrenciesApi } = require("@unity-services/economy-2.4");

module.exports = async ({ params, context, logger }) => {
 const { projectId } = context;
 const { playerId, currencyId } = params;

  // By default, the Cloud Code JavaScript SDKs use the serviceToken from the context object
  const currencies = new CurrenciesApi(context);

  try {
    const result = await currencies.incrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 10 } });
    return result.data;
  } catch (err) {
    logger.error("Failed to update currency balance", {"error.message": err.message}, {"currencyId" : currencyId});
    throw err;
  }

}
```

### UGS 클라이언트 API로 토큰 사용##use-tokens-with-ugs-client-apis

UGS 클라이언트 API로 `serviceToken`을 사용하려면 인증 헤더에 토큰을 bearer 토큰으로 전달해야 합니다.

> **Note:**
>
> **참고:** 호출하는 서비스에서 Cloud Code C# SDK를 제공하는 경우, 서비스 API를 직접 호출하는 대신 SDK를 사용할 수 있습니다. 사용할 수 있는 SDK 목록은 [사용 가능한 라이브러리](../reference/available-libraries) 페이지를 참고하십시오.

예를 들어 Cloud Save API를 호출하면, `serviceToken`을 사용하여 인증하고 크로스 플레이어 데이터와 상호 작용할 수 있습니다. 아래는 플레이어 ID를 함수 파라미터로 사용하여 새로운 값을 기록하고 해당 플레이어에 대해 저장된 모든 데이터를 반환하는 예시입니다.

#### JavaScript##javascript

```javascript
const axios = require("axios-0.21");

module.exports = async ({ params, context, logger }) => {
  const config = {
    headers: {
      'Content-Type': 'application/json',
      // Authenticate as Cloud Code using the serviceToken from the context object
      Authorization: `Bearer ${context.serviceToken}`
    }
  };

  let result;
  try {
    const cloudSaveUrl = `https://cloud-save.services.api.unity.com/v1/data/projects/${context.projectId}/players/${params.playerId}/items`
    const payload = {
      key : "test",
      value: "test"
    };

    await axios.post(cloudSaveUrl, payload, config);
    result = await axios.get(cloudSaveUrl, config);

    return result.data;
  } catch (err) {
    logger.error("Failed to call out to Cloud Save", {"error.message": err.message});
    throw err;
  }
};
```
