

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Verified Permissions 정책
<a name="policies"></a>

*정책*이란 *보안 주체*가 *리소스*에 대해 하나 이상의 *작업*을 수행하는 것을 허용하거나 금지하는 구문입니다. 각 정책은 다른 모든 정책과 독립적으로 평가됩니다. Cedar 정책의 구조 및 평가 방법에 대한 자세한 내용은 Cedar 정책 언어 참조 가이드의 [스키마에 대한 Cedar 정책 검증](https://docs.cedarpolicy.com/policies/validation.html)을 참조하세요.

선택적으로 정책에 정책 이름을 할당할 수 있습니다. 정책 이름은 정책 스토어 내의 모든 정책에 대해 고유해야 하며 접두사가 붙어야 합니다`name/`. `policyId` 파라미터를 수락하는 컨트롤 플레인 작업에서 정책 ID 대신 정책 이름을 사용할 수 있습니다. 다음 예제에서는 정책 이름을 사용하여를 사용하여 정책을 검색합니다`GetPolicy`.

```
$ aws verifiedpermissions get-policy \
    --policy-id name/example-policy \
    --policy-store-id PSEXAMPLEabcdefg111111
```

**중요**  
보안 주체, 리소스 및 작업을 참조하는 Cedar 정책을 작성할 때 사용자는 각 요소에 사용되는 고유 식별자를 정의할 수 있습니다. 이 경우 다음 모범 사례를 따르는 것이 좋습니다.  
**모든 보안 주체 및 리소스 식별자에 범용 고유 식별자(UUIDs)를 사용합니다.**  
예를 들어, 사용자 `jane`이 퇴사할 때 나중에 다른 사람이 이 `jane`이라는 이름을 사용하도록 허용하면 새 사용자는 여전히 `User::"jane"`을 참조하는 정책이 부여하는 모든 항목에 자동으로 액세스할 수 있게 됩니다. Cedar는 새 사용자와 기존 사용자를 구분할 수 없습니다. 이 사례는 보안 주체 및 리소스 식별자 모두에 적용됩니다. 정책에 이전 식별자가 남아 있어 의도치 않게 액세스 권한을 부여하는 일이 없도록 항상 고유성이 보장되고 재사용되지 않는 식별자를 사용하십시오.  
엔터티에 UUID를 사용할 때는 주석 지정자(//)와 엔터티의 '친숙한' 이름을 사용하는 것이 좋습니다. 이렇게 하면 정책을 더 쉽게 이해할 수 있습니다. 예: principal == Role::"a1b2c3d4-e5f6-a1b2-c3d4-EXAMPLE11111, // 관리자
**개인 식별 정보, 기밀 정보 또는 민감한 정보를 보안 주체 또는 리소스에 대한 고유 식별자의 일부로 포함하지 마십시오.** 이러한 식별자는 AWS CloudTrail 추적에서 공유되는 로그 항목에 포함됩니다.

**Topics**
+ [Amazon Verified Permissions 정적 정책 생성](policies-create.md)
+ [Amazon Verified Permissions 정적 정책 편집](policies-edit.md)
+ [컨텍스트 추가](context.md)
+ [Amazon Verified Permissions 테스트 벤치 사용](test-bench.md)
+ [Amazon Verified Permissions 정책 예제](policies-examples.md)

# Amazon Verified Permissions 정적 정책 생성
<a name="policies-create"></a>

보안 주체가 애플리케이션의 지정된 리소스에 대해 지정된 작업을 수행하도록 허용하거나 금지하는 정적 정책을 생성할 수 있습니다. 정적 정책에는 `principal` 및에 대한 특정 값이 포함되어 `resource` 있으며 권한 부여 결정에 사용할 준비가 되어 있습니다.

------
#### [ AWS Management Console ]

**정적 정책을 생성하려면**

1. [Verified Permissions 콘솔](https://console.aws.amazon.com/verifiedpermissions/)을 엽니다. 정책 스토어를 선택합니다.

1. 왼쪽의 탐색 창에서 **정책**을 선택합니다.

1. **정책 생성**과 **정적 정책 생성**을 차례로 선택합니다.
**참고**  
사용하려는 정책 설명이 있는 경우 **8단계로** 건너뛰고 정책을 다음 페이지의 **정책** 섹션에 붙여 넣습니다.

1. **정책 효과** 섹션에서 요청이 정책과 일치하는 경우 정책을 **허용**하거나 **금지**하도록 선택합니다. **허용**을 선택하면 정책은 보안 주체가 리소스에 대한 작업을 수행하도록 허용합니다. 반대로 **금지**를 선택하면 정책은 보안 주체가 리소스에 대한 작업을 수행하도록 허용하지 않습니다.

1. **보안 주체 범위** 필드에서 정책을 적용할 보안 주체의 범위를 선택합니다.
   + 정책을 특정 보안 주체에 적용하려면 **특정 보안 주체**를 선택합니다. 정책에 지정된 작업을 수행하도록 허용되거나 금지될 보안 주체의 엔터티 유형 및 식별자를 지정합니다.
   + 정책을 보안 주체 그룹에 적용하려면 **보안 주체 그룹**을 선택합니다. **보안 주체 그룹** 필드에 보안 주체 그룹 이름을 입력합니다.
   + 정책 스토어의 모든 보안 주체에 정책을 적용하려면 **모든 보안 주체**를 선택합니다.

1. **리소스 범위** 필드에서 정책을 적용할 리소스의 범위를 선택합니다.
   + 정책을 특정 리소스에 적용하려면 **특정 리소스**를 선택합니다. 정책이 적용될 리소스의 엔터티 유형과 식별자를 지정합니다.
   + 리소스 그룹에 정책을 적용하려면 **리소스 그룹**을 선택합니다. **리소스 그룹** 필드에 리소스 그룹 이름을 입력합니다.
   + 정책 스토어의 모든 리소스에 정책을 적용하려면 **모든 리소스**를 선택합니다.

1. **작업 범위** 섹션에서 정책을 적용할 리소스의 범위를 선택합니다.
   + 정책을 특정 작업 세트에 적용하려면 **특정 작업 세트**를 선택합니다. 정책을 적용할 작업 옆에 있는 확인란을 선택합니다.
   + 정책 스토어의 모든 작업에 정책을 적용하려면 **모든 작업**을 선택합니다.

1. **다음**을 선택합니다.

1. **정책** 섹션에서 Cedar 정책을 검토합니다. **형식**을 선택하여 정책 구문의 형식을 권장 간격과 들여쓰기로 지정할 수 있습니다. 자세한 내용은 Cedar 정책 언어 참조 가이드의 [Cedar 기본 정책 구성](https://docs.cedarpolicy.com/policies/syntax-policy.html)을 참조하세요.

1. **세부 정보** 섹션에 정책에 대한 선택적 설명을 입력합니다.

1. **정책 생성**을 선택합니다.

------
#### [ AWS CLI ]

**정적 정책을 생성하려면**  
[CreatePolicy](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_CreatePolicy.html) 작업을 사용하여 정적 정책을 생성할 수 있습니다. 다음 예제에서는 간단한 정적 정책을 생성합니다.

```
$ aws verifiedpermissions create-policy \
    --definition "{ \"static\": { \"Description\": \"MyTestPolicy\", \"Statement\": \"permit(principal,action,resource) when {principal.owner == resource.owner};\"}}" \
    --policy-store-id PSEXAMPLEabcdefg111111
{
"Arn": "arn:aws:verifiedpermissions::123456789012:policy/PSEXAMPLEabcdefg111111/SPEXAMPLEabcdefg111111",
    "createdDate": "2023-05-16T20:33:01.730817+00:00",
    "lastUpdatedDate": "2023-05-16T20:33:01.730817+00:00",
    "policyId": "SPEXAMPLEabcdefg111111",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyType": "STATIC"
}
```

**정책 이름으로 정책을 생성하려면**  
정책을 생성할 때 선택적으로 정책 이름을 지정할 수 있습니다. 이름은 정책 스토어 내의 모든 정책에 대해 고유해야 하며 접두사가 붙어야 합니다`name/`. 정책 ID 대신 이름을 사용할 수 있습니다.

```
$ aws verifiedpermissions create-policy \
    --definition "{ \"static\": { \"Statement\": \"permit(principal, action, resource in Album::\\\"public_folder\\\");\"}}" \
    --policy-store-id PSEXAMPLEabcdefg111111 \
    --name name/example-policy
{
    "createdDate": "2023-06-12T20:33:37.382907+00:00",
    "lastUpdatedDate": "2023-06-12T20:33:37.382907+00:00",
    "policyId": "SPEXAMPLEabcdefg111111",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyType": "STATIC",
    "resource": {
        "entityId": "public_folder",
        "entityType": "Album"
    }
}
```

**참고**  
정책 스토어의 다른 정책과 이미 연결된 이름을 지정하면 `ConflictException` 오류가 발생합니다.

------

# Amazon Verified Permissions 정적 정책 편집
<a name="policies-edit"></a>

정책 스토어에서 기존 정적 정책을 편집할 수 있습니다. 정적 정책만 직접 업데이트할 수 있습니다. 템플릿 연결 정책을 변경하려면 정책 템플릿을 업데이트해야 합니다. 자세한 내용은 [Amazon Verified Permissions 정책 템플릿 편집](policy-templates-edit.md) 단원을 참조하십시오.

정적 정책의 다음 요소를 변경할 수 있습니다.
+ 정책에서 참조하는 `action`.
+ 조건 조항(예: `when`, `unless`).

정적 정책의 다음 요소는 변경할 수 없습니다. 이러한 요소를 변경하려면 정책을 삭제하고 다시 생성해야 합니다.
+ 정적 정책에서 템플릿 연결 정책으로의 정책입니다.
+ `permit` 또는의 정적 정책의 영향입니다`forbid`.
+ 정적 정책에서 참조하는 `principal`.
+ 정적 정책에서 참조하는 `resource`.

------
#### [ AWS Management Console ]

**정적 정책을 편집하려면**

1. [Verified Permissions 콘솔](https://console.aws.amazon.com/verifiedpermissions/)을 엽니다. 정책 스토어를 선택합니다.

1. 왼쪽의 탐색 창에서 **정책**을 선택합니다.

1. 편집할 정적 정책 옆의 라디오 버튼을 선택한 다음 **편집**을 선택합니다.

1. **정책 본문** 섹션에서 정적 정책의 `action` 또는 조건 조항을 업데이트합니다. 정책 효과, 정책의 `principal` 또는 `resource`는 업데이트할 수 없습니다.

1. **정책 업데이트**를 선택합니다.
**참고**  
정책 스토어에서 [정책 검증](policy-validation-mode.md)을 사용하도록 설정한 경우 정적 정책을 업데이트하면 Verified Permissions가 정책 스토어의 스키마를 기준으로 정책을 검증합니다. 업데이트된 정적 정책이 검증을 통과하지 못하면 작업이 실패하고 업데이트가 저장되지 않습니다.

------
#### [ AWS CLI ]

**정적 정책을 편집하려면**  
[UpdatePolicy](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_UpdatePolicy.html) 작업을 사용하여 정적 정책을 편집할 수 있습니다. 다음 예제에서는 간단한 정적 정책을 편집합니다.

이 예제에서는 `definition.txt` 파일을 사용하여 정책 정의를 포함합니다.

```
{
    "static": {
        "description":  "Grant everyone of janeFriends UserGroup access to the vacationFolder Album",
        "statement": "permit(principal in UserGroup::\"janeFriends\", action, resource in Album::\"vacationFolder\" );"
    }
}
```

다음 명령은 해당 파일을 참조합니다.

```
$ aws verifiedpermissions create-policy \
    --definition file://definition.txt \
    --policy-store-id PSEXAMPLEabcdefg111111

{
    "createdDate": "2023-06-12T20:33:37.382907+00:00",
    "lastUpdatedDate": "2023-06-12T20:33:37.382907+00:00",
    "policyId": "SPEXAMPLEabcdefg111111",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyType": "STATIC",
    "principal": {
        "entityId": "janeFriends",
        "entityType": "UserGroup"
    },
    "resource": {
        "entityId": "vacationFolder",
        "entityType": "Album"
    }
}
```

**정책의 이름을 업데이트하려면**  
정책을 업데이트할 때 정책 이름을 설정하거나 업데이트할 수 있습니다. 이름은 정책 스토어 내의 모든 정책에 대해 고유해야 하며 접두사가 붙어야 합니다`name/`. 업데이트 요청에 이름 필드를 포함하지 않으면 기존 이름은 변경되지 않습니다. 이름을 제거하려면 빈 문자열로 설정합니다.

```
$ aws verifiedpermissions update-policy \
    --policy-id SPEXAMPLEabcdefg111111 \
    --policy-store-id PSEXAMPLEabcdefg111111 \
    --definition file://definition.txt \
    --name name/example-policy
{
    "createdDate": "2023-06-12T20:33:37.382907+00:00",
    "lastUpdatedDate": "2023-06-12T20:47:42.804511+00:00",
    "policyId": "SPEXAMPLEabcdefg111111",
    "policyStoreId": "PSEXAMPLEabcdefg111111",
    "policyType": "STATIC",
    "principal": {
        "entityId": "janeFriends",
        "entityType": "UserGroup"
    },
    "resource": {
        "entityId": "vacationFolder",
        "entityType": "Album"
    }
}
```

------

# 컨텍스트 추가
<a name="context"></a>

*컨텍스트*는 정책 결정과 관련이 있지만 보안 주체, 작업 또는 리소스의 자격 증명의 일부가 아닌 정보입니다. 액세스 토큰 클레임은 컨텍스트입니다. 소스 IP 주소 집합에서만 또는 사용자가 MFA로 로그인한 경우에만 작업을 허용할 수 있습니다. 애플리케이션은이 컨텍스트 세션 데이터에 액세스할 수 있으며 권한 부여 요청에 채워야 합니다. Verified Permissions 권한 부여 요청의 컨텍스트 데이터는 `contextMap` 요소에서 JSON 형식이어야 합니다.

이 콘텐츠를 설명하는 예제는 [샘플 정책 스토어](policy-stores-create.md)에서 가져온 것입니다. 따라서 테스트 환경에 **DigitalPetStore** 샘플 정책 스토어를 생성합니다.

다음 컨텍스트 객체는 샘플 **DigitalPetStore** 정책 스토어를 기반으로 애플리케이션의 각 Cedar 데이터 유형 중 하나를 선언합니다.

```
"context": {
  "contextMap": {
    "AccountCodes": {
      "set": [
        {
          "long": 111122223333
        },
        {
          "long": 444455556666
        },
        {
          "long": 123456789012
        }
      ]
    },
    "approvedBy": {
    "entityIdentifier": {
      "entityId": "Bob",
      "entityType": "DigitalPetStore::User"
    }
    },
    "MfaAuthorized": {
      "boolean": true
    },
    "NetworkInfo": {
      "record": {
        "IPAddress": {
          "string": "192.0.2.178"
        },
        "Country": {
          "string": "United States of America"
        },
        "SSL": {
          "boolean": true
        }
    }
    },
    "RequestedOrderCount": {
      "long": 4
    },
    "UserAgent": {
      "string": "My UserAgent 1.12"
    }
  }
}
```권한 부여 컨텍스트의 데이터 형식

**부울**  
바이너리 `true` 또는 `false` 값입니다. 이 예제에서 `true`의 부울 값은 고객이 주문 보기를 요청하기 전에 멀티 팩터 인증을 수행했음을 `MfaAuthenticated` 나타냅니다.

**Set**  
컨텍스트 요소의 모음입니다. 집합 멤버는이 예제와 같은 유형 또는 중첩 집합을 포함한 다양한 유형일 수 있습니다. 이 예에서 고객은 3개의 서로 다른 계정과 연결됩니다.

**문자열**  
문자로 묶인 `"` 일련의 문자, 숫자 또는 기호입니다. 이 예제에서 `UserAgent` 문자열은 고객이 주문 보기를 요청하는 데 사용한 브라우저를 나타냅니다.

**Long**  
정수. 이 예에서는이 요청이 고객이 과거 주문 중 4개를 보도록 요청한 배치의 일부임을 `RequestedOrderCount` 나타냅니다.

**레코드**  
속성 모음입니다. 요청 컨텍스트에서 이러한 속성을 선언해야 합니다. 스키마가 있는 정책 스토어에는 스키마에이 엔터티와 엔터티의 속성이 포함되어야 합니다. 이 예제에서 `NetworkInfo` 레코드에는 사용자의 발신 IP, 클라이언트가 결정한 해당 IP의 지리적 위치, 전송 중 암호화에 대한 정보가 포함됩니다.

**EntityIdentifier**  
요청의 `entities` 요소에 선언된 개체 및 속성에 대한 참조입니다. 이 예에서는 직원가 사용자의 주문을 승인했습니다`Bob`.

예제 **DigitalPetStore** 앱에서이 예제 컨텍스트를 테스트하려면 요청 , `entities`정책 스토어 스키마 및 정적 정책을 **Customer Role - Get Order** 설명으로 업데이트해야 합니다.

## 권한 부여 컨텍스트를 수락하도록 DigitalPetStore 수정
<a name="authorization-context-example"></a>

처음에는 **DigitalPetStore**가 매우 복잡한 정책 저장소가 아닙니다. 제공된 컨텍스트를 지원하기 위해 미리 구성된 정책 또는 컨텍스트 속성은 포함되지 않습니다. 이 컨텍스트 정보로 예제 권한 부여 요청을 평가하려면 정책 스토어와 권한 부여 요청을 다음과 같이 수정합니다. 액세스 토큰 정보가 컨텍스트인 컨텍스트 예제는 [Amazon Cognito 액세스 토큰 매핑](cognito-map-token-to-schema.md#cognito-map-access-token) 및 [OIDC 액세스 토큰 매핑을 참조하세요](oidc-map-token-to-schema.md#oidc-map-access-token).

------
#### [ Schema ]

정책 스토어 스키마에 다음 업데이트를 적용하여 새 컨텍스트 속성을 지원합니다. 다음과 `actions` 같이 `GetOrder`에서를 업데이트합니다.

```
"GetOrder": {
  "memberOf": [],
  "appliesTo": {
    "resourceTypes": [
      "Order"
    ],
    "context": {
      "type": "Record",
      "attributes": {
        "AccountCodes": {
          "type": "Set",
          "required": true,
          "element": {
            "type": "Long"
          }
        },
        "approvedBy": {
          "name": "User",
          "required": true,
          "type": "Entity"
        },
        "MfaAuthorized": {
          "type": "Boolean",
          "required": true
        },
        "NetworkInfo": {
          "type": "NetworkInfo",
          "required": true
        },
        "RequestedOrderCount": {
          "type": "Long",
          "required": true
        },
        "UserAgent": {
          "required": true,
          "type": "String"
        }
      }
    },
    "principalTypes": [
      "User"
    ]
  }
}
```

요청 컨텍스트`NetworkInfo`에서 라는 `record` 데이터 형식을 참조하려면 스키마에 다음을 스키마 앞에 추가하여 스키마에 [commonType](https://docs.cedarpolicy.com/schema/schema.html#schema-commonTypes) 구문을 생성합니다`actions`. `commonType` 구문은 서로 다른 엔터티에 적용할 수 있는 공유 속성 집합입니다.

```
"commonTypes": {
  "NetworkInfo": {
    "attributes": {
      "IPAddress": {
        "type": "String",
        "required": true
      },
      "SSL": {
        "required": true,
        "type": "Boolean"
      },
      "Country": {
        "required": true,
        "type": "String"
      }
    },
    "type": "Record"
  }
},
```

------
#### [ Policy ]

다음 정책은 제공된 각 컨텍스트 요소에서 충족해야 하는 조건을 설정합니다. 고객 **역할 - 주문 가져오기**라는 설명과 함께 기존 정적 정책을 기반으로 합니다. 이 정책은 처음에 요청을 하는 보안 주체만 리소스의 소유자가 되도록 요구합니다.

```
permit (
    principal in DigitalPetStore::Role::"Customer",
    action in [DigitalPetStore::Action::"GetOrder"],
    resource
) when {
    principal == resource.owner &&
    context.AccountCodes.contains(111122223333) &&
    context.approvedBy in DigitalPetStore::Role::"Employee" &&
    context.MfaAuthorized == true &&
    context.NetworkInfo.Country like "*United States*" &&
    context.NetworkInfo.IPAddress like "192.0.2.*" &&
    context.NetworkInfo.SSL == true &&
    context.RequestedOrderCount <= 4 &&
    context.UserAgent like "*My UserAgent*"
};
```

이제 주문 검색 요청이 요청에 추가한 추가 컨텍스트 조건을 충족해야 합니다.

1. 사용자는 MFA로 로그인해야 합니다.

1. 사용자의 웹 브라우저에는 문자열이 포함되어야 `User-Agent` 합니다`My UserAgent`.

1. 사용자가 4개 이하의 주문을 보도록 요청했어야 합니다.

1. 사용자의 계정 코드 중 하나는 여야 합니다`111122223333`.

1. 사용자의 IP 주소는 미국에서 시작되어야 하고, 암호화된 세션에 있어야 하며, IP 주소는 로 시작해야 합니다`192.0.2.`.

1. 직원은 주문을 승인해야 합니다. 권한 부여 요청의 `entities` 요소에서의 역할을 `Bob` 가진 사용자를 선언합니다`Employee`.

------
#### [ Request body ]

적절한 스키마 및 정책으로 정책 스토어를 구성한 후 Verified Permissions API 작업 [IsAuthorized](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorized.html)에이 권한 부여 요청을 제공할 수 있습니다. `entities` 세그먼트에는 역할이 인 사용자`Bob`인의 정의가 포함되어 있습니다`Employee`.

```
{
  "principal": {
    "entityType": "DigitalPetStore::User",
    "entityId": "Alice"
  },
  "action": {
    "actionType": "DigitalPetStore::Action",
    "actionId": "GetOrder"
  },
  "resource": {
    "entityType": "DigitalPetStore::Order",
    "entityId": "1234"
  },
  "context": {
    "contextMap": {
      "AccountCodes": {
        "set": [
          {"long": 111122223333},
          {"long": 444455556666},
          {"long": 123456789012}
        ]
      },
      "approvedBy": {
        "entityIdentifier": {
          "entityId": "Bob",
          "entityType": "DigitalPetStore::User"
        }
      },
      "MfaAuthorized": {
        "boolean": true
      },
      "NetworkInfo": {
        "record": {
          "Country": {"string": "United States of America"},
          "IPAddress": {"string": "192.0.2.178"},
          "SSL": {"boolean": true}
        }
      },
      "RequestedOrderCount":{
        "long": 4
      },
      "UserAgent": {
        "string": "My UserAgent 1.12"
      }
    }
  },
  "entities": {
    "entityList": [
      {
        "identifier": {
          "entityType": "DigitalPetStore::User",
          "entityId": "Alice"
        },
        "attributes": {
          "memberId": {
            "string": "801b87f2-1a5c-40b3-b580-eacad506d4e6"
          }
        },
        "parents": [
          {
            "entityType": "DigitalPetStore::Role",
            "entityId": "Customer"
          }
        ]
      },
      {
        "identifier": {
          "entityType": "DigitalPetStore::User",
          "entityId": "Bob"
        },
        "attributes": {
          "memberId": {
            "string": "49d9b81e-735d-429c-989d-93bec0bcfd8b"
          }
        },
        "parents": [
          {
            "entityType": "DigitalPetStore::Role",
            "entityId": "Employee"
          }
        ]
      },
      {
        "identifier": {
          "entityType": "DigitalPetStore::Order",
          "entityId": "1234"
        },
        "attributes": {
          "owner": {
            "entityIdentifier": {
              "entityType": "DigitalPetStore::User",
              "entityId": "Alice"
            }
          }
        },
        "parents": []
      }
     ]
   },
   "policyStoreId": "PSEXAMPLEabcdefg111111"
}
```

------

# Amazon Verified Permissions 테스트 벤치 사용
<a name="test-bench"></a>

Verified Permissions 테스트 벤치를 사용하여 [권한 부여 요청을](terminology.md#term-authorization-request) 실행하여 Verified Permissions 정책을 테스트하고 문제를 해결합니다. 테스트 벤치는 지정한 매개 변수를 사용하여 정책 스토어의 Cedar 정책이 요청을 승인할지 여부를 결정합니다. 권한 부여 요청을 테스트하는 동안 **비주얼 모드**와 **JSON 모드** 사이를 전환할 수 있습니다. Cedar 정책의 구조 및 평가 방법에 대한 자세한 내용은 Cedar 정책 언어 참조 가이드의 [Cedar의 기본 정책 구성](https://docs.cedarpolicy.com/policies/syntax-policy.html)을 참조하세요.

**참고**  
Verified Permissions를 사용하여 권한 부여를 요청하는 경우 **추가 엔터티** 섹션에 요청의 일부로 보안 주체 및 리소스 목록을 제공할 수 있습니다. 하지만 작업에 대한 세부 정보는 포함할 수 없습니다. 해당 정보는 스키마에 지정하거나 요청으로부터 유추해야 합니다. **추가 엔터티** 섹션에는 작업을 추가할 수 없습니다.

테스트 벤치의 시각적 개요 및 데모는 AWS YouTube 채널의 [Amazon Verified Permissions - Policy Creation and Testing(Primer Series \$13)](https://www.youtube.com/watch?v=Gi3joEySMPQ)을 참조하세요.

------
#### [ Visual mode ]

**참고**  
테스트 벤치의 **비주얼 모드**를 사용하려면 정책 스토어에 스키마가 정의되어 있어야 합니다.

**비주얼 모드에서 정책을 테스트하려면**

1. [Verified Permissions 콘솔](https://console.aws.amazon.com/verifiedpermissions/)을 엽니다. 정책 스토어를 선택합니다.

1. 왼쪽에 있는 탐색 창에서 **테스트 벤치**를 선택합니다.

1. **비주얼 모드**를 선택합니다.

1. **보안 주체** 섹션에서 스키마의 보안 주체 유형 중에서 **작업을 수행하는 보안 주체**를 선택합니다. 텍스트 상자에 보안 주체 식별자를 입력합니다.

1. (선택 사항) **상위 추가**를 선택하여 지정된 보안 주체에 대해 상위 엔터티를 추가합니다. 보안 주체에 추가된 상위 엔터티를 제거하려면 상위 엔터티 이름 옆에 있는 **제거**를 선택합니다.

1. 지정된 보안 주체의 각 속성에 대해 **속성 값**을 지정합니다. 테스트 벤치는 시뮬레이션된 권한 부여 요청에서 지정된 속성 값을 사용합니다.

1. **리소스** 섹션에서 **보안 주체가 작업을 수행하는 리소스**를 선택합니다. 텍스트 상자에 리소스 식별자를 입력합니다.

1. (선택 사항) **상위 추가**를 선택하여 지정된 리소스에 대해 상위 엔터티를 추가합니다. 리소스에 추가된 상위 엔터티를 제거하려면 상위 엔터티 이름 옆에 있는 **제거**를 선택합니다.

1. 지정된 리소스의 각 속성에 대해 **속성 값**을 지정합니다. 테스트 벤치는 시뮬레이션된 권한 부여 요청에서 지정된 속성 값을 사용합니다.

1. **작업** 섹션에서 지정된 보안 주체 및 리소스에 대한 유효한 작업 목록에서 **보안 주체가 수행하는 작업**을 선택합니다.

1. 지정된 작업의 각 속성에 대해 **속성 값**을 지정합니다. 테스트 벤치는 시뮬레이션된 권한 부여 요청에서 지정된 속성 값을 사용합니다.

1. (선택 사항) **추가 엔터티** 섹션에서 **엔터티 추가**를 선택하여 권한 부여 결정을 위해 평가할 엔터티를 추가합니다.

1. 드롭다운 목록에서 **엔터티 식별자**를 선택하고 엔터티 식별자를 입력합니다.

1. (선택 사항) **상위 추가**를 선택하여 지정된 엔터티에 대해 상위 엔터티를 추가합니다. 엔터티에 추가된 상위 엔터티를 제거하려면 상위 엔터티 이름 옆에 있는 **제거**를 선택합니다.

1. 지정된 엔터티의 각 속성에 대해 **속성 값**을 지정합니다. 테스트 벤치는 시뮬레이션된 권한 부여 요청에서 지정된 속성 값을 사용합니다.

1. **확인**을 선택하여 테스트 벤치에 엔터티를 추가합니다.

1. **권한 부여 요청 실행**을 선택하여 정책 스토어의 Cedar 정책에 대한 권한 부여 요청을 시뮬레이션합니다. 테스트 벤치에는 평가 중에 충족된 정책이나 발생한 오류에 대한 정보와 함께 요청 허용 또는 거부 결정이 표시됩니다.

------
#### [ JSON mode ]

**JSON 모드에서 정책을 테스트하려면**

1. [Verified Permissions 콘솔](https://console.aws.amazon.com/verifiedpermissions/)을 엽니다. 정책 스토어를 선택합니다.

1. 왼쪽에 있는 탐색 창에서 **테스트 벤치**를 선택합니다.

1. **JSON 모드**를 선택합니다.

1. **요청 세부 정보** 섹션에서 스키마가 정의되어 있는 경우 스키마의 보안 주체 유형 중에서 **작업을 수행하는 보안 주체**를 선택합니다. 텍스트 상자에 보안 주체 식별자를 입력합니다.

   스키마가 정의되지 않은 경우 **작업을 수행하는 보안 주체** 텍스트 상자에 보안 주체를 입력합니다.

1. 스키마가 정의되어 있는 경우 스키마의 리소스 유형에서 **리소스**를 선택합니다. 텍스트 상자에 리소스 식별자를 입력합니다.

   스키마가 정의되지 않은 경우 **리소스** 텍스트 상자에 리소스를 입력합니다.

1. 스키마가 정의되어 있는 경우 지정된 보안 주체 및 리소스에 대한 유효한 작업 목록에서 **작업**을 선택합니다.

   스키마가 정의되지 않은 경우 **작업** 텍스트 상자에 작업을 입력합니다.

1. **컨텍스트** 필드에 시뮬레이션 요청의 컨텍스트를 입력합니다. 요청 컨텍스트는 권한 부여 결정에 사용할 수 있는 추가 정보입니다.

1. **엔터티** 필드에 엔터티의 계층 구조 및 권한 부여 결정을 위해 평가할 속성을 입력합니다.

1. **권한 부여 요청 실행**을 선택하여 정책 스토어의 Cedar 정책에 대한 권한 부여 요청을 시뮬레이션합니다. 테스트 벤치에는 평가 중에 충족된 정책이나 발생한 오류에 대한 정보와 함께 요청 허용 또는 거부 결정이 표시됩니다.

------

# Amazon Verified Permissions 정책 예제
<a name="policies-examples"></a>

여기에 포함된 정책 예제 중 일부는 기본 Cedar 정책 예제이고 일부는 Verified Permissions에 따라 다릅니다. 기본 링크는 Cedar 정책 언어 참조 가이드에 연결되며 여기에 포함되어 있습니다. Cedar 정책 구문에 대한 자세한 내용은 Cedar 정책 언어 참조 가이드의 [Cedar 기본 정책 구성](https://docs.cedarpolicy.com/policies/syntax-policy.html)을 참조하세요.

**정책 예제**
+ [개별 엔터티에 대한 액세스 허용](https://docs.cedarpolicy.com/policies/policy-examples.html#allow-acces-indivuals)
+ [개체 그룹에 대한 액세스 허용](https://docs.cedarpolicy.com/policies/policy-examples.html#allow-acces-groups)
+ [모든 엔터티에 대한 액세스 허용](https://docs.cedarpolicy.com/policies/policy-examples.html#allow-any)
+ [개체의 속성에 대한 액세스 허용(ABAC)](https://docs.cedarpolicy.com/policies/policy-examples.html#allow-abac)
+ [액세스 거부](https://docs.cedarpolicy.com/policies/policy-examples.html#deny-access)
+ [대괄호 표기법을 사용하여 토큰 속성 참조](#policies-examples-brackets)
+ [점 표기법을 사용하여 속성 참조](#policies-examples-dot)
+ [Amazon Cognito ID 토큰 속성을 반영합니다.](#policies-examples-cognito-id)
+ [OIDC ID 토큰 속성을 반영합니다.](#policies-examples-oidc-id)
+ [Amazon Cognito 액세스 토큰 속성을 반영합니다.](#policies-examples-cognito-access)
+ [OIDC 액세스 토큰 속성을 반영합니다.](#policies-examples-oidc-access)

## 대괄호 표기법을 사용하여 토큰 속성 참조
<a name="policies-examples-brackets"></a>

다음 예제에서는 대괄호 표기법을 사용하여 토큰 속성을 참조하는 정책을 생성하는 방법을 보여줍니다.

Verified Permissions의 정책에서 토큰 속성을 사용하는 방법에 대한 자세한 내용은 스키[마에 Amazon Cognito 토큰 매핑 및 스키마에](cognito-map-token-to-schema.md) [OIDC 토큰 매핑을 참조하세요](oidc-map-token-to-schema.md).

```
permit (
    principal in MyCorp::UserGroup::"us-west-2_EXAMPLE|MyUserGroup",
    action,
    resource
) when {
    principal["cognito:username"] == "alice" &&
    principal["custom:employmentStoreCode"] == "petstore-dallas" &&
    principal has email && principal.email == "alice@example.com" &&
    context["ip-address"] like "192.0.2.*"
};
```

## 점 표기법을 사용하여 속성 참조
<a name="policies-examples-dot"></a>

다음 예제에서는 점 표기법을 사용하여 속성을 참조하는 정책을 생성하는 방법을 보여줍니다.

Verified Permissions의 정책에서 토큰 속성을 사용하는 방법에 대한 자세한 내용은 스키[마에 Amazon Cognito 토큰 매핑 및 스키마에](cognito-map-token-to-schema.md) [OIDC 토큰 매핑을 참조하세요](oidc-map-token-to-schema.md).

```
permit(principal, action, resource)
when {
    principal.cognito.username == "alice" &&
    principal.custom.employmentStoreCode == "petstore-dallas" &&
    principal.tenant == "x11app-tenant-1" &&
    principal has email && principal.email == "alice@example.com"
};
```

## Amazon Cognito ID 토큰 속성을 반영합니다.
<a name="policies-examples-cognito-id"></a>

다음 예제에서는 정책 참조 ID 토큰 속성을 생성하는 방법을 보여줍니다 Amazon Cognito.

Verified Permissions의 정책에서 토큰 속성을 사용하는 방법에 대한 자세한 내용은 스키[마에 Amazon Cognito 토큰 매핑 및 스키마에](cognito-map-token-to-schema.md) [OIDC 토큰 매핑을 참조하세요](oidc-map-token-to-schema.md).

```
permit (
    principal in MyCorp::UserGroup::"us-west-2_EXAMPLE|MyUserGroup",
    action,
    resource
) when {
    principal["cognito:username"] == "alice" &&
    principal["custom:employmentStoreCode"] == "petstore-dallas" &&
    principal.tenant == "x11app-tenant-1" &&
    principal has email && principal.email == "alice@example.com"
};
```

## OIDC ID 토큰 속성을 반영합니다.
<a name="policies-examples-oidc-id"></a>

다음 예제에서는 정책 참조를 생성하여 OIDC 공급자의 ID 토큰 속성을 참조하는 방법을 보여줍니다.

Verified Permissions의 정책에서 토큰 속성을 사용하는 방법에 대한 자세한 내용은 [Amazon Cognito 토큰을 스키마에 매핑](cognito-map-token-to-schema.md) 및 [OIDC 토큰을 스키마에 매핑을 참조하세요](oidc-map-token-to-schema.md).

```
permit (
    principal in MyCorp::UserGroup::"MyOIDCProvider|MyUserGroup",
    action,
    resource
) when {
    principal.email_verified == true && principal.email == "alice@example.com" &&
    principal.phone_number_verified == true && principal.phone_number like "+1206*"
};
```

## Amazon Cognito 액세스 토큰 속성을 반영합니다.
<a name="policies-examples-cognito-access"></a>

다음 예제에서는 정책 참조 액세스 토큰 속성을 생성하는 방법을 보여줍니다 Amazon Cognito.

Verified Permissions의 정책에서 토큰 속성을 사용하는 방법에 대한 자세한 내용은 스키[마에 Amazon Cognito 토큰 매핑 및 스키마에](cognito-map-token-to-schema.md) [OIDC 토큰 매핑을 참조하세요](oidc-map-token-to-schema.md).

```
permit(principal, action in [MyApplication::Action::"Read", MyApplication::Action::"GetStoreInventory"], resource)
when { 
    context.token.client_id == "52n97d5afhfiu1c4di1k5m8f60" &&
    context.token.scope.contains("MyAPI/mydata.write")
};
```

## OIDC 액세스 토큰 속성을 반영합니다.
<a name="policies-examples-oidc-access"></a>

다음 예제에서는 OIDC 공급자의 액세스 토큰 속성을 참조하는 정책을 생성하는 방법을 보여줍니다.

Verified Permissions의 정책에서 토큰 속성을 사용하는 방법에 대한 자세한 내용은 스키[마에 Amazon Cognito 토큰 매핑 및 스키마에](cognito-map-token-to-schema.md) [OIDC 토큰 매핑을 참조하세요](oidc-map-token-to-schema.md).

```
permit(
    principal, 
    action in [MyApplication::Action::"Read", MyApplication::Action::"GetStoreInventory"],
    resource
)
when { 
    context.token.client_id == "52n97d5afhfiu1c4di1k5m8f60" &&
    context.token.scope.contains("MyAPI-read")
};
```