# 액세스 제어

> Control access to Unity Gaming Services by creating rules to restrict service APIs.

[액세스 제어 서비스](/services/access-control.md)를 통해 Cloud Code를 비롯한 Unity Gaming Services(UGS)에 대한 액세스를 제어할 수 있습니다.

액세스 제어를 사용하면 서비스 API에 대한 플레이어의 액세스를 제한하는 규칙을 만들 수 있습니다.

> **Note:**
>
> 모듈에 대한 플레이어 액세스를 허용하면 게임의 보안이 약화됩니다. 자세한 내용은 [서버 권한](/cloud-code.md)을 참고하십시오.

## Cloud Code 모듈에 대한 플레이어 액세스를 제어하는 예시##control-player-access-to-cloud-code-modules-example

아래 예시에서는 Cloud Code 서비스 API에 대한 액세스를 거부하는 프로젝트 기반 정책을 생성하는 방법을 보여 줍니다. Cloud Code C# 모듈을 트리거에 연결하면 플레이어의 직접 요청을 거부하는 동시에 게임의 보안을 강화할 수 있습니다. [UGS CLI 툴](https://services.docs.unity.com/guides/ugs-cli/latest/access/Access%20Command%20Line/overview/)을 사용하여 액세스 정책을 생성할 수 있습니다.

## 필수 조건##prerequisites

먼저, 필수 액세스 역할로 서비스 계정을 생성하고 [UGS CLI](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/install-the-cli/)를 구성해야 합니다.

### 서비스 계정을 사용하여 인증##authenticate-using-a-service-account

Scheduling 및 Triggers 서비스를 호출하려면 먼저 서비스 계정을 사용하여 인증해야 합니다.

1. [Unity Dashboard](https://cloud.unity.com)로 이동합니다.
2. **Administration** > **Service Accounts**를 선택합니다.
3. **New** 버튼을 선택하고 서비스 계정의 이름과 설명을 입력합니다.
4. **Create**를 선택합니다.

다음과 같이 제품 역할을 추가하고 키를 만듭니다.

1. **Manage product roles**를 선택합니다.
2. 다음 역할을 서비스 계정에 추가합니다.

* LiveOps 드롭다운에서 **Triggers Configuration Editor**, **Triggers Configuration Viewer**, **Scheduler Configuration Editor**, **Scheduler Configuration Viewer**를 선택합니다.
* Admin 드롭다운에서 **Unity Environments Viewer**, **Project Resource Policy Editor**, **Project Resource Policy Reader**를 선택합니다.

3. **Save**를 선택합니다.
4. **Add Key**를 선택합니다.
5. base64 인코딩을 사용하여 **Key ID**와 **Secret key**를 인코딩합니다. 포맷은 ‘key\_id:secret\_key’입니다. 이 값을 기록해 둡니다.

자세한 내용은 [인증](../authentication)을 참고하십시오.

### UGS CLI 구성##configure-the-ugs-cli

다음 단계를 따라 UGS CLI를 시작합니다.

1. [UGS CLI를 설치합니다](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/install-the-cli/).

2. 다음을 사용하여 프로젝트 ID와 환경을 구성합니다.
   `ugs config set project-id <your-project-id>`
   `ugs config set environment-name <your-environment-name>`

3. 이전에 생성한 서비스 계정을 사용하여 인증합니다. 자세한 내용은 [인증 받기](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/get-authenticated/)를 참고하십시오.

### 모듈 엔드포인트 생성##create-a-module-endpoint

프로젝트에서 연결된 모든 플레이어에게 메시지를 브로드캐스트하는 Cloud Code 모듈을 [생성](/cloud-code/modules/how-to-guides/write-modules.md)합니다.

자세한 내용은 [푸시 메시지 전송](/cloud-code/modules/how-to-guides/push-messages.md)을 참고하십시오.

```csharp
using Microsoft.Extensions.DependencyInjection;
using Unity.Services.CloudCode.Core;
using Unity.Services.CloudCode.Apis;

namespace HelloWorld
{
    public class HelloWorld
    {
        [CloudCodeFunction("SendProjectMessage")]
        public async Task SendProjectMessage(IExecutionContext context, PushClient pushClient, string message, string messageType)
        {
            await pushClient.SendProjectMessageAsync(context, message, messageType);
        }
    }

    public class ModuleConfig : ICloudCodeSetup
    {
        public void Setup(ICloudCodeConfig config)
        {
            config.Dependencies.AddSingleton(PushClient.Create());
        }
    }
}
```

모듈을 배포합니다.

모듈을 배포하는 방법을 알아보려면 [Hello World 배포](/cloud-code/modules/getting-started.md#deploy-the-module)를 참고하십시오.

### 액세스를 제한하는 액세스 제어 프로젝트 정책 생성##create-an-access-control-project-policy-to-restrict-access

다음과 같은 내용으로 `project-policy.json` 파일을 생성하여 모듈 엔드포인트에 대한 플레이어의 직접 액세스를 거부하는 정책을 만듭니다.

```json
{
  "statements": [
    {
      "Sid": "DenyPlayerAccessForSendingMessageToProject",
      "Resource": "urn:ugs:cloud-code:/v1/projects/*/modules/HelloWorld/SendProjectMessage",
      "Principal": "Player",
      "Action": ["*"],
      "Effect": "Deny"
    }
  ]
}
```

UGS CLI 툴을 사용하여 이 정책을 프로젝트에 적용합니다.

`ugs access upsert-project-policy project-policy.json`

[플레이어로 인증](/cloud-code/modules/how-to-guides/authentication.md#authenticate-players)된 경우, 이 정책이 플레이어가 `SendProjectMessage` 모듈 엔드포인트에 직접 요청하는 행위를 거부했는지 테스트합니다.

```bash
curl 'https://cloud-code.services.api.unity.com/v1/projects/<PROJECT_ID>/players/<PLAYER_ID>/modules/HelloWorld/SendProjectMessage' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <BEARER_TOKEN>' \
--data '{
"params": {
"message": "hello"
}
}'
```

정책이 적용되면 이 요청은 `403` HTTP 상태 코드가 담긴 응답을 반환합니다.

```json
{
    "status": 403,
    "title": "Forbidden",
    "type": "https://services.docs.unity.com/docs/errors/#56",
    "requestId": "b815d154-91f5-470e-a8ef-76c3c8ec7c13",
    "detail": "Access has been restricted",
    "code": 56
}
```

동일한 요청에서 서비스 계정을 사용하여 인증되었을 때 Cloud Code 모듈을 실행할 수 있는지 테스트합니다. 계속하려면 상태 비보존 토큰을 획득하여 요청의 bearer 토큰으로 사용해야 합니다.

자세한 내용은 [Cloud Code 클라이언트 API bearer 인증](/cloud-code/modules/how-to-guides/authentication.md#cloud-code-client-api-bearer-authentication)을 참고하십시오.

```bash
curl 'https://cloud-code.services.api.unity.com/v1/projects/<PROJECT_ID>/modules/HelloWorld/SendProjectMessage' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <BEARER_TOKEN>' \
--data '{
"params": {
"message": "hello"
}
}'
```

요청이 성공하면 Cloud Code는 `200` HTTP 상태 코드로 응답합니다.

```json
{
  "output":null
}
```

### Scheduling 및 Triggers 설정##set-up-scheduling-and-triggers

일정과 트리거를 설정하여 `SendProjectMessage` 모듈 엔드포인트를 호출할 수 있습니다.

#### 일정 구성을 만듭니다##create-a-schedule-configuration

`new-file` 커맨드를 실행하여 로컬에서 일정 구성을 생성합니다.

```bash
ugs scheduler new-file schedule-config
```

다음 구성을 사용하여 `schedule-config.sched` 파일을 업데이트합니다.

```json
{
  "$schema": "https://ugs-config-schemas.unity3d.com/v1/schedules.schema.json",
  "Configs": {
    "send-project-message": {
      "EventName": "announcement",
      "Type": "one-time",
      "Schedule": "2024-08-28T00:00:00Z",
      "PayloadVersion": 1,
      "Payload": "{\"message\": \"hello\"}"
    }
  }
}
```

> **Note:**
>
> **참고**: `schedule` 타임스탬프가 미래로 지정되었는지 확인하십시오.

#### 트리거 구성을 만듭니다##create-a-trigger-configuration

`new-file` 커맨드를 실행하여 로컬에서 트리거 구성을 생성할 수 있습니다.

```bash
ugs triggers new-file triggers-config
```

`SendProjectMessage` 이벤트가 발생할 때 `announcement` 모듈 엔드포인트를 호출하는 트리거를 생성하려면 다음 구성으로 `triggers-config.tr` 파일을 업데이트합니다.

```json
{
  "$schema": "https://ugs-config-schemas.unity3d.com/v1/triggers.schema.json",
  "Configs": [
    {
      "Name": "announcement-trigger",
      "EventType": "com.unity.services.scheduler.announcement.v1",
      "ActionUrn": "urn:ugs:cloud-code:HelloWorld/SendProjectMessage",
      "ActionType": "cloud-code"
    }
  ]
}
```

#### 구성 배포##deploy-the-configurations

다음과 같이 UGS CLI 툴을 사용하여 파일을 배포합니다.

```bash
ugs deploy <path-to-config-files>
```

올바르게 구성된 경우, 트리거는 `announcement` 이벤트 발생 시 `SendProjectMessage` 모듈 엔드포인트를 호출합니다.
