

# 단일 값 vs. 다중 값 컨텍스트 키
<a name="reference_policies_condition-single-vs-multi-valued-context-keys"></a>

단일 값 및 다중 값 컨텍스트 키의 차이점은 정책 조건의 값 수가 아니라 [요청 컨텍스트](intro-structure.md#intro-structure-request)의 값 수에 있습니다.
+ **단일 값 조건 컨텍스트 키는 요청 컨텍스트에서 최대 하나의 값을 갖습니다. 예를 들어 AWS에서 리소스에 태그를 지정하면 각 리소스 태그가 키 값 페어로 저장됩니다. 리소스 태그 키는 단일 태그 값만 가질 수 있으므로 [aws:ResourceTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-resourcetag)는 단일 값 컨텍스트 키입니다. 단일 값 컨텍스트 키에는 조건 집합 연산자를 사용하지 마세요.
+ **다중 값 조건 컨텍스트 키는 요청 컨텍스트에서 여러 값을 가질 수 있습니다. 예를 들어, AWS에서 리소스에 태그를 지정하면 단일 요청에 여러 태그 키 값 페어를 포함할 수 있습니다. 따라서 [aws:TagKeys](reference_policies_condition-keys.md#condition-keys-tagkeys)는 다중 값 컨텍스트 키입니다. 다중 값 컨텍스트 키에는 조건 집합 연산자가 필요합니다.

예를 들어, 요청은 최대 하나의 VPC 엔드포인트에서 시작될 수 있으므로 [aws:SourceVpce](reference_policies_condition-keys.md#condition-keys-sourcevpce)의 경우 단일 값 컨텍스트 키입니다. 서비스에는 서비스에 속한 서비스 보안 주체 이름이 두 개 이상 있을 수 있으므로 [aws:PrincipalServiceNamesList](reference_policies_condition-keys.md#condition-keys-principalservicenameslist)의 경우 다중 값 컨텍스트 키입니다.

**중요**  
단일 값 컨텍스트 키와 다중 값 컨텍스트 키의 차이는 정책 조건의 값 수가 아니라 요청 컨텍스트의 값 수에 따라 달라집니다.

## 중요 사항
<a name="reference_policies_condition-key-points"></a>
+ **단일 값 및 **다중 값 분류는 [AWS 글로벌 조건 컨텍스트 키](reference_policies_condition-keys.md) 주제의 **값 유형으로 각 조건 컨텍스트 키의 설명에 포함됩니다.
+ [서비스 권한 부여 참조](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html)의 다중 값 컨텍스트 키는 `ArrayOf` 접두사 뒤에 조건 연산자 범주 유형(예: `ArrayOfString` 또는 `ArrayOfARN`)을 사용하여 요청에 조건 컨텍스트 키에 대한 여러 값이 포함될 수 있음을 나타냅니다.
+ 사용 가능한 단일 값 컨텍스트 키를 정책 변수로 사용할 수 있습니다. 하지만 다중 값 컨텍스트 키는 정책 변수로 사용할 수 없습니다. 정책 변수에 대한 자세한 내용은 [IAM 정책 요소: 변수 및 태그](reference_policies_variables.md) 섹션을 참조하세요.
+ 키 값 페어가 포함된 컨텍스트 키를 사용하는 경우 태그 키 값이 여러 개 있을 수 있지만 각 `tag-key`에는 하나의 값만 보유할 수 있습니다.
  + [aws:PrincipalTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-principaltag), [aws:RequestTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-requesttag) 및 [aws:ResourceTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-resourcetag)는 단일 값 컨텍스트 키입니다.
  + [aws:TagKeys](reference_policies_condition-keys.md#condition-keys-tagkeys)는 요청에서 허용되는 태그 키를 정의하지만 태그 키 값은 포함하지 않습니다. 요청에 여러 개의 태그 키 값 페어를 포함할 수 있으므로 `aws:TagKeys`는 다중 값 컨텍스트 키가 될 수 있습니다.
+ 다중 값 컨텍스트 키에는 조건 집합 연산자가 필요합니다. 단일 값 컨텍스트 키에는 조건 집합 연산자 `ForAllValues` 또는 `ForAnyValue`를 사용하지 마세요. 단일 값 컨텍스트 키와 함께 조건 집합 연산자를 사용하면 정책이 과도하게 허용될 수 있습니다.

## 다중 값 컨텍스트 키에 대한 연산자 설정
<a name="reference_policies_condition-multi-valued-context-keys"></a>

조건 컨텍스트 키를 여러 키 값이 있는 [요청 컨텍스트](intro-structure.md#intro-structure-request)와 비교하려면 `ForAllValues` 또는 `ForAnyValue` 집합 연산자를 사용해야 합니다. 이러한 집합 연산자는 요청의 태그 집합 및 정책 조건의 태그 집합과 같이 두 값 집합을 비교하는 데 사용됩니다.

`ForAllValues` 및 `ForAnyValue` 한정자는 조건 연산자에 집합 연산 기능을 추가하므로 여러 값이 포함된 요청 컨텍스트 키를 정책 조건의 여러 컨텍스트 키 값에 대해 테스트할 수 있습니다. 또한 와일드카드 또는 변수를 사용하여 정책에 다중 값 문자열 컨텍스트 키를 포함하는 경우 `StringLike` [조건 연산자](reference_policies_elements_condition_operators.md#Conditions_String)를 사용해야 합니다. 여러 조건 키 값은 [배열](reference_policies_grammar.md#policies-grammar-json)처럼 대괄호로 묶어야 합니다(예: `"Key2":["Value2A", "Value2B"]`).

### ForAllValues
<a name="reference_policies_condition-forallvalues"></a>

`ForAllValues` 한정자는 요청 컨텍스트의 모든 멤버 값이 한정자를 따르는 조건 연산자와 일치하는지 테스트합니다. 요청의 모든 컨텍스트 키 값이 정책에 있는 컨텍스트 키 값과 일치하면 조건이 `true`를 반환합니다. 요청에 컨텍스트 키가 없는 경우에도 `true`를 반환합니다.

**중요**  
`Allow` 효과와 함께 `ForAllValues`를 사용하는 경우 요청 컨텍스트에 누락된 컨텍스트 키가 예상치 못하게 존재하면 지나치게 허용적일 수 있으므로 주의하세요. 항상 정책의 [`Null`](reference_policies_elements_condition_operators.md#Conditions_Null) 조건 연산자에 `false` 값을 포함하여 컨텍스트 키가 존재하는지와 그 값이 null이 아닌지 확인해야 합니다. 문제 해결 예는 [태그 키를 기반으로 액세스 제어](access_tags.md#access_tags_control-tag-keys)을(를) 참조하세요.

#### ForAllValues 세트 연산자 예제
<a name="reference_policies_condition-forallvalues-example"></a>

다음 예제에서는 사용자가 EC2 인스턴스에 할당된 특정 태그를 삭제할 수 있도록 aws:TagKeys와 함께 ForAllValues를 사용합니다. 이 정책을 사용하면 사용자는 `environment` 및 `cost-center` 태그만 삭제할 수 있습니다. 이러한 태그를 개별적으로 또는 함께 삭제할 수 있습니다. 요청의 태그 키는 정책의 지정된 키와 정확히 일치해야 합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:DeleteTags",
            "Resource": "arn:aws:ec2:us-east-1:{{111122223333}}:instance/*",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "aws:TagKeys": [
                        "environment",
                        "cost-center"
                    ]
                },
                "Null": {
                    "aws:TagKeys": "false"
                }
            }
        }
    ]
}
```

------

다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다.


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment</pre>  | **일치 항목 있음** | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – cost-center</pre>  | **일치 항목 있음** | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – cost-center</pre>  | **일치 항목 있음** | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – dept</pre>  | **일치 항목 없음** | 
|  <pre>"ForAllValues:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />},<br />"Null": {<br />  "aws:TagKeys": "false"<br />}</pre>  | 요청 컨텍스트에 `aws:TagKeys`가 없습니다. | **일치 항목 없음** | 

마지막 예제에서 결과가 '일치 항목 없음'입니다. 이는 컨텍스트 키가 누락된 경우 Null 조건 검사에서 일치를 방지하기 때문입니다. 이는 지나치게 허용적인 정책을 피하는 가장 좋은 방법입니다.

### ForAnyValue
<a name="reference_policies_condition-foranyvalue"></a>

`ForAnyValue` 한정자는 요청 컨텍스트 키 값 집합에서 하나 이상의 멤버가 정책 조건의 컨텍스트 키 값 세트에서 하나 이상의 멤버와 일치하는지 테스트합니다. 요청의 컨텍스트 키 값 중 하나가 정책의 컨텍스트 키 값 중 하나와 일치하면 조건은 `true`를 반환합니다. 일치하는 컨텍스트 키가 없거나 키가 존재하지 않는 경우 조건은 `false`를 반환합니다.

**중요**  
`Deny` 효과와 함께 `ForAnyValue`를 사용하는 경우 요청에 컨텍스트 키가 없으면 정책은 **일치 항목 없음**으로 평가합니다. 일관된 동작을 위해 정책에 명시적 [`Null`](reference_policies_elements_condition_operators.md#Conditions_Null) 조건 검사를 추가하여 컨텍스트 키가 있는지 확인하세요. 자세한 내용은 [조건 키의 존재를 확인하는 조건 연산자](reference_policies_elements_condition_operators.md#Conditions_Null)을 참조하세요.

#### ForAnyValue 세트 연산자 예제
<a name="reference_policies_condition-foranyvalue-example"></a>

다음 예제에서는 사용자가 EC2 인스턴스에 할당된 특정 태그를 삭제할 수 있도록 aws:TagKeys와 함께 ForAnyValue를 사용합니다. 이 정책을 사용하면 요청에 지정된 태그 키에 `environment` 또는 `cost-center`가 포함된 경우 사용자가 인스턴스의 태그를 삭제할 수 있습니다. 요청에는 정책에 지정된 것 외에 추가 태그 키가 포함될 수 있지만, 조건과 일치하려면 지정된 키 중 하나 이상을 포함해야 합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:DeleteTags",
            "Resource": "arn:aws:ec2:us-east-1:{{111122223333}}:instance/*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:TagKeys": [
                        "environment",
                        "cost-center"
                    ]
                }
            }
        }
    ]
}
```

------

다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다.


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment</pre>  | **일치 항목 있음** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – cost-center</pre>  | **일치 항목 있음** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – cost-center</pre>  | **일치 항목 있음** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – dept</pre>  | **일치 항목 있음** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – dept</pre>  | **일치 항목 없음** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": [<br />    "environment",<br />    "cost-center"<br />  ]<br />}</pre>  | 요청 컨텍스트에 `aws:TagKeys`가 없습니다. | **일치 항목 없음** | 