

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

# 컨텍스트 추가
<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"
}
```

------