Share via


PlayFab 파티 초대 및 보안 모델

PlayFab 파티는 기본적으로 보안 통신 환경을 제공하도록 설계되었습니다. 이를 통해 게임과 플레이어를 보호하는 데 도움이 되지만, 보안 제한으로 개발자에게 API 사용 관련 질문이 제기됩니다. 이 페이지에서는 주로 초대 및 효과적인 사용 패턴에 초점을 맞춘 PlayFab 파티의 보안 기능을 소개합니다.

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

네트워크에 대한 액세스를 제한하는 것은 네트워크 무결성을 보호하는 핵심 부분입니다. 네트워크에 참가하는 기능은 다음 네 가지 사항에 의해 제어됩니다.

지정된 PlayFab 파티 네트워크에는 최대 32명의 플레이어가 있을 수 있습니다.

초대

초대(PartyInvitation)는 네트워크에 대한 사용자 액세스 권한을 부여하는 네트워크 내의 개체입니다. 초대를 만들고 네트워크 수명 동안 취소할 수 있습니다. 초대에는 작성자, 고유한 식별자, 취소 가능성 설정 및 엔터티 ID로 지정된 선택적 사용자 집합이 있습니다. 네트워크에는 없음을 포함하여 많은 수의 활성 초대가 있을 수 있습니다. 네트워크는 항상 초기 초대로 만들어집니다.

초대 수명

초대는 만들어진 시점부터 취소될 때까지 활성 상태입니다.

만들기

초대를 만드는 방법에는 두 가지가 있습니다. 첫 번째 방법은 PartyManager::CreateNewNetwork()을(를) 호출하는 것입니다. 네트워크에 참가하려면 초대가 필요하므로 네트워크를 만들 때 초대가 있어야 합니다. 이 초대를 초기 초대라고 하며 아래에 설명된 몇 가지 특수 속성이 있습니다. 두 번째 방법은 PartyNetwork::CreateInvitation()을(를) 호출하는 것입니다.

초대 작성자는 PartyNetwork::CreateInvitation()을(를) 호출할 때 지정된 사용자입니다. 초기 초대에 작성자가 없습니다.

초대를 만들거나 활성 초기 초대를 사용하여 네트워크에 참가할 때 PartyInvitationCreatedStateChange이(가) 생성됩니다.

Important

초기 초대는 네트워크 작성자가 참여하는 것을 암시적으로 허용하지 않습니다. 열린 초대를 사용하지 않는 한 작성자의 엔터티 ID를 사용자 목록에 포함해야 합니다.

열거형

활성 초대 열거는 PartyNetwork::GetInvitations()을(를) 사용하여 수행됩니다. 로컬 장치에서 만든 초대만 아직 활성 상태인 경우 초기 초대와 함께 열거할 수 있습니다.

취소

PartyNetwork::RevokeInvitation()을(를) 호출하여 초대가 취소됩니다. 모든 사용자가 취소할 수 있는 초기 초대를 제외하고 초대의 작성자만 취소할 수 있습니다. 또한, 초대를 만든 사용자가 네트워크에서 제거되면 초대가 자동으로 취소됩니다.

초대가 취소되면 초대를 볼 수 있는 모든 장치에서 PartyInvitationRevokedStateChange이(가) 생성됩니다.

초기 초대가 취소되면 다시 만들 수 없습니다. 해당 식별자는 새 초대에 다시 사용될 수 있지만, 새 초대에는 초기 초대의 특수 속성이 없습니다.

Important

초대를 취소해도 이미 네트워크에 참가한 장치와 사용자에게는 영향을 주지 않습니다. 네트워크에서 사용자 또는 장치를 제거하려면 PartyNetwork::KickUser() 또는 PartyNetwork::KickDevice()을(를) 사용합니다. 이러한 메서드는 아직 구현되지 않았습니다.

초대 구성

초대 구성은 PartyInvitationConfiguration 구조체를 사용하여 만드는 동안 지정됩니다.

식별자

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

초대 식별자는 고유해야 하지만 초대가 취소된 후 새 초대를 만들 때 해당 식별자를 다시 사용할 수 있습니다.

초기 초대 및 기타 초대

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

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

초대(초기 초대 제외)는 개인 정보 보호를 위해 다른 장치에서 숨겨집니다. 이것이 중요한 이유의 예는 친구 목록 사용 패턴을 참조하세요.

사용자 및 초대 열기

초대에는 title_player_account엔터티 ID로 지정된 사용자가 0명 이상 포함됩니다. 초대에 사용자가 포함된 경우 해당 초대는 해당 사용자에게 네트워크에 참가할 수 있는 액세스 권한만 부여합니다. 그러나 초대에 사용자가 없는 경우 이 초대는 열린 초대입니다. 모든 사용자는 열린 초대의 식별자로 네트워크에 참가할 수 있습니다.

참고 항목

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

불변성

초대가 만들어지면 초대의 구성을 변경할 수 없습니다. 그러나 초대가 취소된 후 동일한 식별자를 사용하지만 다른 구성을 사용하여 다른 취소를 만들 수 있습니다. 동적 단일 초대 사용 패턴을 참조하세요.

사용 패턴

PlayFab 파티 초대는 간단하지만 유연합니다. 네트워크에 대해 다양한 액세스 모델을 달성하는 데 사용할 수 있는 여러 가지 효과적인 방법이 있습니다. 다음은 몇 가지 일반적인 패턴입니다.

개방형 네트워크

개방형 네트워크는 가장 간단하게 이해하고 구현할 수 있습니다. 네트워크 설명자 및 초대 식별자를 가진 모든 사용자가 참가할 수 있습니다.

PartyManager::CreateNewNetwork()을(를) 호출할 때 initialInvitationConfiguration 매개 변수에 대해 null을 전달하여 개방형 네트워크를 만듭니다. 열린 초대의 식별자가 out 매개 변수로 반환됩니다. 네트워크 만들기가 완료되면 네트워크 설명자와 초대 식별자를 공유하여 사용자가 참가할 수 있도록 합니다.

필요에 따라 초기 초대를 취소하여 나중에 언제든지 네트워크를 닫을 수 있습니다.

Warning

네트워크는 참가한 장치 및 사용자만큼 안전하므로 네트워크 설명자 및 개방형 네트워크의 초대 식별자를 공유할 때는 주의해야 합니다.

정적 사용자 목록

백필이 없는 매치 메이킹으로 만든 게임과 같이 모든 플레이어를 미리 알고 있는 게임의 경우 정적 사용자 목록은 쉽고 효과적인 패턴입니다. 이를 통해 게임이 네트워크에 참가하기 전에 식별된 사용자만 사용할 수 있습니다.

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

일대일 초대

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

PartyInvitationConfiguration 구조체를 만들고 작성자만 entityIds 필드에 추가합니다. 이 구조체를 PartyManager::CreateNewNetwork()에 전달합니다. 작성자가 네트워크에 연결되면 초기 초대가 선택적으로 취소될 수 있습니다. 또는 네트워크 작성자는 개방형 네트워크를 만든 다음 연결되는 즉시 초기 초대를 취소할 수 있습니다.

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

사용자가 참가하면 특정 초대가 선택적으로 취소될 수 있습니다.

친구 목록

각 사용자의 친구가 일대일 초대를 만들지 않고 쉽게 참가할 수 있도록 하려는 게임의 경우 사용자의 전체 친구 목록이 포함된 초대를 만들 수 있습니다.

네트워크에 연결한 후 각 사용자는 PartyInvitationConfiguration 구조체를 만들고 각 소셜 플랫폼 친구를 entityIds 필드에 추가합니다. 이 구조체를 PartyNetwork::CreateInvitation()에 전달하고 네트워크 설명자 및 초대 식별자를 친구와 공유합니다. 사용자의 친구 목록이 변경되면 초대가 취소되고 새 친구 목록을 사용하여 새 초대가 생성됩니다.

동적 단일 초대

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

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

단일 사용자 관리

단일 사용자가 현재 초대를 취소하고 새 초대를 만들면 초대의 소유권을 예측할 수 있습니다. 그러나 외부 서비스는 다음을 수행해야 합니다.

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

모든 사용자 관리

모든 사용자가 초대를 관리하려고 하면 초대 소유권을 예측할 수 없지만, 외부 서비스가 단일 사용자를 선택하지 않아도 됩니다. 대신 각 장치의 사용자가 다음을 수행합니다.

  • 현재 초대를 취소하려고 합니다. 초기 초대의 경우 모든 사용자가 이 작업을 시도하지만 한 명만 성공합니다. 다른 초대의 경우 초대가 다른 사용자에게 표시되지 않으므로 마지막 초대를 만든 사용자만 취소를 시도할 수 있습니다.
  • 새 초대를 만들려고 합니다. 초대에는 고유 식별자가 있어야 하므로 사용자 중 한 명만 성공합니다. 초대가 다른 장치에 표시되지 않으므로 해당 사용자는 새 초대 소유자임을 다른 사용자에게 알려야 합니다.
  • 현재 초대 작성자가 만든 장치를 떠나면 모든 사용자가 위와 마찬가지로 새 초대를 다시 만들어야 합니다.

Important

초대를 취소하고 동일한 식별자를 사용하여 새 초대를 만들 때 초대 식별자가 유효하지 않은 짧은 기간이 있습니다. 이 방법을 사용하는 경우 적절한 대기 기간 후에 실패하는 경우 PartyNetwork::AuthenticateLocalUser() 호출을 다시 시도해야 합니다.

롤링 열린 초대

로비 또는 기타 외부 서비스가 지정된 네트워크에 가입해야 하는 사용자를 제어하는 게임의 경우 동적 단일 초대 패턴 대신 롤링 열린 초대 패턴이 있습니다. 이 패턴에는 항상 단일 열린 초대가 있습니다. 이전에 참가하도록 허용된 사용자가 외부 서비스의 사용자 목록에서 제거될 때마다 초대가 취소되고 새 식별자로 다시 생성됩니다. 초대 식별자는 암호처럼 작동하며 유사하게 보호되어야 합니다. 패턴은 다음 단계에서 구현할 수 있습니다.

  • 외부 서비스는 네트워크를 만들 장치를 선택하고 사용할 초대 식별자를 지정합니다.
  • 외부 서비스는 네트워크에 참가해야 하는 다른 모든 사용자에게 초대 식별자를 보냅니다.
  • 새 사용자가 네트워크에 참가해야 하는 경우 외부 서비스는 현재 초대 식별자를 해당 사용자와 공유합니다.
  • 현재 초대를 받은 사용자가 더 이상 참가할 수 없으면 외부 서비스는 다음을 수행하여 "암호를 변경"해야 합니다.
    • 새 초대 식별자를 선택합니다.
    • 한 명 또는 모든 사용자가 현재 초대를 취소하고 선택한 초대 식별자를 사용하여 새 초대를 만들 것을 요청합니다. 단일 사용자 관리와 모든 사용자 관리에 대한 자세한 내용은 동적 단일 초대를 참조하세요.
    • 이제 네트워크에 참가할 수 있어야 하는 모든 사용자와 새 초대 식별자를 공유합니다.

다음 단계