

# IAM JSON 정책 요소: Condition
<a name="reference_policies_elements_condition"></a>

`Condition` 요소(또는 `Condition` *블록*)를 사용하여 정책의 효력이 발생하는 시점에 대한 조건을 지정할 수 있습니다. `Condition` 요소는 옵션입니다. `Condition` 요소에서 [조건 연산자](reference_policies_elements_condition_operators.md)(같음, 보다 작음 등)를 사용하여 정책의 컨텍스트 키 및 값을 요청 컨텍스트의 키 및 값과 일치시키는 표현식을 작성합니다. 요청 컨텍스트에 대한 자세한 내용은 [요청 구성 요소](intro-structure.md#intro-structure-request) 섹션을 참조하세요.

```
"Condition" : { "{condition-operator}" : { "{condition-key}" : "{condition-value}" }}
```

정책 조건에서 지정하는 컨텍스트 키는 [전역 조건 컨텍스트 키](reference_policies_condition-keys.md) 또는 서비스별 컨텍스트 키일 수 있습니다. 전역 조건 컨텍스트 키에는 `aws:` 접두사가 있습니다. 서비스별 컨텍스트 키에는 서비스 접두사가 있습니다. 예를 들어, Amazon EC2를 사용하면 `ec2:InstanceType` 컨텍스트 키를 사용하여 해당 서비스에 고유한 조건을 작성할 수 있습니다. `iam:` 접두사가 있는 서비스별 IAM 컨텍스트 키를 보려면 [IAM 및 AWS STS 조건 컨텍스트 키](reference_policies_iam-condition-keys.md) 섹션을 참조하세요.

컨텍스트 키 **이름은 대/소문자를 구분하지 않습니다. 예를 들어 `aws:SourceIP` 컨텍스트 키를 포함시키는 것은 `AWS:SourceIp`에 대한 테스트와 동일합니다. 컨텍스트 키 **값의 대/소문자 구분은 사용하는 [조건 연산자](reference_policies_elements_condition_operators.md)에 따라 다릅니다. 예를 들어 다음 조건에는 `john`의 요청만 일치하도록 하는 `StringEquals` 연산자가 포함됩니다. 이름이 `John`인 사용자는 액세스가 거부됩니다.

```
"Condition" : { "StringEquals" : { "aws:username" : "john" }}
```

다음 조건은 [`StringEqualsIgnoreCase`](reference_policies_elements_condition_operators.md#Conditions_String) 연산자를 사용하여 이름이 `john` 또는 `John`인 사용자와 일치합니다.

```
"Condition" : { "StringEqualsIgnoreCase" : { "aws:username" : "john" }}
```

일부 컨텍스트 키는 키 이름의 특정 부분을 지정하도록 허용하는 키 값 페어를 지원합니다. [`aws:RequestTag/tag-key`](reference_policies_condition-keys.md#condition-keys-requesttag) 컨텍스트 키, AWS KMS [https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context) 및 여러 서비스에서 지원하는 [`ResourceTag/tag-key`](reference_policies_condition-keys.md#condition-keys-resourcetag) 컨텍스트 키가 그 예입니다.
+ [Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policy-structure.html#amazon-ec2-keys)와 같은 서비스에 대해 `ResourceTag/tag-key` 컨텍스트 키를 사용하는 경우 `tag-key`에 대한 키 이름을 지정해야 합니다.
+ **키 이름은 대/소문자를 구분하지 않습니다.** 따라서 정책의 조건 요소에서 `"aws:ResourceTag/TagKey1": "Value1"` 지정을 완료한 경우 조건은 이름이 `TagKey1` 또는 `tagkey1`인 리소스 태그 키와 일치하지만 두 가지 모두와 일치하지는 않습니다.
+ 이러한 속성을 지원하는 AWS 서비스를 사용하면 대소문자만 다른 여러 키 이름을 생성할 수 있습니다. 예를 들어, `ec2=test1`와(과) `EC2=test2`을(를) 사용해 Amazon EC2 인스턴스에 태그를 지정할 수 있습니다. `"aws:ResourceTag/EC2": "test1"` 같은 조건을 사용하여 리소스에 대한 액세스를 허용하는 경우 키 이름은 두 태그 모두와 일치하지만, 하나의 값만 일치합니다. 이로 인해 예기치 않은 조건 실패가 발생할 수 있습니다.

**중요**  
모범 사례로서 키 값 페어 속성 이름을 지정할 때 계정의 멤버가 일관적인 명명 규칙을 따르도록 해야 합니다. 예를 들어 태그 또는 AWS KMS 암호화 컨텍스트가 여기에 해당합니다. 태그 지정에 대해 [`aws:TagKeys`](reference_policies_condition-keys.md#condition-keys-tagkeys) 컨텍스트 키를 사용하거나 AWS KMS 암호화 컨텍스트에 대해 [https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context-keys](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context-keys) 사용을 통해 이를 적용할 수 있습니다.
+ 모든 조건 연산자의 목록과 각 연산자의 작동 방식에 대한 설명을 보려면 [조건 연산자](reference_policies_elements_condition_operators.md)를 참조하세요.
+ 달리 지정하지 않는 경우 모든 컨텍스트 키는 다수의 값을 가질 수 있습니다. 다수의 값을 가진 컨텍스트 키를 취급하는 방법에 대한 설명은 [다중 값 컨텍스트 키에 대한 연산자 설정](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys) 섹션을 참조하세요.
+ 전역에서 사용 가능한 모든 컨텍스트 키의 목록은 [AWS 글로벌 조건 컨텍스트 키](reference_policies_condition-keys.md) 섹션을 참조하세요.
+ 각 서비스에서 정의하는 조건 컨텍스트 키는 [AWS 서비스에 사용되는 작업, 리소스 및 조건 키](reference_policies_actions-resources-contextkeys.html)를 참조하세요.

## 요청 컨텍스트
<a name="AccessPolicyLanguage_RequestContext"></a>

[보안 주체](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#principal)가 AWS에 [요청](intro-structure.md#intro-structure-request)하면 AWS는 요청 정보를 요청 컨텍스트로 수집합니다. 요청 컨텍스트에는 위탁자, 리소스, 작업 및 기타 환경 속성에 대한 정보가 포함됩니다. 정책 평가는 정책의 속성과 요청에서 전송된 속성을 일치시켜 AWS에서 수행할 수 있는 작업을 평가하고 승인합니다.

JSON 정책의 `Condition` 요소를 사용하여 요청 컨텍스트에 대해 특정 컨텍스트 키를 테스트할 수 있습니다. 예를 들어, [사용자가 특정 날짜 범위 중에만 작업을 수행할 수 있도록](reference_policies_examples_aws-dates.md) [aws:CurrentTime](reference_policies_condition-keys.md#condition-keys-currenttime) 컨텍스트 키를 사용하는 정책을 생성할 수 있습니다.

다음 예제에서는 Martha Rivera가 MFA 디바이스를 비활성화하기 위해 요청을 전송하는 요청 컨텍스트의 표현을 보여줍니다.

```
Principal: AROA123456789EXAMPLE
Action: iam:DeactivateMFADevice
Resource: arn:aws:iam::user/martha
Context:
  – aws:UserId=AROA123456789EXAMPLE:martha
  – aws:PrincipalAccount=1123456789012
  – aws:PrincipalOrgId=o-example
  – aws:PrincipalARN=arn:aws:iam::1123456789012:assumed-role/TestAR
  – aws:MultiFactorAuthPresent=true
  – aws:MultiFactorAuthAge=2800
  – aws:CurrentTime=...
  – aws:EpochTime=...
  – aws:SourceIp=...
```

요청 컨텍스트는 사용자가 지난 1시간(3,600초) 동안 MFA를 사용하여 로그인한 경우에만 자신의 다중 인증(MFA) 디바이스를 제거할 수 있도록 하는 정책과 일치합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid": "AllowRemoveMfaOnlyIfRecentMfa",
        "Effect": "Allow",
        "Action": [
            "iam:DeactivateMFADevice"
        ],
        "Resource": "arn:aws:iam::*:user/${aws:username}",
        "Condition": {
            "NumericLessThanEquals": {"aws:MultiFactorAuthAge": "3600"}
        }
    }
}
```

------

이 예제에서 정책은 요청 컨텍스트와 일치합니다. 작업은 동일하고, 리소스는 ‘\$1’ 와일드카드와 일치하며, `aws:MultiFactorAuthAge`의 값은 3,600보다 작은 2,800이므로 정책은 이 권한 부여 요청을 허용합니다.

AWS는 정책의 각 컨텍스트 키를 평가하고 *true* 또는 *false* 값을 반환합니다. 요청에 없는 컨텍스트 키는 불일치로 간주됩니다.

요청 컨텍스트는 다음 값을 반환할 수 있습니다.
+ **True** - 요청자가 지난 1시간 이내에 MFA를 사용하여 로그인한 경우 조건은 *true*를 반환합니다.
+ **False** - 요청자가 1시간 이전에 MFA를 사용하여 로그인한 경우 조건은 *false*를 반환합니다.
  + **Not present** - 요청자가 AWS CLI 또는 AWS API에서 IAM 사용자 액세스 키를 사용하여 요청한 경우 키가 존재하지 않습니다. 이 경우 키가 존재하지 않으므로 일치하지 않습니다.

**참고**  
어떤 경우에는 조건 키 값이 없어도 조건이 true를 반환할 수 있습니다. 예를 들어 `ForAllValues` 한정자를 추가하면 컨텍스트 키가 요청에 없으면 요청이 true를 반환합니다. 누락된 컨텍스트 키 또는 값이 비어 있는 컨텍스트 키를 true로 평가하지 않도록 정책에서 [Null 조건 연산자](reference_policies_elements_condition_operators.md#Conditions_Null)를 `false` 값과 함께 포함하여 컨텍스트 키가 존재하고 해당 값이 Null이 아닌지 확인할 수 있습니다.

## 조건 블록
<a name="AccessPolicyLanguage_ConditionBlock"></a>

다음은 `Condition` 요소의 기본 형식을 나타낸 예제입니다.

```
"Condition": {"StringLike": {"s3:prefix": ["jane/*"]}}
```

요청 값은 컨텍스트 키로 표현되며, 여기에서는 `s3:prefix`가 요청 값에 해당합니다. 컨텍스트 키 값은 `jane/*`와(과) 같이 리터럴 값으로 지정하는 값과 비교됩니다. 비교 유형은 [조건 연산자](reference_policies_elements_condition_operators.md)에서 지정합니다(여기서는 `StringLike`). equals, greater than 및 less than과 같은 일반적인 부울 비교를 사용하여 문자열, 날짜, 숫자 등을 비교하는 조건을 만들 수 있습니다. [문자열 연산자](reference_policies_elements_condition_operators.md#Conditions_String) 또는 [ARN 연산자](reference_policies_elements_condition_operators.md#Conditions_ARN)를 사용하는 경우 컨텍스트 키 값에 [정책 변수](reference_policies_variables.md)를 사용할 수도 있습니다. 다음 예에는 `aws:username` 변수가 포함되어 있습니다.

```
"Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}
```

컨텍스트 키에 다수의 값을 추가할 수 있는 경우도 있습니다. 예를 들어 Amazon DynamoDB에 대한 요청에서는 다수의 테이블 속성 반환이나 업데이트를 요청할 수 있습니다. DynamoDB 테이블에 대한 액세스 정책에 따르면 `dynamodb:Attributes` 컨텍스트 키를 추가하여 요청 시 나열되는 모든 속성 저장이 가능합니다. `Condition` 요소의 설정 연산자를 사용하여 정책에 허용된 속성 목록과 요청에 포함된 속성 여러 가지를 비교함으로써 테스트할 수 있습니다. 자세한 내용은 [다중 값 컨텍스트 키에 대한 연산자 설정](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys) 섹션을 참조하세요.

요청 단계에서 정책을 평가할 때는 AWS가 키를 해당하는 요청 값으로 변환합니다. (이 예제에서는 AWS가 요청 날짜와 시간을 사용합니다). 조건 평가에 따라 true 또는 false가 반환되고, 이후 이 조건 평가 결과를 고려하여 정책 전반적인 요청 허용 또는 거부 여부를 결정합니다.

### 다수의 조건 값
<a name="Condition-multiple-conditions"></a>

`Condition` 요소에는 여러 조건 연산자를 추가할 수 있으며, 각 조건 연산자마다 다수의 컨텍스트 키-값 페어가 포함될 수 있습니다. 다음은 이것을 설명한 그림입니다.

![\[두 개의 조건 연산자 블록 다이어그램. 첫 번째 블록에는 각각 여러 값이 있는 2개의 컨텍스트 키 자리표시자가 있습니다. 두 번째 조건 블록에는 여러 값이 있는 컨텍스트 키 1개가 포함되어 있습니다.\]](http://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/images/AccessPolicyLanguage_Condition_Block.diagram.png)


자세한 내용은 [다중 값 컨텍스트 키에 대한 연산자 설정](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys) 섹션을 참조하세요.