API 액세스 정책
API 액세스 정책은 API 리소스에 대한 액세스를 제어합니다. 종종 부정 행위 방지 또는 다른 보안 목적으로 타이틀에서 게임 클라이언트의 특정 API를 허용하거나 거부합니다. 정책 문을 사용하여 액세스를 제어하여 특정 상황에서 적용되는 액세스 규칙 집합을 지정할 수 있습니다.
이 항목에서는 API 사용 권한 정책을 사용하여 적절한 규칙을 만드는 방법을 설명합니다.
Important
이 가이드 메뉴는 고급 기술에 대해 설명합니다. 잘못 적용하면 이 기능을 사용하여 타이틀에 대한 클라이언트 액세스를 완전히 비활성화할 수 있습니다.
정책 제어 및 구조
타이틀은 PlayFab 관리자 API 호출을 사용하여 액세스 정책을 검색하고 업데이트합니다. API 액세스 정책을 설정하는 데 사용하는 두 가지 특정 호출은 GetPolicy와 UpdatePolicy입니다. 관리 API 호출에 대한 자세한 내용은 PlayFab API 참조를 참조하세요.
관리 API를 사용하려면 타이틀과 관련된 개발자 비밀 키를 제공해야 합니다. 개발자 키는 타이틀이 관리자 API 호출을 할 수 있도록 권한을 부여하는 데 사용됩니다. 비밀 키를 가져오는 자세한 방법은 비밀 키 관리를 참조하세요.
각 정책에는 정책 문 목록이 포함되어 있으며 하나 이상의 PlayFab 리소스에 대한 규칙 역할을 합니다. PlayFab은 모든 정책을 허용하는 정책 문의 기본 집합을 정의합니다. 이 정책 문 집합을 대체하지 않고 삭제하면 타이틀이 클라이언트 API를 호출할 수 없습니다.
기본 PlayFab 정책 문은 다음과 같습니다.
"Statements": [
{
"Resource": "pfrn:api--*",
"Action": "*",
"Effect": "Allow",
"Principal": "*",
"Comment": "The default allow all policy"
}
]
각 사용 권한 문 집합은 인증 - 업데이트 정책에 정의된 다음 항목으로 구성됩니다.
리소스 - 하나 이상의 PlayFab 리소스를 고유하게 식별하는 문자열입니다.
API 리소스를 기술하려면 아래에 표시된 규칙을 사용하십시오.
pfrn:api--/API-GROUP/API-CALL
클라이언트 API를
API-GROUP
로 지정합니다.Client
,Server
, 또는Admin
로도 지정할 수 있습니다.API-CALL
을(를)ConfirmPurchase
,LoginWithTwitch
, 또는ReportPlayer
같은 API 이름으로 대체합니다.리소스 문자열은 와일드 카드를 지원합니다. 다음 리소스 문자열은 모든 리소스와 일치합니다.
pfrn:api--*
작업 - 리소스에 대해 수행할 작업을 설명하는 문자열입니다.
*
을(를) 사용하여 작업과 매치시킵니다.효과 - 규칙 정의를 지정하는 문자열입니다.
Allow
또는Deny
을(를) 사용하여 리소스에 대한 작업을 허용하거나 거부합니다.보안 주체 - 사용자의 클래스를 고유하게 식별하는 문자열입니다.
*
을(를) 사용하여 사용자와 매치시킵니다.주석 - 정책 문에 대한 자세한 정보를 제공하는 사용자 정의 문자열입니다.
ApiConditions - 고급 규칙 조건(예: 암호화 및 서명된 헤더)을 정의하는 선택적 개체입니다.
애플리케이션에서 사용하는 API의 액세스만 허용하도록 하는 보다 자세한 사용 권한 문을 사용하도록 정책을 수정하여 애플리케이션에 대한 강력한 보안 규칙을 설정할 수 있습니다.
다음 예제에서는 DeleteCharacterFromUser
호출을 제한하는 방법을 보여줍니다.
{
"Resource": "pfrn:api--/Server/DeleteCharacterFromUser",
"Action": "",
"Effect": "Deny",
"Principal": "",
"Comment": "Disable server character delete"
}
API 액세스 정책 예제
다음 코드 샘플은 정책과 관련된 기본 작업을 보여 줍니다. 코드는 다음 작업을 수행합니다.
- 기존 정책를 가져오고 로깅합니다.
- 정책을 업데이트합니다.
- 기존 정책 다시 가져오고 기록합니다.
public void Start() {
PlayFabSettings.staticSettings.DeveloperSecretKey = "<insert key here>";
PlayFabSettings.TitleId = "< insert title id here >";
FetchApiPolicy(UpdateApiPolicy);
}
private void FetchApiPolicy(Action nextAction = null) {
PlayFabAdminAPI.GetPolicy(new GetPolicyRequest() {
PolicyName = "ApiPolicy"
}, result => {
Debug.Log(result.PolicyName);
foreach (var statement in result.Statements)
{
Debug.Log("Action: "+ statement.Action);
Debug.Log("Comment: "+ statement.Comment);
if(statement.ApiConditions != null)
Debug.Log("ApiCondition.HashSignatureOrEncryption: "+ statement.ApiConditions.HasSignatureOrEncryption);
Debug.Log("Effect: "+ statement.Effect);
Debug.Log("Principal: "+statement.Principal);
Debug.Log("Resource: "+ statement.Resource);
}
if (nextAction != null) nextAction();
},error=>Debug.LogError(error.GenerateErrorReport()));
}
private void UpdateApiPolicy() {
PlayFabAdminAPI.UpdatePolicy(new UpdatePolicyRequest() {
PolicyName = "ApiPolicy",
OverwritePolicy = false, // Append to existing policy. Set to True, to overwrite.
Statements = new List<PermissionStatement>() {
new PermissionStatement() {
Action = "*", // Statement effects Execute action
ApiConditions = new ApiCondition() {
HasSignatureOrEncryption = Conditionals.False // Require no RSA encrypted payload or signed headers
},
Comment = "Do not allow clients to confirm purchase",
Resource = "pfrn:api--/Client/ConfirmPurchase", // Resource name
Effect = EffectType.Deny, // Do not allow,
Principal = "*"
}
}
}, result => {
FetchApiPolicy();
}, error => Debug.LogError(error.GenerateErrorReport()));
}
아래 이미지는 코드가 처음 실행된 후의 출력 예시를 보여줍니다. 표시된 것처럼 정책은 권한 설정 문으로 구성됩니다.