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

# PlayFab Party invitations and the security model

> PlayFab Party 초대가 플레이어에게 네트워크 참가 권한을 부여하는 방식과 보안 모델이 채팅 및 데이터 액세스를 제어하는 방식에 대한 개념적 개요입니다.

PlayFab Party는 기본적으로 안전한 통신 환경을 제공하도록 설계되었습니다. 이는 게임과 플레이어를 보호하는 데 도움이 되지만, 보안 제한은 개발자에게 API 사용 질문을 야기할 수 있습니다. 이 페이지는 초대와 이를 사용하는 효과적인 패턴에 주로 초점을 맞춰 PlayFab Party의 보안 기능을 소개합니다.

PlayFab Party는 모든 통신(관리 데이터, 게임 데이터, 실시간 통신)에 대해 업계 표준 암호화 및 인증을 사용합니다. 여기에는 모든 피어-투-피어 전송과 Azure 서비스에 대한 모든 트랜잭션이 포함되며, 웹 서비스(HTTPS 사용)이든 투명 클라우드 릴레이 서비스(DTLS 사용)이든 마찬가지입니다.

네트워크에 대한 액세스 제한은 네트워크 무결성을 보호하는 핵심 부분입니다. 네트워크에 참가하려면 네 가지가 필요합니다.

* [네트워크 설명자](/services/playfab/multiplayer/networking/concepts-objects#network) 지식
* 유효한 PlayFab `title_player_account` [엔터티 토큰](/services/playfab/live-service-management/game-configuration/entities) 보유
* 초대 [식별자](#identifiers) 지식
* 지정된 초대에 토큰에 대한 PlayFab [entity ID](/services/playfab/live-service-management/game-configuration/entities)가 있거나, 지정된 초대가 [열린 초대](#users-and-open-invitations)인 경우

특정 PlayFab Party 네트워크는 최대 [128명의 플레이어](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayer-server/request-party-service#partynetworkconfiguration)를 가질 수 있습니다.

## 초대

초대(`PartyInvitation`)는 네트워크 내의 객체로 사용자에게 네트워크에 대한 액세스를 부여합니다. 초대는 네트워크의 수명 동안 [생성](#creation)되고 [철회](#revocation)될 수 있습니다. 초대에는 [생성자](#creation), 고유한 [식별자](#identifiers), [철회 가능성 설정](#initial-invitation-and-other-invitations), 그리고 엔터티 ID로 지정된 선택적 [사용자 집합](#users-and-open-invitations)이 있습니다. 네트워크는 활성 초대를 원하는 만큼 가질 수 있으며, 하나도 없을 수도 있습니다. 네트워크는 항상 초기 초대와 함께 생성됩니다.

## 초대 수명

초대는 생성된 시점부터 철회될 때까지 활성 상태입니다.

### 생성

초대를 만드는 방법에는 두 가지가 있습니다. 첫 번째 방법은 `PartyManager::CreateNewNetwork()`를 호출하는 것입니다. 네트워크에 참가하려면 초대가 필요하므로 네트워크가 생성될 때 초대가 존재해야 합니다. 이 초대는 초기 초대로 알려져 있으며 [아래에 설명된](#initial-invitation-and-other-invitations) 몇 가지 특별한 속성이 있습니다. 두 번째 방법은 `PartyNetwork::CreateInvitation()`을 호출하는 것입니다.

초대의 생성자는 `PartyNetwork::CreateInvitation()` 호출 시 지정된 사용자입니다. 초기 초대에는 생성자가 없습니다.

초대가 생성되면(또는 활성 초기 초대가 있는 네트워크에 참가할 때) `PartyInvitationCreatedStateChange`가 생성됩니다.

<Info>
  초기 초대는 네트워크 생성자가 참가하는 것을 암시적으로 허용하지 않습니다. [열린 초대](#users-and-open-invitations)를 사용하지 않는 한 사용자 목록에 생성자의 엔터티 ID를 포함해야 합니다.
</Info>

### 열거

활성 초대 열거는 `PartyNetwork::GetInvitations()`를 사용하여 수행됩니다. 로컬 디바이스에서 만든 초대와 여전히 활성 상태인 초기 초대만 열거될 수 있습니다.

### 철회

초대는 `PartyNetwork::RevokeInvitation()`을 호출하여 철회됩니다. 초대는 생성자만 철회할 수 있으며, 초기 초대는 예외로 어떤 사용자든 철회할 수 있습니다. 또한 초대는 이를 생성한 사용자가 네트워크에서 제거될 때 자동으로 철회됩니다.

초대가 철회되면 초대를 볼 수 있었던 모든 디바이스에서 `PartyInvitationRevokedStateChange`가 생성됩니다.

초기 초대가 철회되면 다시 만들 수 없습니다. 그 식별자는 새 초대에 재사용될 수 있지만, 그 새 초대는 초기 초대의 특별한 속성을 갖지 않습니다.

<Info>
  초대를 철회해도 이미 네트워크에 참가한 디바이스와 사용자에게는 영향이 없습니다. 사용자나 디바이스를 네트워크에서 제거하려면 `PartyNetwork::KickUser()` 또는 `PartyNetwork::KickDevice()`를 사용하세요. 이 메서드는 아직 구현되지 않았습니다.
</Info>

## 초대 구성

초대의 구성은 `PartyInvitationConfiguration` 구조체를 사용하여 생성 시 지정됩니다.

### 식별자

각 초대에는 네트워크 내에서 고유하게 식별하는 식별자가 있습니다. 초대를 만들 때 식별자를 지정하지 않으면 Party가 하나를 할당합니다. `PartyManager::CreateNewNetwork()` 호출의 경우 할당된 식별자는 out 매개 변수로 반환되며 네트워크 생성이 완료될 때 `PartyCreateNewNetworkCompletedStateChange`에도 보고됩니다. `PartyManager::CreateInvitation()` 호출의 경우 할당된 식별자는 `invitation` out 매개 변수 또는 초대 생성이 완료될 때 `PartyCreateInvitationCompletedStateChange`의 `invitation` 필드에서 검색할 수 있습니다.

초대 식별자는 고유해야 하지만, 초대가 철회된 후에는 그 식별자를 새 초대 생성 시 재사용할 수 있습니다.

### 초기 초대와 기타 초대

초대 유형은 하나뿐이지만 `PartyManager::CreateNewNetwork()` 호출로 생성된 초기 초대는 나중에 `PartyNetwork::CreateInvitation()`을 통해 생성된 초대와 조금 다릅니다. 차이점은 아래 표에 요약되어 있습니다.

| 속성     | 초기 초대                                                                                                                                                                                 | 기타 초대                                                                                                                                                      |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 가시성    | 모든 디바이스에서 초기 초대를 볼 수 있습니다. 초기 초대가 철회되지 않는 한 `PartyNetwork::GetInvitations()` 호출은 초기 초대를 반환합니다. 네트워크에 참가할 때 이전에 철회되지 않았다면 각 디바이스는 초기 초대에 대한 `PartyInvitationCreatedStateChange`를 받습니다. | 초대를 만든 디바이스만 이를 볼 수 있습니다. 초기 초대가 아닌 초대는 해당 디바이스에서 생성된 경우에만 `PartyNetwork::GetInvitations()`가 반환하며, `PartyInvitationCreatedStateChange`는 생성한 디바이스에서만 생성됩니다. |
| 철회 가능성 | 누구나 초기 초대를 철회할 수 있습니다. 초대 구성을 명시적으로 지정할 때 철회 가능성은 `PartyInvitationRevocability::Anyone`으로 설정해야 합니다.                                                                                   | 생성자만 초대를 철회할 수 있습니다. 초대를 만들 때 철회 가능성은 `PartyInvitationRevocability::Creator`로 설정해야 합니다.                                                                    |
| 수명     | 초기 초대는 명시적으로 철회될 때까지 활성 상태입니다.                                                                                                                                                        | 초기 초대가 아닌 초대는 명시적으로 철회되거나 이를 만든 사용자가 네트워크에서 제거될 때까지 활성 상태입니다. 사용자가 네트워크에서 제거되면 그가 만든 모든 초대가 자동으로 철회됩니다.                                                    |
| 생성자    | 초기 초대에는 생성자가 없습니다. `PartyInvitation::GetCreatorEntityId()`는 null을 반환합니다.                                                                                                              | `PartyNetwork::CreateInvitation` 호출 시 지정된 사용자가 생성자입니다. `PartyInvitation::GetCreatorEntityId()`는 그 사용자의 엔터티 ID를 반환합니다.                                      |

(초기 초대가 아닌) 초대는 개인 정보 보호상의 이유로 다른 디바이스에서 숨겨집니다. 이것이 왜 중요한지에 대한 예는 [친구 목록 사용 패턴](#friends-list)을 참조하세요.

### 사용자 및 열린 초대

초대에는 `title_player_account` [엔터티 ID](/services/playfab/live-service-management/game-configuration/entities)로 지정된 0명 이상의 사용자가 포함됩니다. 초대에 사용자가 포함되어 있으면 그 초대는 해당 사용자에게만 네트워크 참가 액세스를 부여합니다. 그러나 초대에 사용자가 포함되지 않은 경우, 이는 열린 초대입니다. 열린 초대의 식별자로 어떤 사용자든 네트워크에 참가할 수 있습니다.

<Note>
  게임 콘솔과 같은 다중 사용자 디바이스에서는 올바른 사용자와 함께 올바른 초대를 사용해야 합니다. 각 초대에 지정된 사용자에 따라, 디바이스의 서로 다른 사용자가 PartyNetwork::AuthenticateLocalUser()를 통해 사용자를 네트워크에 인증할 때 서로 다른 초대를 사용해야 할 수 있습니다.
</Note>

### 변경 불가능성

초대가 생성되면 그 구성은 변경할 수 없습니다. 그러나 초대가 철회된 후에는 동일한 식별자이지만 다른 구성으로 또 다른 초대를 만들 수 있습니다. [동적 단일 초대 사용 패턴](#dynamic-single-invitation)을 참조하세요.

## 사용 패턴

PlayFab Party 초대는 단순하지만 유연합니다. 네트워크에 대한 다양한 액세스 모델을 달성하기 위해 이를 사용하는 효과적인 방법이 많이 있습니다.

### 열린 네트워크

열린 네트워크는 이해하고 구현하기 가장 간단합니다. 네트워크 설명자와 초대 식별자를 가진 누구나 참가할 수 있게 합니다.

`PartyManager::CreateNewNetwork()` 호출 시 `initialInvitationConfiguration` 매개 변수에 null을 전달하여 열린 네트워크를 만듭니다. 열린 초대의 식별자는 out 매개 변수로 반환됩니다. 네트워크 생성이 완료되면 네트워크 설명자와 초대 식별자를 공유하여 사용자가 참가할 수 있게 합니다.

원하는 경우 나중에 초기 초대를 철회하여 언제든지 네트워크를 닫을 수 있습니다.

<Warning>
  네트워크는 참가하는 디바이스와 사용자만큼만 안전하므로, 열린 네트워크의 네트워크 설명자와 초대 식별자를 공유할 때는 주의를 기울이세요.
</Warning>

### 정적 사용자 목록

Backfill이 없는 매치메이킹으로 만든 게임과 같이 모든 플레이어를 사전에 아는 게임의 경우, 정적 사용자 목록은 쉽고 효과적인 패턴입니다. 이는 게임 시작 전에 식별된 사용자만 네트워크에 참가할 수 있게 합니다.

`PartyInvitationConfiguration` 구조체를 만들고 알려진 사용자를 `entityIds` 필드에 추가합니다. 이 구조체를 `PartyManager::CreateNewNetwork()`에 전달합니다. 네트워크 생성이 완료되면 네트워크 설명자와 초대 식별자를 공유하여 사용자가 참가할 수 있게 합니다.

### 일대일 초대

기존 사용자가 다른 사용자를 개별적으로 초대하는 게임에서는 일대일 초대 패턴이 효과적이고 간단합니다.

`PartyInvitationConfiguration` 구조체를 만들고 생성자만 `entityIds` 필드에 추가합니다. 이 구조체를 `PartyManager::CreateNewNetwork()`에 전달합니다. 생성자가 네트워크에 연결되면 원하는 경우 초기 초대를 철회할 수 있습니다. 또는 네트워크의 생성자가 [열린 네트워크](#open-network)를 만들고 연결하는 즉시 초기 초대를 철회할 수 있습니다.

네트워크에 참가해야 하는 각 사용자에 대해 또 다른 `PartyInvitationConfiguration` 구조체를 만듭니다. 이러한 구조체를 `PartyNetwork::CreateInvitation()`에 전달하여 초대를 만듭니다. 각 사용자에게 네트워크 설명자와 그들의 특정 초대에 대한 초대 식별자를 함께 공유합니다. 사용자가 참가함에 따라 그들은 이 패턴을 반복하여 더 많은 사용자를 초대할 수 있습니다.

사용자가 참가하면 원하는 경우 그들의 특정 초대를 철회할 수 있습니다.

### 친구 목록

[일대일 초대](#one-to-one-invitations)를 만들지 않고도 각 사용자의 친구가 쉽게 참가할 수 있도록 하려는 게임의 경우, 사용자의 전체 친구 목록을 포함하는 초대를 만들 수 있습니다.

네트워크에 연결한 후 각 사용자는 `PartyInvitationConfiguration` 구조체를 만들고 각 소셜 플랫폼 친구를 `entityIds` 필드에 추가합니다. 이 구조체를 `PartyNetwork::CreateInvitation()`에 전달하고, 네트워크 설명자와 초대 식별자를 친구들과 공유합니다. 사용자의 친구 목록이 변경되면 초대를 철회하고 새 친구 목록으로 새 초대를 만들어야 합니다.

### 동적 단일 초대

많은 게임에는 특정 네트워크에 누가 참가해야 하는지를 제어하는 lobby 또는 기타 외부 서비스가 있습니다. 외부 서비스와 네트워크를 동기화하려면 동적 단일 초대 패턴을 사용할 수 있습니다. 이 패턴은 잘 알려진 식별자를 가진 단일 초대를 사용합니다.

이 패턴에는 두 가지 변형이 있습니다. 외부 서비스가 네트워크의 초대를 관리할 단일 사용자를 선택하거나, 모든 사용자에게 초대를 관리하려고 시도하도록 요청할 수 있습니다. 두 경우 모두 네트워크에 있어야 하는 사용자 집합이 변경될 때마다 외부 서비스가 사용자에게 알리고, 사용자는 현재 초대를 철회하고 동일한 잘 알려진 식별자를 사용하되 새로운 전체 사용자 집합을 포함하는 새 초대를 만들려고 시도합니다.

#### 단일 사용자 관리

한 사용자가 현재 초대를 철회하고 새 초대를 만드는 책임을 지면 예측 가능한 초대 소유권으로 이어집니다. 그러나 외부 서비스는 다음을 수행해야 합니다.

* 초대를 관리할 사용자를 선택합니다.
* 이전 사용자가 네트워크를 떠날 때 새 사용자를 선택합니다.

#### 모든 사용자 관리

모든 사용자가 초대를 관리하려고 시도하면 예측할 수 없는 초대 소유권으로 이어지지만, 외부 서비스가 단일 사용자를 선택할 필요가 없어집니다. 대신 각 디바이스의 사용자는 다음을 수행합니다.

* 현재 초대를 철회하려고 시도합니다. 초기 초대의 경우 모든 사용자가 이를 시도하지만 하나만 성공합니다. 다른 초대의 경우 초대가 다른 사용자에게 보이지 않으므로 마지막 초대를 만든 사용자만 철회를 시도할 수 있습니다.
* 새 초대를 만들려고 시도합니다. 초대는 고유한 식별자를 가져야 하므로 사용자 중 한 명만 성공합니다. 그 사용자는 다른 디바이스에 초대가 보이지 않으므로, 자신이 새 초대 소유자임을 다른 사용자에게 알려야 합니다.
* 현재 초대의 생성자가 생성 디바이스를 떠나면 모든 사용자가 다시 새 초대를 만들려고 시도해야 합니다.

<Info>
  초대를 철회하고 동일한 식별자로 새 초대를 만들 때, 초대 식별자가 무효인 짧은 시간 창이 있습니다. 이 접근 방식을 사용하는 경우 합리적인 대기 기간 후 `PartyNetwork::AuthenticateLocalUser()` 호출이 실패하면 재시도해야 합니다.
</Info>

### 롤링 열린 초대

특정 네트워크에 누가 참가해야 하는지를 lobby 또는 기타 외부 서비스가 제어하는 게임의 경우, [동적 단일 초대](#dynamic-single-invitation) 패턴의 대안은 롤링 열린 초대 패턴입니다. 이 패턴에는 항상 단일 열린 초대가 있습니다. 이전에 참가가 허용된 사용자가 외부 서비스의 사용자 목록에서 제거될 때마다 초대가 철회되고 새 식별자로 다시 만들어집니다. 초대 식별자는 암호처럼 작동하며 유사하게 보호되어야 합니다. 패턴은 다음 단계로 구현할 수 있습니다.

* 외부 서비스가 네트워크를 만들 디바이스를 선택하고 사용할 초대 식별자를 지정합니다.
* 외부 서비스가 네트워크에 참가해야 하는 다른 모든 사용자에게 초대 식별자를 보냅니다.
* 새 사용자가 네트워크에 참가해야 할 때 외부 서비스는 그 사용자와 현재 초대 식별자를 공유합니다.
* 현재 초대를 가진 사용자가 더 이상 참가가 허용되지 않아야 할 때 외부 서비스는 다음을 수행하여 “암호를 변경”해야 합니다.
  * 새 초대 식별자를 선택합니다.
  * 사용자 중 한 명 또는 모두에게 현재 초대를 철회하고 선택된 초대 식별자로 새 초대를 만들도록 요청합니다. 단일 사용자 관리와 모든 사용자 관리에 대한 논의는 [동적 단일 초대](#dynamic-single-invitation)를 참조하세요.
  * 이제 네트워크에 참가가 허용되어야 하는 모든 사용자와 새 초대 식별자를 공유합니다.

## 다음 단계

* [PlayFab Party가 검색 흐름과 상호 작용하는 방식 알아보기](/services/playfab/multiplayer/networking/concepts-discovery)


## Related topics

- [PlayFab Party Typedefs](/ko/services/playfab/multiplayer/networking/reference/typedefs.md)
- [PlayFab Party 릴리스 정보](/ko/services/playfab/multiplayer/networking/release-notes.md)
- [Request parties from your services with RequestPartyService](/ko/services/playfab/multiplayer/networking/party-tutorial-requestpartyservice.md)
- [PartyInvitation](/ko/services/playfab/multiplayer/networking/reference/classes/PartyInvitation/partyinvitation.md)
- [PartyInvitationConfiguration](/ko/services/playfab/multiplayer/networking/reference/structs/partyinvitationconfiguration.md)
