

# IAM JSON 정책 요소 참조
<a name="reference_policies_elements"></a>

JSON 정책 문서는 여러 요소로 구성됩니다. 여기에 나열되는 요소들은 정책에서 사용되는 일반적인 순서를 따릅니다. 요소 순서는 중요하지 않습니다.예를 들어 `Resource` 요소는 `Action` 요소 앞에 올 수 있습니다. 또한 정책에서 `Condition` 요소는 지정하지 않아도 됩니다. JSON 정책 문서의 일반적인 구조와 목적에 대해 자세히 알아보려면 [JSON 정책 개요](access_policies.md#access_policies-json)를 참조하세요.

일부 JSON 정책 요소는 함께 사용할 수 없습니다. 즉, 둘 다 사용하는 정책을 생성할 수 없습니다. 예를 들어 동일한 정책 문에서 `Action`과 `NotAction` 둘 다 사용할 수 없습니다. 함께 사용할 수 없는 다른 쌍에는 `Principal`/`NotPrincipal` 및 `Resource`/`NotResource`가 있습니다.

정책 세부 정보는 서비스에서 유효한 작업이나 추가되는 리소스 유형 등에 따라 각 서비스마다 차이가 있습니다. 따라서 특정 서비스에 맞는 정책을 작성할 때는 해당 서비스의 정책 예제를 살펴보는 것이 좋습니다. IAM을 지원하는 모든 서비스 목록을 비롯해 각 서비스의 IAM 및 정책 설명서 링크는 [AWS IAM으로 작업하는 서비스](reference_aws-services-that-work-with-iam.md) 섹션을 참조하세요.

 JSON 정책을 생성하거나 편집할 때 IAM은 효과적인 정책을 생성하는 데 도움이 되는 정책 검증을 수행할 수 있습니다. IAM은 JSON 구문 오류를 식별하는 반면, IAM Access Analyzer는 정책을 더욱 구체화하는 데 도움이 되는 권장 사항과 함께 추가 정책 검사를 제공합니다. 정책 검증에 대한 자세한 내용은 [IAM 정책 검증](access_policies_policy-validator.md) 섹션을 참조하세요. IAM Access Analyzer 정책 검사기 및 실행 가능한 권장 사항에 대한 자세한 내용은 [IAM Access Analyzer 정책 검증](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)을 참조하세요.

**Topics**
+ [Version](reference_policies_elements_version.md)
+ [Id](reference_policies_elements_id.md)
+ [Statement](reference_policies_elements_statement.md)
+ [Sid](reference_policies_elements_sid.md)
+ [Effect](reference_policies_elements_effect.md)
+ [Principal](reference_policies_elements_principal.md)
+ [NotPrincipal](reference_policies_elements_notprincipal.md)
+ [Action](reference_policies_elements_action.md)
+ [NotAction](reference_policies_elements_notaction.md)
+ [Resource](reference_policies_elements_resource.md)
+ [NotResource](reference_policies_elements_notresource.md)
+ [Condition](reference_policies_elements_condition.md)
+ [변수와 태그](reference_policies_variables.md)
+ [지원되는 데이터 유형](reference_policies_elements_datatypes.md)

# IAM JSON 정책 요소: Version
<a name="reference_policies_elements_version"></a>

**동음이의어 참고**  
`Version` JSON 정책 요소는 *정책 버전*과 다릅니다. `Version` 정책 요소는 정책 내에서 사용되며 정책 언어의 버전을 정의합니다. 반면에 정책 버전은 IAM에서 고객 관리형 정책을 변경할 때 생성됩니다. 변경된 정책은 기존 정책을 덮어쓰지 않습니다. 대신 IAM에서 관리형 정책의 새 버전을 생성합니다. 관리형 정책에서 사용할 수 있는 여러 버전 지원에 대한 정보를 찾고 있다면 [IAM 정책 버전 관리](access_policies_managed-versioning.md) 섹션을 참조하세요.

`Version` 정책 요소는 정책의 처리에 사용할 언어 구문 규칙을 지정합니다. 사용 가능한 모든 정책 기능을 사용하려면 모든 정책의 `Statement` 요소 **외부**에 다음 `Version` 요소를 포함시킵니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*"
    }
  ]
}
```

------

IAM은 다음과 같은 `Version` 요소 값을 지원합니다.
+ `2012-10-17`. 이 값은 정책 언어의 현재 버전이며, 항상 `Version` 요소를 포함하여 `2012-10-17`로 설정해야 합니다. 그렇지 않으면 이 버전에 채택되지 않은 [정책 변수](reference_policies_variables.md) 등의 기능을 사용할 수 없습니다.
+ `2008-10-17`. 이 값은 이전 정책 언어 버전입니다. 따라서 오래된 기존 정책에서는 이 버전이 표시될 수도 있습니다. 새로운 정책에서는 또는 기존 정책을 업데이트하는 경우에는 이 버전을 사용하지 마세요. 정책 변수와 같은 최신 기능이 사용자의 정책에서 작동하지 않습니다. 예를 들어 `${aws:username}` 같은 변수가 정책에서 변수로 인식되지 않고 리터럴 문자열로 취급됩니다.

# IAM JSON 정책 요소: Id
<a name="reference_policies_elements_id"></a>

`Id` 요소는 정책 식별자(옵션)를 지정합니다. 다른 서비스의 ID 사용 방법과는 다릅니다. ID는 리소스 기반 정책에서는 허용되지만 ID 기반 정책에서는 사용할 수 없습니다.

`ID` 요소를 설정할 수 있는 서비스의 경우에는 UUID(GUID)를 값으로 사용하거나, UUID를 ID 일부로 사용하여 고유성을 확보하는 것이 좋습니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "cd3ad3d9-2776-4ef1-a904-4c229d1642ee",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*"
    }
  ]
}
```

------

**참고**  
AWS 서비스(예: Amazon SQS 또는 Amazon SNS 등) 중에는 이 요소가 필요하거나 고유성 요건을 따로 요구하는 경우도 있습니다. 정책 작성에 대한 서비스별 정보는 이용하려는 서비스의 설명서를 참조하세요.

# IAM JSON 정책 요소: Statement
<a name="reference_policies_elements_statement"></a>

`Statement` 요소는 정책의 주요 요소로서 필수입니다. `Statement` 요소는 단일 문 또는 개별 문의 배열을 포함할 수 있습니다. 각 개별 문 블록은 중괄호 \$1 \$1로 묶어야 합니다. 여러 문의 경우 배열은 대괄호 [ ]로 묶어야 합니다.

```
"Statement": [{...},{...},{...}]
```

다음은 단일 `Statement` 요소에서 3개의 문이 하나의 배열을 이루는 정책을 나타낸 예제입니다 (이 정책에서는 Amazon S3 콘솔에서 자신의 'home 폴더'에 액세스할 수 있습니다). 정책에는 `aws:username` 변수가 추가되었습니다. 이 변수는 정책 평가 중 요청이 있으면 사용자 이름으로 바뀝니다. 자세한 내용은 [소개](reference_policies_variables.md#policy-vars-intro) 섹션을 참조하세요.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation"
      ],
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
      "Condition": {"StringLike": {"s3:prefix": [
        "",
        "home/",
        "home/${aws:username}/"
      ]}}
    },
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/home/${aws:username}",
        "arn:aws:s3:::amzn-s3-demo-bucket/home/${aws:username}/*"
      ]
    }
  ]
}
```

------

# IAM JSON 정책 요소: Sid
<a name="reference_policies_elements_sid"></a>

정책 문에 입력되는 식별자(선택 사항)로 `Sid`(문 ID)를 제공할 수 있습니다. `Sid` 값은 문 배열에서 각 문에 할당할 수 있습니다. `Sid` 값을 정책 문에 대한 설명으로 사용할 수 있습니다. SQS나 SNS처럼 `ID` 요소를 지정할 수 있는 서비스에서는 `Sid` 값이 정책 문서 ID의 하위 ID나 마찬가지입니다. IAM에서 `Sid` 값은 JSON 정책 내 고유성이 보장되어야 합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ExampleStatementID",
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*"
    }
  ]
}
```

------

`Sid` 요소는 ASCII 대문자(A\$1Z), 소문자(a\$1z) 및 숫자(0\$19)를 지원합니다.

IAM에서 `Sid`는 IAM API에 노출되지 않습니다. 따라서 이 ID를 근거로 특정 문을 가져올 수는 없습니다.

**참고**  
AWS 서비스(예: Amazon SQS 또는 Amazon SNS 등) 중에는 이 요소가 필요하거나 고유성 요건을 따로 요구하는 경우도 있습니다. 정책 작성에 대한 서비스별 정보는 이용하려는 서비스의 설명서를 참조하세요.

# IAM JSON 정책 요소: Effect
<a name="reference_policies_elements_effect"></a>

`Effect` 요소는 필수로서, 문의 허용(allow) 또는 명시적 거부(explicit deny) 중 하나를 지정합니다. `Effect` 유효값은 `Allow` 및 `Deny`입니다. `Effect` 값은 대소문자를 구분합니다.

```
"Effect":"Allow"
```

기본적으로 리소스 액세스는 거부됩니다. 리소스 액세스를 허용하려면 `Effect` 요소를 `Allow`로 설정해야 합니다. 허용을 재정의하려면(예: 그 밖에 다른 방법으로 실행 중인 허용을 재정의하려면) `Effect` 요소를 `Deny`로 설정합니다. 자세한 내용은 [정책 평가 로직](reference_policies_evaluation-logic.md) 섹션을 참조하세요.

# AWS JSON 정책 요소: Principal
<a name="reference_policies_elements_principal"></a>

리소스 기반 JSON 정책의 `Principal` 요소를 사용하여 리소스에 대한 액세스가 허용되거나 거부되는 보안 주체를 지정합니다.

[리소스 기반 정책](access_policies_identity-vs-resource.md)의 `Principal` 요소를 사용해야 합니다. IAM을 비롯한 여러 서비스가 리소스 기반 정책을 지원합니다. IAM 리소스 기반 정책 유형은 역할 신뢰 정책입니다. IAM 역할에서 역할 신뢰 정책의 `Principal` 요소를 사용하여 역할을 수임할 수 있는 사용자를 지정합니다. 크로스 계정 액세스인 경우에는 신뢰할 수 있는 계정의 12자리 식별자를 지정합니다. 해당 신뢰 영역(신뢰할 수 있는 조직 또는 계정) 외의 계정 내 보안 주체가 역할을 수임하는 권한이 있는지 자세히 알고 싶다면, [IAM Access Analyzer란 무엇일까요?](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)를 참조하세요.

**참고**  
역할을 생성한 이후 계정을 "\$1"로 변경하여 모두가 이 역할을 수임하도록 할 수 있습니다. 이렇게 하는 경우 다른 방법(예: 특정 IP 주소로만 액세스를 제한하는 `Condition` 요소)을 통해 역할에 액세스할 수 있는 사용자를 제한하는 것이 좋습니다. 역할을 모두 액세스할 수 있는 상태로 두지 마세요.

리소스 기반 정책을 지원하는 리소스의 다른 예에는 Amazon S3 버킷 또는 AWS KMS key(이)가 포함됩니다.

자격 증명 기반 정책에서는 `Principal` 요소를 사용할 수 없습니다. 자격 증명 기반 정책은 IAM 자격 증명(사용자, 그룹 또는 역할)에 연결할 수 있는 권한 정책입니다. 이 경우, 보안 주체는 암시적으로 정책이 연결된 자격 증명입니다.

**Topics**
+ [보안 주체를 지정하는 방법](#Principal_specifying)
+ [AWS 계정 보안 주체](#principal-accounts)
+ [IAM 역할 보안 주체](#principal-roles)
+ [역할 세션 보안 주체](#principal-role-session)
+ [OIDC 페더레이션 보안 주체](#principal-federated-web-identity)
+ [SAML 페더레이션 보안 주체](#principal-saml)
+ [IAM 사용자 보안 주체](#principal-users)
+ [IAM Identity Center 보안 주체](#principal-identity-users)
+ [AWS STS 페더레이션 사용자 보안 주체](#sts-session-principals)
+ [AWS 서비스 보안 주체](#principal-services)
+ [옵트인 리전용 AWS 서비스 주체](#principal-services-in-opt-in-regions)
+ [모든 보안 주체](#principal-anonymous)
+ [추가 정보](#Principal_more-info)

## 보안 주체를 지정하는 방법
<a name="Principal_specifying"></a>

보안 주체를 지원하는 리소스 기반 정책이나 조건 키의 `Principal` 요소에 있는 보안 주체를 지정합니다.

정책에서 다음 보안 주체를 지정할 수 있습니다.
+ AWS 계정 및 루트 사용자
+ IAM 역할
+ 역할 세션 
+ IAM 사용자
+ 페더레이션 사용자 보안 주체
+ AWS 서비스
+ 모든 보안 주체

그룹은 인증이 아니라 권한과 관련이 있고 보안 주체는 인증된 IAM 엔터티이기 때문에 정책(예: 리소스 기반 정책)에서 사용자 그룹을 보안 주체로 식별할 수 없습니다.

배열을 사용하여 다음 섹션에서 각 보안 주체 유형에 대해 둘 이상의 보안 주체를 지정할 수 있습니다. 배열은 하나 이상의 값을 갖습니다. 요소에 둘 이상의 보안 주체를 지정할 때는 각 보안 주체에 권한을 부여하십시오. 한 번에 하나의 보안 주체로 인증되기 때문에, 이것은 논리적 `OR`가 아닌 논리적 `AND`입니다. 값을 두 개 이상 포함하는 경우 배열의 각 항목을 대괄호(`[` 및 `]`) 및 쉼표로 구분합니다. 다음 예시 정책은 123456789012 계정 또는 555555555555 계정에 대한 권한을 정의합니다.

```
"Principal" : { 
"AWS": [ 
  "123456789012",
  "555555555555" 
  ]
}
```

**참고**  
보안 주체 이름이나 ARN의 일부를 나타내기 위해 와일드카드를 사용할 수 없습니다.

## AWS 계정 보안 주체
<a name="principal-accounts"></a>

보안 주체를 지원하는 리소스 기반 정책이나 조건 키의 `Principal` 요소에 있는 AWS 계정 식별자를 지정할 수 있습니다. 이렇게 하면 계정에 권한을 위임합니다. 다른 계정에 대한 액세스를 허용하면 해당 계정의 관리자는 해당 계정의 자격 증명(IAM 사용자 또는 역할)에 대한 액세스 권한을 부여해야 합니다. AWS 계정을 지정하는 경우 계정 ARN(arn:aws:iam::*account-ID*:root)을 사용하거나 `"AWS":` 접두사와 그 뒤에 계정 ID가 따라오는 약식 형태를 사용할 수 있습니다.

예를 들어, 계정 ID `123456789012`의 경우 다음 방법 중 하나를 사용하여 `Principal` 요소에서 해당 계정을 지정할 수 있습니다.

```
"Principal": { "AWS": "arn:aws:iam::123456789012:root" }
```

```
"Principal": { "AWS": "123456789012" }
```

계정 ARN과 단축된 계정 ID도 같은 방식으로 작동합니다. 둘 다 계정에 권한을 위임합니다. `Principal` 요소에서 계정 ARN 사용해도 계정의 루트 사용자에게만 권한이 제한되지는 않습니다.

**참고**  
단축된 계정 ID를 포함하는 리소스 기반 정책을 저장하면 서비스에서 이를 보안 주체 ARN으로 변환할 수 있습니다. 이렇게 해도 정책의 기능은 변경되지 않습니다.

일부 AWS 서비스는 계정 보안 주체를 지정하기 위한 몇 가지 옵션을 추가로 지원합니다. 예를 들어 Amazon S3에서는 다음 형식을 사용하여 [정식 사용자 ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html#FindingCanonicalId)를 지정할 수 있습니다.

```
"Principal": { "CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be" }
```

또한 배열을 사용하여 둘 이상의 AWS 계정(또는 표준 사용자 ID)을 보안 주체로 지정할 수 있습니다. 예를 들어, 세 가지 방법 모두를 사용하여 보안 주체를 버킷 정책에 지정할 수 있습니다.

```
"Principal": { 
  "AWS": [
    "arn:aws:iam::123456789012:root",
    "999999999999"
  ],
  "CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be"
}
```

## IAM 역할 보안 주체
<a name="principal-roles"></a>

보안 주체를 지원하는 리소스 기반 정책이나 조건 키의 `Principal` 요소에 있는 IAM 역할 보안 주체 ARN을 지정할 수 있습니다. IAM 역할은 자격 증명입니다. IAM에서 자격 증명은 권한을 할당할 수 있는 리소스입니다. 역할은 다른 인증된 자격 증명을 신뢰하여 해당 역할을 수임합니다. 여기에는 AWS의 보안 주체 또는 외부 자격 증명 공급자(IdP)가 포함됩니다. 보안 주체 또는 자격 증명이 역할을 맡으면 수임된 역할의 권한이 있는 임시 보안 자격 증명을 수신합니다. AWS에서 작업을 수행하기 위해 이러한 세션 자격 증명을 사용하면 *역할 세션 보안 주체*가 됩니다.

리소스 기반 정책에서 역할 보안 주체를 지정하는 경우 보안 주체에 대한 유효 사용 권한은 해당 역할에 대한 사용 권한을 제한하는 모든 정책 유형에 의해 제한됩니다. 여기에는 세션 정책과 권한 경계가 포함됩니다. 역할 세션에 대한 유효한 사용 권한을 평가하는 방법에 대한 자세한 내용은 [정책 평가 로직](reference_policies_evaluation-logic.md)을(를) 참조하세요.

`Principal` 요소에서 ARN 역할을 지정하려면 다음 형식을 사용하십시오.

```
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:role/role-name" }
```

**중요**  
역할 신뢰 정책의 `Principal` 요소에 특정 IAM 역할을 가리키는 ARN이 포함되어 있으면, 정책을 저장할 때 해당 ARN이 해당 역할의 고유 보안 주체 ID로 변환됩니다. 그러면 누군가가 해당 역할을 제거하고 다시 만들어 본인의 권한을 에스컬레이션할 위험을 완화할 수 있습니다. IAM은 신뢰 정책이 표시될 때 역할 ARN로 역변환을 다시 사용하기 때문에 일반적으로 콘솔에서는 이 ID가 표시되지 않습니다. 그러나 해당 역할을 삭제하면 관계가 깨집니다. 역할을 다시 만들더라도 해당 정책이 더 이상 적용되지 않습니다. 새 역할의 새 보안 주체 ID가 신뢰 정책에 저장된 ID와 일치하지 않기 때문입니다. 이 경우 AWS가 더 이상 유효한 ARN에 다시 매핑할 수 없기 때문에 보안 주체 ID가 리소스 기반 정책에 나타납니다. 결과적으로 신뢰 정책의 `Principal` 요소에서 참조된 역할을 삭제하고 다시 만드는 경우, 보안 주체 ID를 올바른 ARN으로 바꾸도록 정책에서 역할을 편집해야 합니다. 정책을 저장하면 ARN이 다시 해당 역할의 새로운 보안 주체 ID로 변환됩니다. 자세한 내용은 [Understanding AWS's Handling of Deleted IAM roles in Policies](https://repost.aws/articles/ARSqFcxvd7R9u-gcFD9nmA5g/understanding-aws-s-handling-of-deleted-iam-roles-in-policies)를 참조하세요.

또는 리소스 기반 정책에서 역할 보안 주체를 보안 주체로 지정하거나 `aws:PrincipalArn` 조건 키를 사용하는 [광범위한 권한 정책을 생성](#principal-anonymous)할 수 있습니다. 이 키를 사용하면 역할 세션 보안 주체에게 결과 세션의 ARN이 아니라 수임된 역할의 ARN을 기반으로 권한이 부여됩니다. 이는 AWS은(는) 조건 키 ARN을 ID로 변환하지 않기 때문입니다. 역할 ARN에 부여된 권한은 역할을 삭제한 다음 동일한 이름으로 새 역할을 생성하면 유지됩니다. 자격 증명 기반 정책에 명시적 거부가 포함되지 않는 한, 권한 경계 또는 세션 정책과 같은 자격 증명 기반 정책 유형은 `Principal` 요소에서 와일드카드(\$1)와 함께 `aws:PrincipalArn` 조건 키를 사용하여 부여한 권한을 제한하지 않습니다.

## 역할 세션 보안 주체
<a name="principal-role-session"></a>

보안 주체를 지원하는 리소스 기반 정책이나 조건 키의 `Principal` 요소에 있는 역할 세션을 지정할 수 있습니다. 보안 주체 또는 자격 증명이 역할을 맡으면 수임된 역할의 권한이 있는 임시 보안 자격 증명을 수신합니다. AWS에서 작업을 수행하기 위해 이러한 세션 자격 증명을 사용하면 *역할 세션 보안 주체*가 됩니다.

역할 세션 보안 주체에 사용하는 형식은 역할을 수임하는 데 사용된 AWS STS 작업에 따라 다릅니다.

**중요**  
AWS는 가능한 한 역할 세션 위탁자 대신 [IAM 역할 위탁자](#principal-roles)를 정책에 사용할 것을 권장합니다. 필요한 경우 `Condition` 문과 조건 키를 사용하여 액세스 범위를 더 좁힐 수 있습니다.

`Principal` 요소에서 역할 세션 위탁자 ARN을 지정하려면 다음 형식을 사용하세요.

```
"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:assumed-role/role-name/role-session-name" }
```

또한 관리자는 역할 세션이 발행되는 방식을 제어하는 프로세스를 설계할 수 있습니다. 예를 들어 예측 가능한 세션 이름을 생성하는 원클릭 솔루션을 사용자에게 제공할 수 있습니다. 관리자가 이를 수행하는 경우, 정책 또는 조건 키에서 역할 세션 보안 주체를 사용할 수 있습니다. 그렇지 않으면 역할 ARN을 `aws:PrincipalArn` 조건 키의 보안 주체로 지정할 수 있습니다. 역할을 보안 주체로 지정하는 방법에 따라 결과 세션에 대한 유효한 권한이 변경될 수 있습니다. 자세한 내용은 [IAM 역할 보안 주체](#principal-roles) 섹션을 참조하세요.

## OIDC 페더레이션 보안 주체
<a name="principal-federated-web-identity"></a>

OIDC 페더레이션 보안 주체는 OpenID 제공업체(OP)라고도 하는 OIDC 준수 IDP에서 JSON 웹 토큰(JWT)으로 AWS STS `AssumeRoleWithWebIdentity` API를 직접적으로 호출하여 임시 AWS 자격 증명을 요청할 때 사용되는 보안 주체입니다. OIDC 페더레이션 보안 주체는 AWS 계정의 OIDC IDP 또는 Login with Amazon, Google, Facebook, [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/role-based-access-control.html) 등 4개의 기본 제공 ID 제공업체를 나타낼 수 있습니다.

OIDC IDP에서 JWT를 발급받은 사용자, 워크로드 또는 시스템은 JWT를 사용하여 `AssumeRoleWithWebIdentity`를 직접적으로 호출하면 JWT를 발급한 OIDC IDP를 신뢰하도록 구성된 IAM 역할의 임시 AWS 보안 자격 증명을 요청할 수 있습니다. JWT는 [AWS STS에 나열된 요구 사항](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html#manage-oidc-provider-prerequisites)을 충족하는 한 다른 방법으로 제공되는 ID 토큰, 액세스 토큰 또는 JWT 토큰일 수 있습니다. 자세한 내용은 [일반적인 시나리오](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_federation_common_scenarios.html) 및 [OIDC 공급자를 통한 자격 증명 요청](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity)을 참조하세요.

역할 신뢰 정책에서 이 보안 주체 유형을 사용하여 `AssumeRoleWIthWebIdentity`에 있는 OIDC IDP 또는 기본 제공 IDP 4개 중 1개를 사용하여 AWS 계정를 직접적으로 호출할 수 있는 권한을 허용하거나 거부합니다. 역할 신뢰 정책의 `Principal` 요소에서 OIDC 페더레이션 보안 주체 ARN을 지정하려면 기본 제공 OIDC IDP에 다음 4가지 형식 중 하나를 사용합니다.

```
"Principal": { "Federated": "cognito-identity.amazonaws.com" }
```

```
"Principal": { "Federated": "www.amazon.com" }
```

```
"Principal": { "Federated": "graph.facebook.com" }
```

```
"Principal": { "Federated": "accounts.google.com" }
```

GitHub와 같이 계정에 추가하는 OIDC 제공업체를 사용하는 경우 역할의 신뢰 정책에서 제공업체의 ARN을 지정합니다. 본 구성을 사용하면 사용자 지정 자격 증명 공급자를 통해 인증된 사용자에 대해 액세스를 제어하는 IAM 정책을 작성할 수 있습니다.

```
"Principal": { "Federated": "arn:aws:iam::AWS-account-ID:oidc-provider/full-OIDC-identity-provider-URL" }
```

예를 들어 GitHub이 신뢰할 수 있는 웹 ID 제공업체인 경우 역할 신뢰 정책의 `Principal` 요소에 있는 OIDC 역할 세션 ARN은 다음 형식을 사용합니다.

```
"Principal": { "Federated": "arn:aws:iam::AWS-account-ID:oidc-provider/tokens.actions.githubusercontent.com" }
```

자세한 내용은 [Amazon Web Services에서 OpenID Connect 구성](https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)을 참조하세요.

OIDC 페더레이션 보안 주체는 역할 신뢰 정책 이외의 정책 유형에서는 지원되지 않습니다.

## SAML 페더레이션 보안 주체
<a name="principal-saml"></a>

*SAML 페더레이션 보안 주체*는 AWS STS `AssumeRoleWithSAML` API를 직접적으로 호출하여 SAML 어설션으로 임시 AWS 자격 증명을 요청할 때 사용되는 보안 주체입니다. SAML ID 제공업체(IdP)를 사용하여 로그인한 다음 이 작업을 사용하여 IAM 역할을 수임할 수 있습니다. `AssumeRoleWithWebIdentity`와 마찬가지로 `AssumeRoleWithSAML`도 인증에 AWS 자격 증명이 필요하지 않습니다. 대신 사용자는 먼저 SAML ID 제공업체에 인증한 다음 SAML 어설션을 사용하여 `AssumeRoleWithSAML` API를 직접적으로 호출하거나 AWS 로그인/SAML 페이지로 리디렉션되어 AWS Management Console에 로그인합니다. 이 작업을 사용하여 역할을 수임할 수 있는 보안 주체에 대한 자세한 내용은 [AWS STS 자격 증명 비교](id_credentials_sts-comparison.md)을(를) 참조하세요.

역할 신뢰 정책에서 이 보안 주체 유형을 사용하여 신뢰할 수 있는 SAML ID 제공업체를 기반으로 권한을 허용하거나 거부합니다. `Principal` 요소에서 SAML 아이덴티티 역할 세션 ARN을 지정하려면 다음 형식을 사용하세요.

```
"Principal": { "Federated": "arn:aws:iam::AWS-account-ID:saml-provider/provider-name" }
```

## IAM 사용자 보안 주체
<a name="principal-users"></a>

리소스 기반 정책의 `Principal` 요소 또는 보안 주체를 지원하는 조건 키에서 IAM 사용자를 지정할 수 있습니다.

**참고**  
`Principal` 요소에서 [*Amazon 리소스 이름*(ARN)](reference_identifiers.md#identifiers-arns)의 사용자 이름 부분은 대/소문자를 구분합니다.

```
"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:user/user-name" }
```

```
"Principal": {
  "AWS": [
    "arn:aws:iam::AWS-account-ID:user/user-name-1", 
    "arn:aws:iam::AWS-account-ID:user/user-name-2"
  ]
}
```

`Principal` 요소로 사용자를 지정할 때는 "모든 사용자"의 의미로 와일드카드(`*`)를 사용할 수 없습니다. 보안 주체는 항상 특정 사용자가 되어야 하기 때문입니다.

**중요**  
역할 신뢰 정책의 `Principal` 요소에 특정 IAM 사용자를 가리키는 ARN이 포함되어 있으면, IAM은 정책을 저장할 때 ARN을 사용자의 고유한 보안 주체 ID로 변환합니다. 그러면 누군가가 해당 사용자를 제거하고 다시 만들어 본인의 권한을 에스컬레이션할 위험을 완화할 수 있습니다. 일반적으로 콘솔에서는 이 ID가 보이지 않습니다. 신뢰 정책이 표시될 때 해당 사용자의 ARN으로 다시 역변환되기 때문입니다. 그러나 해당 사용자를 삭제하면 관계가 깨집니다. 사용자를 다시 생성해도 정책은 더 이상 적용되지 않습니다. 새 사용자의 새 보안 주체 ID가 신뢰 정책에 저장된 ID와 일치하지 않기 때문입니다. 이 경우 AWS가 더 이상 유효한 ARN에 다시 매핑할 수 없기 때문에 보안 주체 ID가 리소스 기반 정책에 나타납니다. 결과적으로 신뢰 정책의 `Principal` 요소에서 참조된 사용자를 삭제하고 다시 만드는 경우, 역할을 편집하여 현재의 잘못된 보안 주체 ID를 올바른 ARN으로 바꿔야 합니다. IAM은 정책을 저장하면 ARN이 다시 해당 사용자의 새로운 보안 주체 ID로 변환됩니다.

## IAM Identity Center 보안 주체
<a name="principal-identity-users"></a>

IAM Identity Center에서는 리소스 기반 정책의 보안 주체를 AWS 계정 보안 주체로 정의해야 합니다. 액세스를 지정하려면 조건 블록에 있는 권한 세트의 역할 ARN을 참조합니다. 자세한 내용은 *IAM Identity Center 사용 설명서*에서 [리소스 정책, Amazon EKS 및 AWS KMS의 권한 세트 참조](https://docs.aws.amazon.com/singlesignon/latest/userguide/referencingpermissionsets.html)를 참조하세요.

## AWS STS 페더레이션 사용자 보안 주체
<a name="sts-session-principals"></a>

보안 주체를 지원하는 리소스 기반 정책이나 조건 키의 `Principal` 요소에 있는 *페더레이션 사용자 세션*을 지정할 수 있습니다.

**중요**  
AWS는 AWS STS 페더레이션 사용자 세션의 사용을 제한할 것을 권장합니다. 대신 [IAM 역할](IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)을 사용하세요.

AWS STS 페더레이션 사용자 보안 주체는 수명이 긴 IAM 자격 증명이라고 하는 `GetFederationToken` 작업을 통해 생성됩니다. 페더레이션 사용자 권한은 `GetFederationToken`을 직접적으로 호출한 보안 주체와 `GetFederationToken` API에 파라미터로 전달된 세션 정책의 교집합입니다.

AWS에서 IAM 사용자 또는 AWS 계정 루트 사용자는 장기 액세스 키를 사용하여 인증할 수 있습니다. 이 작업을 사용하여 페더레이션할 수 있는 보안 주체에 대한 자세한 내용은 [AWS STS 자격 증명 비교](id_credentials_sts-comparison.md)을(를) 참조하세요.
+ **IAM 페더레이션 사용자** - IAM 사용자는 해당 IAM 사용자에 대한 페더레이션 사용자 세션을 생성하는 `GetFederationToken` 작업을 사용하여 페더레이션합니다.
+ **페더레이션 루트 사용자** - 루트 사용자는 해당 루트 사용자에 대한 페더레이션 사용자 세션을 생성하는 `GetFederationToken` 작업을 사용하여 페더레이션합니다.

IAM 사용자 또는 루트 사용자가 이 작업을 사용하여 AWS STS에서 임시 자격 증명을 요청하면 임시 페더레이션 사용자 세션이 시작됩니다. 이 세션의 ARN은 페더레이션된 원래 자격 증명을 기반으로 합니다.

`Principal` 요소에서 페더레이션 사용자 세션 ARN을 지정하려면 다음 형식을 사용하십시오.

```
"Principal": { "AWS": "arn:aws:sts::AWS-account-ID:federated-user/user-name" }
```

## AWS 서비스 보안 주체
<a name="principal-services"></a>

보안 주체를 지원하는 리소스 기반 정책이나 조건 키의 `Principal` 요소에 있는 AWS 서비스를 지정할 수 있습니다. *서비스 보안 주체*는 서비스의 식별자입니다.

AWS 서비스에서 위임할 수 있는 IAM 역할을 *[서비스 역할](id_roles.md#iam-term-service-role)*이라고 합니다. 서비스 역할에는 신뢰 정책이 포함되어 있어야 합니다. *신뢰 정책*은 역할을 수임할 수 있는 보안 주체를 정의하는 역할에 연결된 리소스 기반 정책입니다. 일부 서비스 역할에는 신뢰 정책이 미리 정의되어 있습니다. 그러나 신뢰 정책에 서비스 보안 주체를 지정해야 하는 경우도 있습니다. IAM 정책의 서비스 보안 주체는 `"Service": "*"`일 수 없습니다.

**중요**  
서비스 보안 주체의 식별자에는 서비스 이름이 포함되어 있고 일반적으로 다음과 같은 형식을 갖습니다.  
`service-name.amazonaws.com`

서비스 보안 주체는 서비스가 정의합니다. 일부 서비스에 대한 서비스 보안 주체는 [AWS IAM으로 작업하는 서비스](reference_aws-services-that-work-with-iam.md)를 열고 **서비스 연결 역할** 열에서 서비스에 **예**가 선택되어 있는지 확인한 다음 **예** 링크를 열어 해당 서비스에 대한 서비스 연결 역할 문서를 확인할 수 있습니다. **서비스 보안 주체**를 보려면 서비스 연결 역할 권한 섹션을 참조하세요.

다음 예제는 서비스 역할에 연결할 수 있는 정책을 보여줍니다. 이 정책은 Amazon ECS 및 Elastic Load Balancing의 두 서비스가 역할을 수임할 수 있도록 합니다. 그러면 서비스가 해당 역할에 할당된 권한 정책에서 부여한 모든 작업을 수행할 수 있습니다(표시되지 않음). 여러 서비스 보안 주체를 지정할 때 `Service` 요소를 두 개 지정하면 안 됩니다. 하나만 지정할 수 있습니다. 대신 여러 서비스 보안 주체의 배열을 하나의 `Service` 요소의 값으로 사용합니다.

```
"Principal": {
    "Service": [
        "ecs.amazonaws.com",
        "elasticloadbalancing.amazonaws.com"
   ]
}
```

## 옵트인 리전용 AWS 서비스 주체
<a name="principal-services-in-opt-in-regions"></a>

여러 AWS 리전에서 리소스를 시작할 수 있으며 이러한 리전 중 일부는 반드시 옵트인해야 합니다. 옵트인해야 하는 전체 지역 목록은 *AWS 일반 참조* 가이드의 [AWS 리전 관리](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html)를 참조하세요.

옵트인 리전의 AWS 서비스가 동일한 리전 내에서 요청을 보내는 경우 서비스 주체 이름 형식은 해당 서비스 주체 이름의 리전별이 아닌 버전으로 식별됩니다.

`service-name.amazonaws.com`

옵트인 리전의 AWS 서비스가 다른 리전에 교차 리전 요청을 보내면 서비스 주체 이름 형식이 해당 서비스 주체 이름의 리전별 버전으로 식별됩니다.

`service-name.{region}.amazonaws.com`

예를 들어 Amazon SNS 주제가 리전 `ap-southeast-1`에 있고 Amazon S3 버킷이 옵트인 리전 `ap-east-1`에 있다고 가정해 보겠습니다. SNS 주제에 메시지를 게시하도록 S3 버킷 알림을 구성하려고 합니다. S3 서비스에서 SNS 주제에 메시지를 게시할 수 있도록 하려면 해당 주제의 리소스 기반 액세스 정책을 통해 S3 서비스 주체에게 `sns:Publish` 권한을 부여해야 합니다.

주제 액세스 정책에서 S3 서비스 주체 `s3.amazonaws.com`의 리전별이 아닌 버전을 지정하는 경우 버킷에서 주제로의 `sns:Publish` 요청이 실패합니다. 다음 예제에서는 SNS 주제 액세스 정책의 `Principal` 정책 요소에 리전별이 아닌 S3 서비스 주체를 지정합니다.

```
"Principal": { "Service": "s3.amazonaws.com" }
```

버킷은 옵트인 리전에 있고 요청은 동일한 리전 외부에서 이루어지므로 S3 서비스 주체는 리전별 서비스 주체 이름 `s3.ap-east-1.amazonaws.com`으로 표시됩니다. 옵트인 리전의 AWS 서비스가 다른 리전에 요청할 때는 리전별 서비스 주체 이름을 사용해야 합니다. 리전별 서비스 주체 이름을 지정한 후 버킷이 다른 리전에 있는 SNS 주제에 `sns:Publish` 요청을 하면 요청이 성공합니다. 다음 예제에서는 SNS 주제 액세스 정책의 `Principal` 정책 요소에 리전별 S3 서비스 주체를 지정합니다.

```
"Principal": { "Service": "s3.ap-east-1.amazonaws.com" }
```

옵트인 리전에서 다른 리전으로의 리전 간 요청에 대한 리소스 정책 또는 서비스 주체 기반 허용 목록은 리전별 서비스 주체 이름을 지정한 경우에만 성공합니다.

**참고**  
IAM 역할 신뢰 정책의 경우 리전별이 아닌 서비스 사용자 이름을 사용하는 것이 좋습니다. IAM 리소스는 글로벌 리소스이므로 모든 리전에서 동일한 역할을 사용할 수 있습니다.

## 모든 보안 주체
<a name="principal-anonymous"></a>

와일드카드(\$1)를 사용하여 리소스 기반 정책의 `Principal` 요소 또는 보안 주체를 지원하는 조건 키에 모든 보안 주체를 지정할 수 있습니다. [리소스 기반 정책](access_policies.md#policies_resource-based)은 권한을 *부여*하고 [조건 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)는 정책 문의 조건을 제한하는 데 사용됩니다.

**중요**  
퍼블릭 또는 익명 액세스 권한을 부여하려는 경우가 아니면 `Allow` 효과가 있는 리소스 기반 정책의 `Principal` 요소에 와일드카드(\$1)를 사용하지 않는 것이 좋습니다. 그렇지 않으면 `Principal` 요소에서 의도한 보안 주체, 서비스 또는 AWS 계정을 지정한 다음 `Condition` 요소에서 액세스를 추가로 제한하세요. 이는 특히 다른 보안 주체가 계정의 보안 주체가 될 수 있도록 허용하기 때문에 IAM 역할 신뢰 정책에 특히 해당됩니다.

리소스 기반 정책의 경우 `Allow` 효과와 함께 와일드카드(\$1)를 사용하면 익명 사용자(퍼블릭 액세스)를 포함한 모든 사용자에게 액세스 권한이 부여됩니다. 계정 내의 IAM 사용자 및 역할 보안 주체의 경우 다른 권한이 필요하지 않습니다. 다른 계정의 보안 주체의 경우 계정에 리소스에 액세스할 수 있는 자격 증명 기반 권한도 있어야 합니다. 이를 [크로스 계정 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html)라고 합니다.

익명 사용자의 경우 다음 요소는 동일합니다.

```
"Principal": "*"
```

```
"Principal" : { "AWS" : "*" }
```

보안 주체 이름이나 ARN의 일부를 나타내기 위해 와일드카드를 사용할 수 없습니다.

다음 예제는 [AWS JSON 정책 요소: NotPrincipal](reference_policies_elements_notprincipal.md) 대신 `Condition` 요소에 지정된 보안 주체를 *제외*한 모든 보안 주체를 명시적으로 거부하는 데 사용할 수 있는 리소스 기반 정책을 보여줍니다. 이 정책은 [Amazon S3 버킷에 추가](https://docs.aws.amazon.com//AmazonS3/latest/userguide/add-bucket-policy.html)해야 합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "UsePrincipalArnInsteadOfNotPrincipalWithDeny",
      "Effect": "Deny",
      "Action": "s3:*",
      "Principal": "*",
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/*",
        "arn:aws:s3:::amzn-s3-demo-bucket"
      ],
      "Condition": {
        "ArnNotEquals": {
          "aws:PrincipalArn": "arn:aws:iam::444455556666:user/user-name"
        }
      }
    }
  ]
}
```

------

## 추가 정보
<a name="Principal_more-info"></a>

자세한 내용은 다음을 참조하세요.
+ *Amazon Simple Storage Service 사용 설명서*의 [버킷 정책 예제](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)
+ *Amazon Simple Notification Service 개발자 안내서*의 [Amazon SNS에 대한 정책 예제](https://docs.aws.amazon.com/sns/latest/dg/UsingIAMwithSNS.html#ExamplePolicies_SNS)
+ *Amazon Simple Queue Service Developer Guide*(Amazon Simple Storage Service 개발자 안내서)의 [Amazon SQS policy examples](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/SQSExamples.html)(Amazon SQS 정책 예제)
+ *AWS Key Management Service 개발자 안내서*의 [키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)
+ **AWS 일반 참조의 [계정 식별자](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html)
+ [OIDC 페더레이션](id_roles_providers_oidc.md)

# AWS JSON 정책 요소: NotPrincipal
<a name="reference_policies_elements_notprincipal"></a>

`NotPrincipal` 요소는 `"Effect":"Deny"`를 사용하여 `NotPrincipal` 요소에 지정된 위탁자를 ***제외한*** 모든 위탁자의 액세스를 거부합니다. 보안 주체는 IAM 사용자, AWS STS 페더레이션 사용자 보안 주체, IAM 역할, 수임한 역할 세션, AWS 계정, AWS 서비스 또는 기타 보안 주체 유형일 수 있습니다. 위탁자에 대한 자세한 내용은 [AWS JSON 정책 요소: Principal](reference_policies_elements_principal.md) 섹션을 참조하세요.

`NotPrincipal`은 `"Effect":"Deny"`와 함께 사용해야 합니다. `"Effect":"Allow"`와 함께 사용은 지원되지 않습니다.

**중요**  
보안 및 권한 부여 전략의 일환으로 새로운 리소스 기반 정책에 `NotPrincipal`을 사용하는 것은 권장되지 않습니다. `NotPrincipal`을 사용할 경우 여러 정책 유형의 영향을 해결하기 어려울 수 있습니다. 대신 ARN 조건 연산자와 함께 `aws:PrincipalArn` 컨텍스트 키를 사용하는 것이 좋습니다.

## 중요 사항
<a name="notprincipal-key-points"></a>
+ `NotPrincipal` 요소는 VPC 엔드포인트를 포함한 일부 AWS 서비스의 리소스 기반 정책에서 지원됩니다. 리소스 기반 정책은 리소스에 직접 삽입할 수 있는 정책입니다. IAM ID 기반 정책 또는 IAM 역할 신뢰 정책에는 `NotPrincipal` 요소를 사용할 수 없습니다.
+ 권한 경계 정책이 연결된 IAM 사용자 또는 역할에는 `Deny` 효과를 포함하는 `NotPrincipal` 정책 요소가 있는 리소스 기반 정책 문을 사용하지 않도록 합니다. `Deny` 효과를 포함하는 `NotPrincipal` 요소는 `NotPrincipal` 요소에 지정된 값에 관계없이 권한 경계 정책이 연결된 IAM 보안 주체를 항상 거부합니다. 이로 인해 원래 리소스에 액세스할 수 있는 일부 IAM 사용자 또는 역할이 해당 리소스에 더 이상 액세스할 수 없습니다. `NotPrincipal` 요소 대신 액세스를 제한하기 위해 [`ArnNotEquals`](reference_policies_elements_condition_operators.md#Conditions_ARN) 조건 연산자를 [`aws:PrincipalArn`](reference_policies_condition-keys.md#condition-keys-principalarn) 컨텍스트 키와 함께 사용하도록 리소스 기반 정책 문을 변경하는 것이 좋습니다. 권한 경계에 대한 자세한 내용은 [IAM 엔터티의 권한 범위](access_policies_boundaries.md) 섹션을 참조하세요.
+ `NotPrincipal`을 사용할 때 거부되지 않은 위탁자의 계정 ARN도 지정해야 합니다. 지정하지 않으면 정책에서 해당 보안 주체를 포함하는 전체 계정에 대한 액세스가 거부될 수 있습니다. 정책에 포함하는 서비스에 따라 AWS에서 먼저 계정을 검증한 후 사용자를 검증할 수 있습니다. 위임된 역할 사용자(역할을 사용하는 사람)를 평가할 때 AWS는 먼저 계정을 검증한 후 위임된 역할 사용자를 평가합니다. 위임된 역할 사용자는 그 역할을 위임 받을 때 지정된 역할 세션 이름으로 식별할 수 있습니다. 따라서 사용자 계정의 ARN을 명시적으로 포함시키거나, 역할의 ARN과 해당 역할을 포함하는 계정의 ARN을 모두 포함시킬 것을 권장합니다.
+ `NotPrincipal` 요소는 서비스 제어 정책(SCP)과 리소스 제어 정책(RCP)에서 지원되지 않습니다.

## `NotPrincipal` 요소의 대안
<a name="notprincipal-alternatives"></a>

AWS에서 액세스 제어를 관리할 때 지정한 하나 이상의 위탁자를 제외한 리소스에 대한 모든 위탁자 액세스를 명시적으로 거부해야 하는 시나리오가 있을 수 있습니다. AWS는 보다 정확한 제어와 쉬운 문제 해결을 위해 글로벌 조건 컨텍스트 키와 함께 거부 문을 사용할 것을 권장합니다. 다음 예제에서는 `StringNotEquals` 또는 `ArnNotEquals`와 같은 조건 연산자를 사용하여 조건 요소에 지정된 위탁자를 제외한 모든 위탁자에 대한 액세스를 거부하는 대체 접근 방식을 보여줍니다.

## IAM 역할을 사용하는 예제 시나리오
<a name="notprincipal-alternative-role"></a>

거부 문과 함께 리소스 기반 정책을 사용하여 조건 요소에 지정된 역할을 제외한 모든 IAM 역할이 리소스에 액세스하거나 조작하지 못하도록 할 수 있습니다. 이러한 접근 방식은 명시적 거부가 항상 모든 허용 문보다 우선한다는 AWS 보안 원칙을 따르며 AWS 인프라 전반에서 최소 권한 원칙을 유지하는 데 도움이 됩니다.

`NotPrincipal`을 사용하는 대신 [`ArnNotEquals`](reference_policies_elements_condition_operators.md#Conditions_ARN)와 같은 조건 연산자와 전역 조건 컨텍스트 키와 함께 거부 문을 사용하여 IAM 역할이 리소스에 액세스할 수 있도록 명시적으로 허용하는 것이 좋습니다. 다음 예제에서는 [aws:PrincipalArn](reference_policies_condition-keys.md#condition-keys-principalarn)을 사용하여 `read-only-role` 역할이 `Bucket_Account_Audit` 폴더의 Amazon S3 버킷에 액세스할 수 있도록 명시적으로 허용합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyCrossAuditAccess",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::Bucket_Account_Audit",
        "arn:aws:s3:::Bucket_Account_Audit/*"
      ],
      "Condition": {
        "ArnNotEquals": {
          "aws:PrincipalArn": "arn:aws:iam::444455556666:role/read-only-role"
        }
      }
    }
  ]
}
```

------

## 서비스 위탁자를 사용하는 예제 시나리오
<a name="notprincipal-alternative-service-principal"></a>

거부 문을 사용하여 `Condition` 요소에 지정된 위탁자를 제외한 모든 서비스 위탁자가 리소스에 액세스하거나 리소스를 조작하지 못하도록 할 수 있습니다. 이 접근 방식은 세분화된 액세스 제어를 구현하거나 AWS 환경의 다양한 서비스와 애플리케이션 간에 보안 경계를 설정해야 하는 경우에 특히 유용합니다.

`NotPrincipal`을 사용하는 대신 전역 조건 컨텍스트 키가 있는 거부 문과 [`StringNotEquals`](reference_policies_elements_condition_operators.md#Conditions_String)와 같은 조건 연산자를 사용하여 리소스에 대한 서비스 위탁자 액세스를 명시적으로 허용하는 것이 좋습니다. 다음 예제에서는 `aws:PrincipalServiceName`을 사용하여 AWS CodeBuild 서비스 위탁자가 `BUCKETNAME` 폴더의 Amazon S3 버킷에 액세스할 수 있도록 명시적으로 허용합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyNotCodeBuildAccess",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::BUCKETNAME",
        "arn:aws:s3:::BUCKETNAME/*"
      ],
      "Condition": {
        "StringNotEqualsIfExists": {
          "aws:PrincipalServiceName": "codebuild.amazonaws.com"
        }
      }
    }
  ]
}
```

------

# IAM JSON 정책 요소: Action
<a name="reference_policies_elements_action"></a>

`Action` 요소는 특정 작업의 허용 또는 거부 여부를 지정합니다. 문에는 `Action` 또는 `NotAction` 요소가 반드시 추가되어야 합니다. AWS 서비스마다 실행할 수 있는 작업을 설명한 목록이 있습니다. 예를 들어 Amazon S3 작업 목록은 *Amazon Simple Storage Service 사용 설명서*의 [정책에 권한 지정](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html)에서, Amazon EC2 작업 목록은 [Amazon EC2 API 참조](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/query-apis.html)에서, 그리고 AWS Identity and Access Management 작업 목록은 [IAM API 참조](https://docs.aws.amazon.com/IAM/latest/APIReference/API_Operations.html)에서 확인할 수 있습니다. 그 밖에 다른 서비스의 작업 목록은 해당 서비스의 API 참조 [설명서](https://aws.amazon.com/documentation)를 참조하세요.

또한 AWS는 정책 관리 워크플로의 자동화를 간소화하기 위해 서비스 참조 정보를 JSON 형식으로 제공합니다. 서비스 참조 정보를 사용하면 기계가 읽을 수 있는 파일에서 AWS 서비스에 걸쳐 사용 가능한 작업, 리소스, 조건 키에 액세스할 수 있습니다. 자세한 내용은 서비스 권한 부여 참조의 [프로그래밍 방식의 액세스를 위해 간소화된 AWS 서비스 정보](https://docs.aws.amazon.com/service-authorization/latest/reference/service-reference.html)를 참조하세요.

서비스 네임스페이스를 작업 접두사(`iam`, `ec2`, `sqs`, `sns`, `s3` 등)로 사용하고 허용 또는 거부할 작업 이름을 사용하여 값을 지정합니다. 이름은 서비스에서 지원되는 작업과 일치해야 합니다. 접두사와 작업 이름은 대/소문자를 구분하지 않습니다. 예를 들어 `iam:ListAccessKeys`는 `IAM:listaccesskeys`와 동일합니다. 다음은 각 서비스의 `Action` 요소를 나타낸 예제입니다.

**Amazon SQS 작업**

```
"Action": "sqs:SendMessage"
```

**Amazon EC2 작업**

```
"Action": "ec2:StartInstances"
```

**IAM 작업**

```
"Action": "iam:ChangePassword"
```

**Amazon S3 작업**

```
"Action": "s3:GetObject"
```

`Action` 요소는 다수의 값을 지정할 수도 있습니다.

```
"Action": [ "sqs:SendMessage", "sqs:ReceiveMessage", "ec2:StartInstances", "iam:ChangePassword", "s3:GetObject" ]
```

다중 문자 일치 와일드카드(`*`) 및 단일 문자 일치 와일드카드(`?`)를 사용하여 특정 AWS 제품에서 제공하는 모든 작업에 대한 액세스 권한을 부여할 수 있습니다. 예를 들어, 다음 `Action` 요소는 모든 S3 작업에 적용됩니다.

```
"Action": "s3:*"
```

와일드카드(`*` 또는 `?`)는 작업 이름에도 사용할 수 있습니다. 예를 들어 다음 `Action` 요소는 `AccessKey`, `CreateAccessKey`, `DeleteAccessKey`, `ListAccessKeys` 등 문자열 `UpdateAccessKey`를 포함하는 IAM 작업 모두에게 적용됩니다.

```
"Action": "iam:*AccessKey*"
```

일부 서비스에서는 사용 가능한 작업을 제한할 수도 있습니다. 예를 들어 Amazon SQS에서는 가능한 모든 Amazon SQS 작업의 하위 집합만 사용할 수 있습니다. 이 경우 와일드카드(`*`)는 대기열 전체를 제어하지 못하고, 공유한 작업의 하위 집합만 제어가 가능합니다. 자세한 내용은 *Amazon Simple Queue Service 개발자 안내서*의 [권한 이해](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/acp-overview.html#PermissionTypes)를 참조하세요.

# IAM JSON 정책 요소: NotAction
<a name="reference_policies_elements_notaction"></a>

`NotAction`은 지정된 작업의 목록을 *제외*한 모든 작업과 명시적으로 일치하는 고급 정책 요소입니다. `NotAction`을 사용하면 일치하는 작업의 긴 목록을 포함하는 대신 일치하지 않는 몇몇 작업만 나열함으로써 정책을 줄일 수 있습니다. `NotAction`에 지정된 작업은 정책 설명의 `Allow` 또는 `Deny` 효과의 영향을 받지 않습니다. 따라서 나열되지 않은 모든 해당 작업 또는 서비스가 `Allow` 효과를 사용할 경우 허용되고, `Deny`를 사용하려는 경우에는 나열되지 않은 작업 또는 서비스가 거부됩니다. `NotAction`을 `Resource` 요소와 함께 사용할 경우 정책 범위를 제공해야 합니다. 이에 따라 AWS는 어떤 작업이나 서비스를 적용할 수 있는지 결정합니다. 자세한 내용은 다음 예제 정책을 참조하세요.

**NotAction 및 Allow** 

설명문에서 `NotAction` 요소를 `"Effect": "Allow"`와 함께 사용하여 AWS 서비스에서 `NotAction`에 지정된 작업을 제외한 모든 작업에 대한 액세스 권한을 제공할 수 있습니다. 이 요소와 `Resource` 요소를 함께 사용하여 정책에 대한 범위를 제공하고 지정한 리소스에서 수행할 수 있는 작업으로만 작업을 제한할 수 있습니다.

다음 예제에서는 버킷 삭제를 *제외하고* 사용자가 S3 리소스에서 수행할 수 있는 모든 Amazon S3 작업에 액세스할 수 있도록 허용합니다. 이 정책은 또한 다른 서비스에서의 작업을 허용하지 않습니다. 다른 서비스 작업은 S3 리소스에 적용되지 않기 때문입니다.

```
"Effect": "Allow",
"NotAction": "s3:DeleteBucket",
"Resource": "arn:aws:s3:::*",
```

때로는 다수의 작업에 액세스하도록 허용해야 할 수 있습니다. `NotAction` 요소를 사용하여 효과적으로 설명문을 반전시켜 작업 목록을 단축시킬 수 있습니다. 예를 들어 AWS 서비스는 종류가 다양하므로 사용자에게 IAM 작업에 대한 액세스를 제외한 모든 것을 허용하는 정책을 생성하기를 원할 수 있습니다.

다음 예제는 사용자가 IAM을 제외한 모든 AWS 서비스에서 모든 작업에 액세스하도록 허용합니다.

```
"Effect": "Allow",
"NotAction": "iam:*",
"Resource": "*"
```

동일한 설명문에서 또는 동일한 정책의 다른 설명문에서 `NotAction` 요소와 `"Effect": "Allow"`를 사용할 경우 주의하세요. `NotAction`은 명시적으로 나열되지 않거나 특정 리소스에 적용되지 않는 모든 서비스 및 작업과 일치하므로 사용자에게 의도한 것보다 많은 권한을 부여하는 결과를 가져올 수 있습니다.

**NotAction 및 Deny**

설명문에서 `NotAction` 요소를 `"Effect": "Deny"`와 함께 사용하여 `NotAction` 요소에 지정된 작업을 제외하고 모든 나열된 리소스에 대한 액세스를 거부할 수 있습니다. 이 조합은 나열된 항목을 허용하는 것이 아니라 나열되지 않은 작업을 명시적으로 거부합니다. 그러므로 허용하려는 작업은 별도로 허용해야 합니다.

다음의 조건부 예제는 사용자가 MFA를 사용하여 로그인하지 않은 경우 비 IAM 작업에 대한 액세스를 거부합니다. 사용자가 MFA를 사용하여 로그인한 경우에는 `"Condition"` 테스트에 실패하며 최종 `"Deny"` 문은 효과가 없습니다. 단, 이 정책은 사용자에게 작업에 대한 액세스 권한을 부여하는 것이 아니라 IAM 작업을 제외한 다른 모든 작업을 명시적으로 거부할 뿐입니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Sid": "DenyAllUsersNotUsingMFA",
        "Effect": "Deny",
        "NotAction": "iam:*",
        "Resource": "*",
        "Condition": {"BoolIfExists": {"aws:MultiFactorAuthPresent": "false"}}
    }]
}
```

------

특정 서비스의 작업을 제외하고 특정 리전 외부의 작업에 대한 액세스를 거부하는 정책의 예는 [AWS: 요청된 리전에 따라 AWS에 대한 액세스를 거부](reference_policies_examples_aws_deny-requested-region.md) 섹션을 참조하세요.

# IAM JSON 정책 요소: Resource
<a name="reference_policies_elements_resource"></a>

IAM 정책 문에서 `Resource` 요소는 문의 적용 대상인 객체를 정의합니다. 문에는 `Resource`또는 `NotResource`요소가 반드시 추가되어야 합니다.

Amazon 리소스 이름(ARN)을 사용하여 리소스를 지정합니다. ARN의 형식은 참조하는 AWS 서비스 및 참조하는 특정 리소스에 따라 다릅니다. ARN 형식은 다양하지만 항상 ARN을 사용하여 리소스를 식별합니다. ARL의 형식에 대한 자세한 내용은 [IAM ARN](reference_identifiers.md#identifiers-arns) 섹션을 참조하세요. 리소스 지정 방법에 대한 자세한 내용은 문을 작성하려는 리소스의 서비스 설명서를 참조하세요.

**참고**  
일부 AWS 서비스에서는 개별 리소스에 대한 작업 지정을 허용하지 않습니다. 이러한 경우 `Action` 또는 `NotAction` 요소에 나열한 모든 작업이 해당 서비스의 모든 리소스에 적용됩니다. 이 경우 `Resource` 요소에 와일드카드 문자(`*`)를 사용합니다.

다음은 특정 Amazon SQS 대기열을 나타낸 예시입니다.

```
"Resource": "arn:aws:sqs:us-east-2:account-ID-without-hyphens:queue1"
```

다음은 AWS 계정에서 `Bob`이라는 이름의 IAM 사용자를 나타내는 예제입니다.

**참고**  
`Resource` 요소에서 IAM 사용자 이름은 대/소문자를 구분합니다.

```
"Resource": "arn:aws:iam::account-ID-without-hyphens:user/Bob"
```

## 리소스 ARN에서 와일드카드 사용
<a name="reference_policies_elements_resource_wildcards"></a>

개별 ARN 세그먼트(콜론으로 구분된 부분) 내에서 와일드카드 문자(`*` 및 `?`)를 사용하여 다음을 표현할 수 있습니다.
+ 모든 문자 조합(`*`)
+ 모든 단일 문자(`?`)

각 세그먼트에 여러 개의 `*` 또는 `?` 문자를 사용할 수 있습니다. `*` 와일드카드가 리소스 ARN 세그먼트의 마지막 문자인 경우 콜론 경계를 넘어서 일치하도록 확장할 수 있습니다. 콜론으로 구분된 ARN 세그먼트 내에서 와일드카드(`*` 및 `?`)를 사용하는 것이 좋습니다.

**참고**  
AWS 제품을 식별하는 서비스 세그먼트에서는 와일드카드 문자를 사용할 수 없습니다. ARN 세그먼트에 대한 자세한 내용은 [Amazon 리소스 이름(ARN)으로 AWS 리소스를 식별합니다.](reference-arns.md) 섹션을 참조하세요.

다음은 경로가 `/accounting`인 IAM 사용자를 모두 나타낸 예시입니다.

```
"Resource": "arn:aws:iam::account-ID-without-hyphens:user/accounting/*"
```

다음은 특정 Amazon S3 버킷 내에 포함된 모든 항목을 나타낸 예시입니다.

```
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
```

별표(`*`) 문자는 확장하여 특정 서비스 네임스페이스 내에서 구분 기호로 나타날 수 있는 슬래시(`/`)와 같은 문자를 포함하여 세그먼트 내의 모든 항목을 바꿀 수 있습니다. 예를 들어, 모든 서비스에 동일한 와일드카드 확장 논리가 적용되는 다음 Amazon S3 ARN을 생각해 봅시다.

```
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*/test/*"
```

ARN의 와일드카드는 나열된 첫 번째 객체뿐만 아니라 버킷의 다음 모든 객체에 적용됩니다.

```
amzn-s3-demo-bucket/1/test/object.jpg
amzn-s3-demo-bucket/1/2/test/object.jpg
amzn-s3-demo-bucket/1/2/test/3/object.jpg 
amzn-s3-demo-bucket/1/2/3/test/4/object.jpg
amzn-s3-demo-bucket/1///test///object.jpg
amzn-s3-demo-bucket/1/test/.jpg
amzn-s3-demo-bucket//test/object.jpg
amzn-s3-demo-bucket/1/test/
```

이전 목록의 마지막 두 객체를 고려하세요. Amazon S3 객체 이름은 일반적인 구분 기호 슬래시(`/`) 문자로 시작하거나 끝낼 수 있습니다. `/` 문자는 구분 기호로 작동하지만 리소스 ARN 내에서 이 문자를 사용할 때는 특별한 의미가 없습니다. 다른 유효한 문자와 동일하게 처리됩니다. ARN이 다음 객체와 일치하지 않습니다.

```
amzn-s3-demo-bucket/1-test/object.jpg
amzn-s3-demo-bucket/test/object.jpg
amzn-s3-demo-bucket/1/2/test.jpg
```

## 여러 리소스 지정
<a name="reference_policies_elements_resource_multiple-resources"></a>

ARN 배열을 사용하여 `Resource` 요소에 여러 리소스를 지정할 수 있습니다. 다음은 DynamoDB 테이블을 두 개 나타낸 예시입니다.

```
"Resource": [
    "arn:aws:dynamodb:us-east-2:account-ID-without-hyphens:table/books_table",
    "arn:aws:dynamodb:us-east-2:account-ID-without-hyphens:table/magazines_table"
]
```

## 리소스 ARN에서 정책 변수 사용
<a name="reference_policies_elements_resource_policy-variables"></a>

`Resource` 요소에서 ARN의 부분에 JSON [정책 변수](reference_policies_variables.md)를 사용하여 특정 리소스를 식별할 수 있습니다(ARN의 끝 부분에 사용). 예를 들어 `{aws:username}` 키를 리소스 ARN에 사용하여 현재 사용자의 이름을 리소스 이름에 추가해야 한다는 것을 나타낼 수 있습니다. 다음은 `{aws:username}` 요소에서 `Resource` 키를 사용하는 방법을 나타낸 예시입니다. 이 정책에서는 현재 사용자 이름과 일치하는 Amazon DynamoDB 테이블에 대한 액세스가 허용됩니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": "dynamodb:*",
        "Resource": "arn:aws:dynamodb:us-east-2:111122223333:table/${aws:username}"
    }
}
```

------

JSON 정책 변수에 대한 자세한 내용은 [IAM 정책 요소: 변수 및 태그](reference_policies_variables.md) 섹션을 참조하세요.

# IAM JSON 정책 요소: NotResource
<a name="reference_policies_elements_notresource"></a>

`NotResource`는 지정된 리소스를 제외한 모든 리소스와 명시적으로 일치하는 고급 정책 요소입니다. `NotResource`를 사용하면 일치하는 리소스의 긴 목록을 포함하는 대신 일치하지 않는 몇몇 리소스만 나열함으로써 정책을 줄일 수 있습니다. 이는 단일 AWS 서비스 내에서 적용되는 정책에 특히 유용합니다.

예를 들어 `HRPayroll`라는 이름의 그룹이 있다고 가정하겠습니다. 그리고 `HRPayroll` 멤버는 `HRBucket` 버킷의 `Payroll` 폴더를 제외하고 모든 Amazon S3 리소스에 액세스할 수 없습니다. 다음 정책은 나열된 리소스 이외의 모든 Amazon S3 리소스에 대한 액세스를 거부합니다. 단, 이 정책은 사용자에게 리소스에 대한 액세스 권한을 부여하는 것이 아닙니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Deny",
    "Action": "s3:*",
    "NotResource": [
      "arn:aws:s3:::HRBucket/Payroll",
      "arn:aws:s3:::HRBucket/Payroll/*"
    ]
  }
}
```

------

일반적으로 리소스에 대한 액세스를 명시적으로 거부하려면 `"Effect":"Deny"`를 사용하고 각 폴더를 개별적으로 나열하는 `Resource` 요소를 포함하는 정책을 작성합니다. 하지만 이때 사용자가 `HRBucket`에 폴더를 추가하거나 액세스하면 안 되는 Amazon S3에 리소스를 추가할 때마다 그 이름 역시 `Resource` 요소의 목록에 추가해야 합니다. 그렇지 않고 `NotResource` 요소를 사용할 때는 폴더 이름을 `NotResource` 요소에 추가하지 않더라도 사용자가 새 폴더에 대한 액세스 권한이 자동으로 거부됩니다.

`NotResource`를 사용할 때는 이 요소에 지정된 리소스가 제한되지 않는 *유일한* 리소스라는 점을 명심해야 합니다. 이렇게 하면 작업에 적용되는 모든 리소스가 제한됩니다. 위의 예에서 정책은 Amazon S3 작업에만 적용되므로 Amazon S3 리소스에만 영향을 미칩니다. `Action` 요소에도 Amazon EC2 작업이 포함되어 있으면 정책에서 `NotResource` 요소에 지정되지 않은 EC2 리소스에 대한 액세스를 거부합니다. 리소스의 ARN을 지정할 수 있는 서비스 작업에 대해 알아보려면 [AWS 서비스에 사용되는 작업, 리소스 및 조건 키](reference_policies_actions-resources-contextkeys.html)를 참조하세요.

## 다른 요소가 있는 NotResource
<a name="notresource-element-combinations"></a>

`"Effect": "Allow"`, `"Action": "*"` 및 `"NotResource": "arn:aws:s3:::HRBucket"` 요소를 함께 사용하면 **안 됩니다**. 이 문은 `HRBucket` S3 버킷을 제외한 모든 리소스에 대해 AWS의 모든 작업을 허용하므로 매우 위험합니다. 이렇게 하면 `HRBucket`에 액세스할 수 있는 정책을 사용자가 직접 추가할 수 있으므로 주의해야 합니다.

동일한 설명문에서 또는 동일한 정책의 다른 설명문에서 `NotResource` 요소와 `"Effect": "Allow"`를 사용할 경우 주의하세요. `NotResource`은 명시적으로 나열되지 않은 모든 서비스 및 작업을 허용하므로 사용자에게 의도한 것보다 많은 권한을 부여하는 결과를 가져올 수 있습니다. 동일한 설명문에서 `NotResource` 요소와 `"Effect": "Deny"`를 사용하면 명시적으로 나열되지 않은 서비스 및 리소스를 거부합니다.

# 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) 섹션을 참조하세요.

# IAM JSON 정책 요소: 조건 연산자
<a name="reference_policies_elements_condition_operators"></a>

<a name="topiclist"></a>

`Condition` 요소의 조건 연산자를 사용하여 정책의 조건 키 및 값을 요청 컨텍스트의 값과 일치시킵니다. `Condition` 요소에 대한 자세한 내용은 [IAM JSON 정책 요소: Condition](reference_policies_elements_condition.md) 섹션을 참조하세요.

정책에서 사용할 수 있는 조건 연산자는 선택한 조건 키에 따라 다릅니다. 전역 조건 키 또는 서비스별 조건 키를 선택할 수 있습니다. 전역 조건 키에 사용할 수 있는 조건 연산자를 알아보려면 [AWS 글로벌 조건 컨텍스트 키](reference_policies_condition-keys.md) 섹션을 참조하세요. 서비스별 조건 키에 사용할 수 있는 조건 연산자를 알아보려면 [AWS 서비스에 대한 작업, 리소스 및 조건 키](reference_policies_actions-resources-contextkeys.html)를 참조하고 보려는 서비스를 선택합니다.

**중요**  
정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않으며 조건은 *false*입니다. 정책 조건에 따라 키가 일치하지 *않아야* 하며(예: `StringNotLike` 또는 `ArnNotLike`) 올바른 키가 존재하지 않는 경우 조건은 *true*입니다. 이 로직은 [...IfExists](#Conditions_IfExists) 및 [Null check](#Conditions_Null)를 제외한 모든 조건 연산자에 적용됩니다. 이 연산자는 키가 요청 컨텍스트에 존재하는지 여부를 테스트합니다.

조건 연산자는 다음 범주로 그룹화할 수 있습니다.
+ [문자열](#Conditions_String)
+ [숫자](#Conditions_Numeric)
+ [날짜 및 시간](#Conditions_Date)
+ [부울](#Conditions_Boolean)
+ [이진](#Conditions_BinaryEquals)
+ [IP 주소](#Conditions_IPAddress)
+ [Amazon 리소스 이름(ARN)](#Conditions_ARN)(일부 서비스에서만 사용 가능.)
+ [...IfExists](#Conditions_IfExists)(키 값이 다른 확인을 위해 존재하는지 여부를 확인)
+ [Null 확인](#Conditions_Null)(키 값이 단독 확인을 위해 존재하는지 여부를 확인)

## 문자열 조건 연산자
<a name="Conditions_String"></a>

문자열 조건 연산자를 사용하여 키와 문자열 값을 비교한 결과에 따라 액세스를 제한하는 `Condition` 요소를 생성할 수 있습니다.
+  **정책 변수** - [지원됨](reference_policies_variables.md)
+ **와일드카드** - [지원됨](#Conditions_String-wildcard)


****  

| 조건 연산자 | 설명 | 
| --- | --- | 
|   `StringEquals`   |  정확한 일치, 대소문자 구분  | 
|   `StringNotEquals`   |  불일치  | 
|   `StringEqualsIgnoreCase`   |  정확한 일치, 대소문자 무시  | 
|   `StringNotEqualsIgnoreCase`   |  불일치, 대소문자 무시  | 
|   `StringLike`   | 대소문자 구분 일치. 문자열 어디에서나 다중 문자 일치 와일드카드(\$1) 및 단일 문자 일치 와일드카드(?)를 값에 포함할 수 있습니다. 부분적으로 문자열이 일치하도록 하려면 와일드카드를 지정해야 합니다.  키에 다수의 값이 저장되는 경우에는 설정 연산자(`StringLike`, `ForAllValues:StringLike`)를 사용해 `ForAnyValue:StringLike`을(를) 한정할 수 있습니다. 자세한 내용은 [다중 값 컨텍스트 키에 대한 연산자 설정](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys) 섹션을 참조하세요.  | 
|   `StringNotLike`   |  대소문자 구분 불일치. 문자열 어디에서나 다중 문자 일치 와일드카드(\$1) 또는 단일 문자 일치 와일드카드(?)를 값에 포함할 수 있습니다.  | 

**Example 문자열 조건 연산자**  
예를 들어, 다음 문에는 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principaltag](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principaltag) 키를 사용하여 요청을 수행하는 보안 주체에게 `iamuser-admin` 작업 범주에서 태그를 지정하도록 지정하는 `Condition` 요소가 포함되어 있습니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": "iam:*AccessKey*",
        "Resource": "arn:aws:iam::111122223333:user/*",
        "Condition": {
            "StringEquals": {
                "aws:PrincipalTag/job-category": "iamuser-admin"
            }
        }
    }
}
```
정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. 이 예제에서는 보안 주체가 태그가 연결된 IAM 사용자를 사용하는 경우 `aws:PrincipalTag/job-category` 키가 요청 컨텍스트에 존재합니다. 이는 태그 또는 세션 태그가 연결된 IAM 역할을 사용하는 보안 주체를 위해 포함된 것이기도 합니다. 태그가 없는 사용자가 액세스 키를 보거나 편집하려고 하면 조건이 `false`을 반환하고 요청이 이 문에 의해 묵시적으로 거부됩니다.  
다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다.  


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/job-category": "iamuser-admin"<br />}</pre>  | <pre>aws:PrincipalTag/job-category:<br />  – iamuser-admin</pre>  |  일치 항목 있음 | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/job-category": "iamuser-admin"<br />}</pre>  | <pre>aws:PrincipalTag/job-category:<br />  – dev-ops</pre>  | 일치 항목 없음 | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/job-category": "iamuser-admin"<br />}</pre>  |  요청 컨텍스트에 `aws:PrincipalTag/job-category`가 없습니다.  | 일치 항목 없음 | 

**Example 문자열 조건 연산자와 함께 정책 변수 사용**  
다음 예제에서는 `StringLike` 조건 연산자를 사용하여 [정책 변수](reference_policies_variables.md)와 문자열 일치를 수행해 IAM 사용자가 Amazon S3 콘솔을 사용하여 Amazon S3 버킷에서 자신의 ‘홈 디렉토리’를 관리할 수 있는 정책을 생성할 수 있습니다. 이 정책은 `s3:prefix`가 지정된 패턴 중 하나와 일치하는 경우 S3 버킷에서 지정된 작업을 허용합니다.    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation"
      ],
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "",
            "home/",
            "home/${aws:username}/"
          ]
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/home/${aws:username}",
        "arn:aws:s3:::amzn-s3-demo-bucket/home/${aws:username}/*"
      ]
    }
  ]
}
```
다음 표에서는 AWS가 요청 컨텍스트에 있는 [aws:username](reference_policies_condition-keys.md#condition-keys-username) 값을 기반으로 서로 다른 사용자에 대해 이 정책을 평가하는 방법을 보여줍니다.  


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"StringLike": {<br />  "s3:prefix": [<br />    "home/",<br />    "home/${aws:username}/"<br />  ]<br />}</pre>  | <pre>aws:username:<br />  – martha_rivera</pre>  | <pre>"StringLike": {<br />  "s3:prefix": [<br />    "home/",<br />    "home/martha_rivera/"<br />  ]<br />}</pre>  | 
|  <pre>"StringLike": {<br />  "s3:prefix": [<br />    "home/",<br />    "home/${aws:username}/"<br />  ]<br />}</pre>  |  <pre>aws:username:<br />  – nikki_wolf</pre>  |  <pre>"StringLike": {<br />  "s3:prefix": [<br />    "home/",<br />    "home/nikki_wolf/"<br />  ]<br />}</pre>  | 
|  <pre>"StringLike": {<br />  "s3:prefix": [<br />    "home/",<br />    "home/${aws:username}/"<br />  ]<br />}</pre>  |  요청 컨텍스트에 `aws:username`가 없습니다.  | 일치 항목 없음 | 
OIDC 페더레이션 시 `Condition` 요소를 사용하여 애플리케이션 ID와 사용자 ID에 따라 리소스 액세스를 제한하는 방법을 보여주는 정책의 예는 [Amazon S3: Amazon Cognito 사용자가 버킷에 있는 객체에 액세스하도록 허용](reference_policies_examples_s3_cognito-bucket.md) 섹션을 참조하세요.

### 다중 값 문자열 조건 연산자
<a name="conditions_string_multivalued"></a>

요청에서 키가 다중 값을 포함하는 경우 문자열 연산자는 세트 연산자 `ForAllValues` 및 `ForAnyValue`를 사용해 한정할 수 있습니다. 여러 컨텍스트 키 또는 값의 평가 로직에 대한 자세한 내용은 [다중 값 컨텍스트 키에 대한 연산자 설정](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys) 섹션을 참조하세요.


| 조건 연산자 | 설명 | 
| --- | --- | 
|  `ForAllValues:StringEquals` `ForAllValues:StringEqualsIgnoreCase`  |  요청에서 조건 키에 대한 모든 값이 정책에 있는 하나 이상의 값과 일치해야 합니다.  | 
|  `ForAnyValue:StringEquals` `ForAnyValue:StringEqualsIgnoreCase`  |  요청에서 하나 이상의 조건 키 값이 정책에 있는 값 중 하나와 일치해야 합니다.  | 
|  `ForAllValues:StringNotEquals` `ForAllValues:StringNotEqualsIgnoreCase`  |  불일치. 요청에서 모든 컨텍스트 키 값이 정책에 있는 컨텍스트 키 값과 일치할 수 없습니다.  | 
|  `ForAnyValue:StringNotEquals` `ForAnyValue:StringNotEqualsIgnoreCase`  |  불일치. 요청에서 하나 이상의 컨텍스트 키 값이 정책에 있는 컨텍스트 키의 값과 일치하지 않아야 합니다.  | 
|  `ForAllValues:StringLike`  |  요청에서 조건 키에 대한 모든 값이 정책에 있는 하나 이상의 값과 일치해야 합니다.  | 
|  `ForAnyValue:StringLike`  |  요청에서 하나 이상의 조건 키 값이 정책에 있는 값 중 하나와 일치해야 합니다.  | 
|  `ForAllValues:StringNotLike`  |  불일치. 요청에서 모든 컨텍스트 키 값이 정책에 있는 컨텍스트 키 값과 일치할 수 없습니다.  | 
|  `ForAnyValue:StringNotLike`  |  불일치. 요청에서 하나 이상의 컨텍스트 키 값이 정책에 있는 컨텍스트 키의 값과 일치하지 않아야 합니다.  | 

**Example 문자열 조건 연산자와 함께 `ForAnyValue` 사용**  
이 예제는 태그를 인스턴스에 연결하는 Amazon EC2 `CreateTags` 작업 사용을 허용하는 아이덴티티 기반 정책을 생성하는 방법을 보여줍니다. `StringEqualsIgnoreCase`를 사용할 때 태그에 `preprod` 또는 `storage` 값을 사용하는 `environment` 키가 있는 경우에만 태그를 연결할 수 있습니다. 연산자에 `IgnoreCase`를 추가하면 기존 태그 값의 대소문자 조합(예: `preprod`, `Preprod`, `PreProd`)을 true로 해석할 수 있습니다.  
[aws:TagKeys](reference_policies_condition-keys.md#condition-keys-tagkeys) 조건 키와 함께 `ForAnyValue` 한정자를 추가하는 경우 요청에서 하나 이상의 태그 키 값이 `environment` 값과 일치해야 합니다. `ForAnyValue` 비교는 대소문자를 구분하므로 `environment` 대신 `Environment`를 사용하는 등 태그 키에 잘못된 대소문자를 사용할 수 없습니다.    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "ec2:CreateTags",
    "Resource": "arn:aws:ec2:*:*:instance/*",
    "Condition": {
      "StringEqualsIgnoreCase": {
        "aws:RequestTag/environment": [
          "preprod",
          "storage"
        ]
      },
      "ForAnyValue:StringEquals": {
        "aws:TagKeys": "environment"
      }
    }
  }
}
```
 다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다.  


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

### 와일드카드 매칭
<a name="Conditions_String-wildcard"></a>

문자열 조건 연산자는 사전 정의된 형식을 적용하지 않는 패턴 없는 매칭을 수행합니다. ARN 및 날짜 조건 연산자는 조건 키 값에 구조를 적용하는 문자열 연산자의 하위 집합입니다.

키를 비교하려는 값에 해당하는 조건 연산자를 사용하는 것이 좋습니다. 예를 들어, 키를 문자열 값과 비교할 때는 [문자열 조건 연산자](#Conditions_String)을 사용해야 합니다. 마찬가지로 키를 ARN 값과 비교할 때는 [Amazon 리소스 이름(ARN) 조건 연산자](#Conditions_ARN)을 사용해야 합니다.

**Example**  
이 예제에서는 조직의 리소스에 대한 경계를 생성하는 방법을 보여줍니다. 이 정책의 조건은 액세스하는 리소스가 AWS Organizations에서 조직 단위(OU)의 특정 세트에 없으면 Amazon S3 작업에 대한 액세스를 거부합니다. AWS Organizations 경로는 조직 엔터티 구조의 텍스트 표현입니다.  
이 조건의 경우 `aws:ResourceOrgPaths`에 나열된 OU 경로가 포함되어 있어야 합니다. `aws:ResourceOrgPaths`는 다중 값 조건이므로 정책은 `ForAllValues:StringNotLike` 연산자를 사용하여 `aws:ResourceOrgPaths`의 값을 정책의 OU 목록과 비교합니다.    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyS3AccessOutsideMyBoundary",
      "Effect": "Deny",
      "Action": [
        "s3:*"
      ],
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringNotLike": {
          "aws:ResourceOrgPaths": [
            "o-acorg/r-acroot/ou-acroot-mediaou/",
            "o-acorg/r-acroot/ou-acroot-sportsou/*"
          ] 
        }
      }
    }
  ]
}
```
다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다.  


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"ForAllValues:StringNotLike": {<br />  "aws:ResourceOrgPaths": [<br />    "o-acorg/r-acroot/ou-acroot-mediaou/",<br />    "o-acorg/r-acroot/ou-acroot-sportsou/*"<br />  ] <br />}</pre>  | <pre>aws:ResourceOrgPaths:<br />  – o-acorg/r-acroot/ou-acroot-sportsou/costcenter/</pre>  | 일치 항목 있음 | 
|  <pre>"ForAllValues:StringNotLike": {<br />  "aws:ResourceOrgPaths": [<br />    "o-acorg/r-acroot/ou-acroot-mediaou/",<br />    "o-acorg/r-acroot/ou-acroot-sportsou/*"<br />  ] <br />}</pre>  | <pre>aws:ResourceOrgPaths:<br />  – o-acorg/r-acroot/ou-acroot-mediaou/costcenter/</pre>  | 일치 항목 없음 | 
|  <pre>"ForAllValues:StringNotLike": {<br />  "aws:ResourceOrgPaths": [<br />    "o-acorg/r-acroot/ou-acroot-mediaou/",<br />    "o-acorg/r-acroot/ou-acroot-sportsou/*"<br />  ] <br />}</pre>  |  요청에 `aws:ResourceOrgPaths:`가 없습니다.  | 일치 항목 없음 | 

## 숫자 조건 연산자
<a name="Conditions_Numeric"></a>

숫자 조건 연산자를 사용하여 키와 정수 또는 십진수 값을 비교한 결과에 따라 액세스를 제한하는 `Condition` 요소를 생성할 수 있습니다.
+  **정책 변수** - 지원되지 않음
+ **와일드카드** - 지원되지 않음


****  

| 조건 연산자 | 설명 | 
| --- | --- | 
|   `NumericEquals`   |  일치  | 
|   `NumericNotEquals`   |  불일치  | 
|   `NumericLessThan`   |  "미만" 일치  | 
|   `NumericLessThanEquals`   |  "이하" 일치  | 
|   `NumericGreaterThan`   |  "초과" 일치  | 
|   `NumericGreaterThanEquals`   |  "이상" 일치  | 

예를 들어, 다음 문에는 `NumericLessThanEquals` 조건 연산자에 `s3:max-keys` 키를 사용하여 요청자가 `amzn-s3-demo-bucket`에서 한 번에 *최대* 10개까지 객체를 나열할 수 있다고 지정하는 `Condition` 요소가 포함되어 있습니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "s3:ListBucket",
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
    "Condition": {"NumericLessThanEquals": {"s3:max-keys": "10"}}
  }
}
```

------

정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. 이 예제에서는`ListBucket` 작업을 수행할 때 요청에 `s3:max-keys` 키가 항상 존재합니다. 이 정책에서 모든 Amazon S3 작업을 허용한 경우에는 값이 10 이하인 `max-keys` 컨텍스트 키를 포함하는 작업만 허용됩니다.

## 날짜 조건 연산자
<a name="Conditions_Date"></a>

날짜 조건 연산자를 사용하여 키와 날짜/시간 값을 비교한 결과에 따라 액세스를 제한하는 `Condition` 요소를 생성할 수 있습니다. 이러한 조건 연산자는 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-currenttime](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-currenttime) 키 또는 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-epochtime](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-epochtime) 키와 함께 사용합니다. 날짜/시간 값은 [ISO 8601 날짜 형식의 W3C 구현 값](http://www.w3.org/TR/NOTE-datetime) 중의 하나, 또는 epoch(UNIX) 시간으로 지정해야 합니다.
+  **정책 변수** - 지원되지 않음
+ **와일드카드** - 지원되지 않음


****  

| 조건 연산자 | 설명 | 
| --- | --- | 
|   `DateEquals`   |  특정 날짜 일치  | 
|   `DateNotEquals`   |  불일치  | 
|   `DateLessThan`   |  특정 날짜/시간 이전에 일치  | 
|   `DateLessThanEquals`   |  특정 날짜/시간 또는 이전에 일치  | 
|   `DateGreaterThan`   |  특정 날짜/시간 이후에 일치  | 
|   `DateGreaterThanEquals`   |  특정 날짜/시간 또는 이후에 일치  | 

예를 들어, 다음 문에는 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tokenissuetime](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tokenissuetime) 키와 함께 `DateGreaterThan` 조건 연산자를 사용하는 `Condition` 요소가 포함되어 있습니다. 이 조건은 요청을 생성하는 데 사용된 임시 보안 자격 증명이 2020년에 발급되었음을 지정합니다. 계정 멤버가 새로운 자격 증명을 사용하도록 매일 프로그래밍 방식으로 이 정책을 업데이트할 수 있습니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": "iam:*AccessKey*",
        "Resource": "arn:aws:iam::111122223333:user/*",
        "Condition": {
            "DateGreaterThan": {
                "aws:TokenIssueTime": "2020-01-01T00:00:01Z"
            }
        }
    }
}
```

------

정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. `aws:TokenIssueTime` 키는 사용자가 임시 자격 증명을 사용하여 요청을 생성하는 경우에만 요청 컨텍스트에 존재합니다. 액세스 키를 사용하는 AWS CLI, AWS API 또는 AWS SDK 요청에는 이 키가 존재하지 않습니다. 이 예제에서 IAM 사용자가 액세스 키를 보거나 편집하려고 하면 요청이 거부됩니다.

## 부울 조건 연산자
<a name="Conditions_Boolean"></a>

부울 조건을 사용하면 키를 `true` 또는 `false`와 비교한 결과에 따라 액세스를 제한하는 `Condition` 요소를 생성할 수 있습니다.

키에 다중 값이 포함된 경우 부울 연산자는 세트 연산자 `ForAllValues` 및 `ForAnyValue`를 사용해여 한정할 수 있습니다. 여러 컨텍스트 키 또는 값의 평가 로직에 대한 자세한 내용은 [다중 값 컨텍스트 키에 대한 연산자 설정](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys) 섹션을 참조하세요.
+  **정책 변수** - [지원됨](reference_policies_variables.md)
+ **와일드카드** - 지원되지 않음


****  

| 조건 연산자 | 설명 | 
| --- | --- | 
|   `Bool`   |  부울 일치  | 
|   `ForAllValues:Bool`   |  부울 배열 데이터 유형과 함께 사용합니다. 컨텍스트 키 값의 모든 부울이 정책에 있는 부울 값과 일치해야 합니다. `ForAllValues` 연산자가 누락된 컨텍스트 키 또는 값이 비어 있는 컨텍스트 키를 허용된 항목으로 평가하지 않도록 정책에 [Null 조건 연산자](#Conditions_Null)를 포함할 수 있습니다.  | 
|   `ForAnyValue:Bool`   |  부울 배열 데이터 유형과 함께 사용합니다. 컨텍스트 키 값에서 하나 이상의 부울이 정책에 있는 부울 값과 일치해야 합니다.  | 

**Example 부울 조건 연산자**  
다음과 같은 ID 기반 정책은 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-securetransport](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-securetransport) 키와 함께 `Bool` 조건 연산자를 사용하여 요청이 SSL을 통해 전달되지 않는 경우 대상 버킷 및 해당 콘텐츠로의 객체 및 객체 태그 복제를 거부합니다.  
이 정책은 어떤 작업도 허용하지 않습니다. 이 정책을 특정 작업을 허용하는 다른 정책과 함께 사용합니다.  
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "BooleanExample",
      "Action": "s3:ReplicateObject",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket",
        "arn:aws:s3:::amzn-s3-demo-bucket/*"
      ],
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      }
    }
  ]
}
```
다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다.  


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"Bool": {<br />  "aws:SecureTransport": "false"<br />}</pre>  | <pre>aws:SecureTransport:<br />  – false</pre>  | 일치 항목 있음 | 
|  <pre>"Bool": {<br />  "aws:SecureTransport": "false"<br />}</pre>  | <pre>aws:SecureTransport:<br />  – true</pre>  | 일치 항목 없음 | 
|  <pre>"Bool": {<br />  "aws:SecureTransport": "false"<br />}</pre>  |  요청 컨텍스트에 `aws:SecureTransport`가 없습니다.  | 일치 항목 없음 | 

## 이진 조건 연산자
<a name="Conditions_BinaryEquals"></a>

`BinaryEquals` 조건 연산자를 사용하면 이진 형식의 키 값을 테스트하는 `Condition` 요소를 생성할 수 있습니다. 지정한 키 값을 정책 내 이진 값의 [base-64](https://en.wikipedia.org/wiki/Base64) 인코딩 표시와 바이트 단위(byte for byte)로 비교합니다. 정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다.
+  **정책 변수** - 지원되지 않음
+ **와일드카드** - 지원되지 않음

```
"Condition" : {
  "BinaryEquals": {
    "key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA=="
  }
}
```


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"BinaryEquals": {<br />  "key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA=="<br />}</pre>  | <pre>key:<br />  – QmluYXJ5VmFsdWVJbkJhc2U2NA==</pre>  | 일치 항목 있음 | 
|  <pre>"BinaryEquals": {<br />  "key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA=="<br />}</pre>  | <pre>key:<br />  – ASIAIOSFODNN7EXAMPLE</pre>  | 일치 항목 없음 | 
|  <pre>"BinaryEquals": {<br />  "key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA=="<br />}</pre>  |  요청 컨텍스트에 `key`가 없습니다.  | 일치 항목 없음 | 

## IP 주소 조건 연산자
<a name="Conditions_IPAddress"></a>

IP 주소 조건 연산자를 사용하여 IPv4/IPv6 주소 또는 IP 주소 범위와 키를 비교한 결과에 따라 액세스를 제한하는 `Condition` 요소를 생성할 수 있습니다. 이 조건에는 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceip](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceip) 키가 사용됩니다. 값은 표준 CIDR 형식(예: 203.0.113.0/24 또는 2001:DB8:1234:5678::/64)을 따라야 합니다. 연결된 라우팅 접두사 없이 IP 주소를 지정하면 IAM은 기본 접두사 값 `/32`를 사용합니다.

일부 AWS 서비스는 0의 범위를 나타내기 위해 ::을 사용해 IPv6를 지원합니다. 서비스가 IPv6를 지원하는지 여부를 확인하려면 서비스 설명서를 참조하세요.
+  **정책 변수** - 지원되지 않음
+ **와일드카드** - 지원되지 않음


****  

| 조건 연산자 | 설명 | 
| --- | --- | 
|   `IpAddress`   |  지정된 IP 주소 또는 범위  | 
|   `NotIpAddress`   |  지정된 IP 주소 또는 범위를 제외한 모든 IP 주소  | 

**Example IP 주소 조건 연산자**  
다음 명령문은 `IpAddress` 조건 연산자에 `aws:SourceIp` 키를 사용하여 IP 범위 203.0.113.0\$1203.0.113.255에서 요청이 전송되어야 한다고 지정하고 있습니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": "iam:*AccessKey*",
        "Resource": "arn:aws:iam::111122223333:user/*",
        "Condition": {
            "IpAddress": {
                "aws:SourceIp": "203.0.113.0/24"
            }
        }
    }
}
```
`aws:SourceIp` 조건 키는 요청이 전송되는 IP 주소를 확인합니다. 요청이 Amazon EC2 인스턴스에서 전송된 경우에는 `aws:SourceIp`가 인스턴스의 퍼블릭 IP 주소로 계산되어야 합니다.  
정책 조건에서 지정한 키가 요청 컨텍스트에 없으면 값이 일치하지 않습니다. `aws:SourceIp` 키는 요청자가 VPC 엔드포인트를 사용하여 요청을 생성한 경우를 제외하고 요청 컨텍스트에 항상 존재합니다. 이 경우 조건이 `false`를 반환하고 요청이 이 문에 의해 묵시적으로 거부됩니다.  
다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다.  


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"IpAddress": {<br />  "aws:SourceIp": "203.0.113.0/24"<br />}</pre>  | <pre>aws:SourceIp:<br />  – 203.0.113.1</pre>  | 일치 항목 있음 | 
|  <pre>"IpAddress": {<br />  "aws:SourceIp": "203.0.113.0/24"<br />}</pre>  | <pre>aws:SourceIp:<br />  – 198.51.100.1</pre>  | 일치 항목 없음 | 
다음 예제에서는 IPv4와 IPv6 주소를 혼합하여 조직의 유효 IP 주소를 모두 표현하는 방법을 보여줍니다. IPv6으로 전환하는 동안 조직의 정책이 계속 적용되도록 하려면 기존의 IPv4 주소 범위에 IPv6 범위를 더하여 정책을 업그레이드하는 것이 좋습니다.    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "someservice:*",
    "Resource": "*",
    "Condition": {
      "IpAddress": {
        "aws:SourceIp": [
          "203.0.113.0/24",
          "2001:DB8:1234:5678::/64"
        ]
      }
    }
  }
}
```
사용자 자격으로 직접 테스트한 API를 호출하는 경우 `aws:SourceIp` 조건 키는 JSON 정책에서만 작동합니다. 서비스를 사용하여 사용자를 대신해 대상 서비스를 호출하는 경우, 대상 서비스는 원래 사용자의 IP 주소 대신 호출 서비스의 IP 주소를 봅니다. 이러한 상황은 예를 들어 AWS CloudFormation을 사용하여 인스턴스를 생성하는 Amazon EC2를 호출하는 경우에 발생할 수 있습니다. 현재로서는 JSON 정책에 따라 평가하기 위해 원본 IP 주소를 호출 서비스를 통해 대상 서비스로 보낼 방법이 없습니다. 이러한 서비스 API 호출 유형의 경우 `aws:SourceIp` 조건 키를 사용하지 마십시오.

## Amazon 리소스 이름(ARN) 조건 연산자
<a name="Conditions_ARN"></a>

Amazon 리소스 이름(ARN) 조건 연산자를 사용하면 키와 ARN을 비교한 결과에 따라 액세스를 제한하는 `Condition` 요소를 생성할 수 있습니다. ARN은 문자열로 알려져 있습니다.
+  **정책 변수** - [지원됨](reference_policies_variables.md)
+ **와일드카드** - [지원됨](reference_policies_elements_resource.md#reference_policies_elements_resource_wildcards)


****  

| 조건 연산자 | 설명 | 
| --- | --- | 
|   `ArnEquals`, `ArnLike`  |  ARN 대소문자 구분 일치. ARN에서 콜론으로 구분된 구성요소 6개는 각각 별도로 확인하며, 다중 문자 일치 와일드카드(\$1) 또는 단일 문자 일치 와일드카드(?)가 추가될 수 있습니다. `ArnEquals` 과 `ArnLike` 조건 연산자는 동일하게 동작합니다.  | 
|   `ArnNotEquals`, `ArnNotLike`  |  ARN 불일치. `ArnNotEquals` 과 `ArnNotLike` 조건 연산자는 동일하게 동작합니다.  | 

**Example ARN 조건 연산자**  
다음의 리소스 기반 정책 예는 SNS 메시지를 전송하고 싶은 Amazon SQS 대기열에 연결된 정책을 보여줍니다. 이 예제에서는 선택한 대기열로 메시지를 전송할 수 있는 권한을 Amazon SNS에 부여하고 있습니다. 단, 서비스에서 특정 Amazon SNS 주제와 관련하여 메시지를 전송하는 경우로 제한됩니다. 대기열을 `Resource` 필드에, 그리고 Amazon SNS 주제는 `SourceArn` 키 값으로 지정합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Principal": {
            "Service": "sns.amazonaws.com"
        },
        "Action": "SQS:SendMessage",
        "Resource": "arn:aws:sqs:us-east-1:123456789012:QUEUE-ID",
        "Condition": {
            "ArnEquals": {
                "aws:SourceArn": "arn:aws:sns:us-east-1:123456789012:TOPIC-ID"
            }
        }
    }
}
```
[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 키는 리소스가 리소스 소유자를 대신하여 다른 서비스를 호출하도록 서비스를 트리거하는 경우에만 요청 컨텍스트에 존재합니다. IAM 사용자가 이 작업을 직접 수행하려고 하면 조건이 `false`을 반환하고 요청이 이 문에 의해 묵시적으로 거부됩니다.  
다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다.  


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"ArnEquals": {<br />  "aws:SourceArn": "arn:aws:sns:us-west-2:123456789012:TOPIC-ID"<br />}</pre>  | <pre>aws:SourceArn:<br />  – arn:aws:sns:us-west-2:123456789012:TOPIC-ID</pre>  | 일치 항목 있음 | 
|  <pre>"ArnEquals": {<br />  "aws:SourceArn": "arn:aws:sns:us-west-2:123456789012:TOPIC-ID"<br />}</pre>  | <pre>aws:SourceArn:<br />  – arn:aws:sns:us-west-2:777788889999:TOPIC-ID</pre>  | 일치 항목 없음 | 
|  <pre>"ArnEquals": {<br />  "aws:SourceArn": "arn:aws:sns:us-west-2:123456789012:TOPIC-ID"<br />}</pre>  |  요청 컨텍스트에 `aws:SourceArn`가 없습니다.  | 일치 항목 없음 | 

### 다중 값 ARN 조건 연산자
<a name="conditions_arn_multivalued"></a>

요청에서 키가 다중 값을 포함하는 경우 ARN 연산자는 세트 연산자 `ForAllValues` 및 `ForAnyValue`를 사용해 한정할 수 있습니다. 여러 컨텍스트 키 또는 값의 평가 로직에 대한 자세한 내용은 [다중 값 컨텍스트 키에 대한 연산자 설정](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys) 섹션을 참조하세요.


| 조건 연산자 | 설명 | 
| --- | --- | 
|  `ForAllValues:ArnEquals` `ForAllValues:ArnLike`  |  요청 컨텍스트에서 모든 ARN이 정책에 있는 하나 이상의 ARN 패턴과 일치해야 합니다.  | 
|  `ForAnyValue:ArnEquals` `ForAnyValue:ArnLike`  |  요청 컨텍스트에서 하나 이상의 ARN이 정책에 있는 ARN 패턴 중 하나와 일치해야 합니다.  | 
|  `ForAllValues:ArnNotEquals` `ForAllValues:ArnNotLike`  |  불일치. 요청 컨텍스트에서 모든 ARN이 정책에 있는 문자열 ARN 패턴과 일치할 수 없습니다.  | 
|  `ForAnyValue:ArnNotEquals` `ForAnyValue:ArnNotLike`  |  불일치. 요청 컨텍스트에서 하나 이상의 ARN이 정책에 있는 ARN 패턴과 일치해서는 안 됩니다.  | 

**Example ARN 조건 연산자와 함께 `ForAllValues` 사용**  
다음 예제에서는 `ForAllValues:ArnLike`를 사용하여 Amazon CloudWatch Logs 로그에 대한 논리적 전송 소스를 생성하거나 업데이트합니다. 조건 블록에는 요청에서 전달되는 로그 생성 리소스 ARN을 필터링하기 위해 [https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoncloudwatchlogs.html#amazoncloudwatchlogs-policy-keys](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoncloudwatchlogs.html#amazoncloudwatchlogs-policy-keys) 조건 키가 포함됩니다. 이 조건 연산자를 사용하면 요청에서 모든 ARN이 정책에 있는 하나 이상의 ARN과 일치해야 합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "logs:PutDeliverySource",
            "Resource": "arn:aws:logs:us-east-1:123456789012:delivery-source:*",
            "Condition": {
                "ForAllValues:ArnLike": {
                    "logs:LogGeneratingResourceArns": [
                        "arn:aws:cloudfront::123456789012:distribution/*",
                        "arn:aws:cloudfront::123456789012:distribution/support*"
                    ]
                }
            }
        }
    ]
}
```
다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다.  


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"ForAllValues:ArnLike": {<br />  "logs:LogGeneratingResourceArns": [<br />    "arn:aws::cloudfront:123456789012:distribution/*",<br />    "arn:aws::cloudfront:123456789012:distribution/support*"<br />  ]<br />}</pre>  | <pre>logs:LogGeneratingResourceArns:<br />  – arn:aws::cloudfront:123456789012:distribution/costcenter</pre>  | 일치 항목 있음 | 
|  <pre>"ForAllValues:ArnLike": {<br />  "logs:LogGeneratingResourceArns": [<br />    "arn:aws::cloudfront:123456789012:distribution/*",<br />    "arn:aws::cloudfront:123456789012:distribution/support*"<br />  ]<br />}</pre>  | <pre>logs:LogGeneratingResourceArns:<br />  – arn:aws::cloudfront:123456789012:distribution/costcenter<br />  – arn:aws::cloudfront:123456789012:distribution/support2025</pre>  | 일치 항목 있음 | 
|  <pre>"ForAllValues:ArnLike": {<br />  "logs:LogGeneratingResourceArns": [<br />    "arn:aws::cloudfront:123456789012:distribution/*",<br />    "arn:aws::cloudfront:123456789012:distribution/support*"<br />  ]<br />}</pre>  | <pre>logs:LogGeneratingResourceArns:<br />  – arn:aws::cloudfront:123456789012:distribution/costcenter<br />  – arn:aws::cloudfront:123456789012:distribution/admin</pre>  | 일치 항목 없음 | 
|  <pre>"ForAllValues:ArnLike": {<br />  "logs:LogGeneratingResourceArns": [<br />    "arn:aws::cloudfront:123456789012:distribution/*",<br />    "arn:aws::cloudfront:123456789012:distribution/support*"<br />  ]<br />}</pre>  | <pre>logs:LogGeneratingResourceArns:<br />  – arn:aws::cloudfront:777788889999:distribution/costcenter</pre>  | 일치 항목 없음 | 
|  <pre>"ForAllValues:ArnLike": {<br />  "logs:LogGeneratingResourceArns": [<br />    "arn:aws::cloudfront:123456789012:distribution/*",<br />    "arn:aws::cloudfront:123456789012:distribution/support*"<br />  ]<br />}</pre>  |  요청 컨텍스트에 `logs:LogGeneratingResourceArns`가 없습니다.  | 일치 항목 있음  | 
요청에 컨텍스트 키가 없거나 컨텍스트 키 값이 빈 문자열과 같은 Null 데이터세트로 해석되는 경우 `ForAllValues` 한정자는 true를 반환합니다. 누락된 컨텍스트 키 또는 값이 비어 있는 컨텍스트 키를 true로 평가하지 않도록 정책에서 [Null 조건 연산자](#Conditions_Null)를 `false` 값과 함께 포함하여 컨텍스트 키가 존재하고 해당 값이 Null이 아닌지 확인할 수 있습니다.

## …IfExists 조건 연산자
<a name="Conditions_IfExists"></a>

`Null` 조건을 제외하고 조건 연산자 이름 끝에 `IfExists`를 추가할 수 있습니다(예: `StringLikeIfExists`). 이렇게 하면 "요청 컨텍스트에 조건 키가 있으면 정책에 지정된 대로 키를 처리합니다. 키가 없으면 조건 요소를 true로 평가합니다." 문의 다른 조건 요소는 여전히 불일치한 결과를 발생시킬 수 있지만 `...IfExists`로 확인하면 누락되는 키는 없습니다. `StringNotEqualsIfExists`와 같은 부정 조건 연산자와 함께 `"Effect": "Deny"` 요소를 사용하는 경우 조건 키가 제공되지 않아도 요청이 계속 거부됩니다.

**`IfExists` 사용 예제**

대부분 조건 키는 특정 형식의 리소스 정보를 의미하기 때문에 해당 형식의 리소스에 액세스할 때만 존재합니다. 이러한 조건 키는 다른 형식의 리소스에는 표시되지 않습니다. 그렇다고 정책 문이 한 가지 형식의 리소스에만 적용된다고 해서 문제가 되지는 않습니다. 하지만 정책 문이 여러 서비스의 작업을 참조하는 경우나, 혹은 한 가지 서비스 내에서 임의의 작업이 동일한 서비스에서 여러 가지 다른 리소스 형식에 액세스하는 경우처럼 단일 문이 여러 유형의 리소스에 적용될 수 있는 경우도 있습니다. 이런 경우 오직 한 가지 리소스에만 적용되는 조건 키를 정책 문에 추가하면 정책 문의 `Condition` 요소를 충족하지 못하고 결국 `"Effect"`가 적용되지 않습니다.

예를 들어 다음과 같은 정책 예제를 살펴보십시오.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Sid": "THISPOLICYDOESNOTWORK",
    "Effect": "Allow",
    "Action": "ec2:RunInstances",
    "Resource": "*",
    "Condition": {"StringLike": {"ec2:InstanceType": [
      "t1.*",
      "t2.*",
      "m3.*"
    ]}}
  }
}
```

------

위 정책의 *의도*는 사용자가 `t1`, `t2` 또는 `m3` 형식의 인스턴스를 모두 실행할 수 있도록 하는 것이 목적입니다. 하지만 인스턴스를 실행하려면 인스턴스 외에도 이미지, 키 페어, 보안 그룹 등 다양한 리소스에 액세스해야 합니다. 전체 문은 인스턴스를 실행하는 데 필요한 모든 리소스와 비교하여 평가됩니다. 하지만 이러한 추가 리소스에는 `ec2:InstanceType` 조건 키가 없기 때문에 `StringLike` 검사는 fail로 끝나고 사용자에게 권한이 부여되지 않아 *어떤* 인스턴스 유형도 실행하지 못합니다.

이 문제를 해결하려면 그 대신 `StringLikeIfExists` 조건 연산자를 사용해야 합니다. 이렇게 하면 조건 키가 존재하는 경우에만 테스트가 실행됩니다. 그 결과 다음 정책은 이렇게 해석할 수 있습니다. “검사 대상 리소스에 '`ec2:InstanceType`' 조건 키가 있으면 키 값이 `t1.`, `t2.` 또는 `m3.`로 시작할 때에만 작업을 허용합니다. 검사 대상 리소스에 조건 키가 없으면 그냥 둡니다." 조건 키 값에 별표(\$1)를 `StringLikeIfExists` 조건 연산자와 함께 사용하면 와일드카드로 해석되어 문자열이 부분적으로 일치합니다. `DescribeActions` 문에는 콘솔에서 해당 인스턴스를 보는 데 필요한 작업이 포함되어 있습니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "RunInstance",
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": "*",
      "Condition": {
        "StringLikeIfExists": {
          "ec2:InstanceType": [
            "t1.*",
            "t2.*",
            "m3.*"
          ]
        }
      }
    },
    {
      "Sid": "DescribeActions",
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeImages",
        "ec2:DescribeInstances",
        "ec2:DescribeVpcs",
        "ec2:DescribeKeyPairs",
        "ec2:DescribeSubnets",
        "ec2:DescribeSecurityGroups"
      ],
      "Resource": "*"
    }
  ]
}
```

------

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


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"StringLikeIfExists": {<br />  "ec2:InstanceType": [<br />    "t1.*",<br />    "t2.*",<br />    "m3.*"<br />  ]<br />}</pre>  | <pre>ec2:InstanceType:<br />  – t1.micro</pre>  | 일치 항목 있음 | 
|  <pre>"StringLikeIfExists": {<br />  "ec2:InstanceType": [<br />    "t1.*",<br />    "t2.*",<br />    "m3.*"<br />  ]<br />}</pre>  | <pre>ec2:InstanceType:<br />  – m2.micro</pre>  | 일치 항목 없음 | 
|  <pre>"StringLikeIfExists": {<br />  "ec2:InstanceType": [<br />    "t1.*",<br />    "t2.*",<br />    "m3.*"<br />  ]<br />}</pre>  |  요청 컨텍스트에 `ec2:InstanceType`가 없습니다.  | 일치 항목 있음 | 

## 조건 키의 존재를 확인하는 조건 연산자
<a name="Conditions_Null"></a>

`Null` 조건 연산자를 사용하여 권한을 부여하는 시점에 조건 키가 없는지 확인합니다. 정책 문에서는 `true`(키가 부재하며 값이 null임) 또는 `false`(키가 존재하며 값이 null이 아님)를 사용합니다.

[정책 변수](reference_policies_variables.md)를 `Null` 조건 연산자와 함께 사용할 수 없습니다.

예를 들어, 이 조건 연산자를 사용하여 사용자가 요청 시 임시 자격 증명 또는 자신의 자격 증명을 사용하는지 여부를 알 수 있습니다. 사용자가 임시 자격 증명을 사용하는 경우에는 `aws:TokenIssueTime` 키가 존재하며, 값을 갖고 있습니다. 다음은 Amazon EC2 API 사용자의 경우 임시 자격 증명을 사용해야 한다는 것(키가 없을 수 없음)을 명시하는 조건을 나타낸 예제입니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement":{
      "Action":"ec2:*",
      "Effect":"Allow",
      "Resource":"*",
      "Condition":{"Null":{"aws:TokenIssueTime":"false"}}
  }
}
```

------

# 다수의 컨텍스트 키 또는 값을 사용하는 조건
<a name="reference_policies_condition-logic-multiple-context-keys-or-values"></a>

정책의 `Condition` 요소를 사용하여 요청에서 다수의 컨텍스트 키, 혹은 단일 컨텍스트 키에 대한 다수의 값을 테스트할 수 있습니다. 프로그래밍 방식이든, AWS Management Console을 사용하든 상관없이 AWS에게 요청할 경우 요청에 보안 주체, 작업, 태그 등에 대한 정보가 포함됩니다. 컨텍스트 키를 사용하여 정책 조건에서 컨텍스트 키가 지정된 요청에서 일치하는 컨텍스트 키의 값을 테스트할 수 있습니다. 요청에 포함되는 정보 및 데이터에 대한 자세한 내용은 [요청 컨텍스트](reference_policies_elements_condition.md#AccessPolicyLanguage_RequestContext) 섹션을 참조하세요.

**Topics**
+ [다수의 컨텍스트 키 또는 값에 대한 평가 로직](#reference_policies_multiple-conditions-eval)
+ [부정 일치 조건 연산자에 대한 평가 로직](#reference_policies_multiple-conditions-negated-matching-eval)

## 다수의 컨텍스트 키 또는 값에 대한 평가 로직
<a name="reference_policies_multiple-conditions-eval"></a>

`Condition` 요소에는 여러 조건 연산자를 추가할 수 있으며, 각 조건 연산자마다 다수의 컨텍스트 키-값 페어가 포함될 수 있습니다. 대부분의 컨텍스트 키에는 별도로 지정되지 않는 한 여러 개의 값을 사용할 수 있습니다.
+ 정책 문에 여러 개의 [조건 연산자](reference_policies_elements_condition_operators.md)가 있는 경우 조건 연산자는 논리 연산자 `AND`를 사용하여 평가됩니다.
+ 정책 문에서 다수의 컨텍스트 키가 단일 조건 연산자에 추가되어 있는 경우 논리 연산자 `AND`를 사용하여 컨텍스트 키가 평가됩니다.
+ 단일 조건 연산자에 하나의 컨텍스트 키에 대한 다수의 값이 포함된 경우 이러한 값은 논리 연산자 `OR`을 사용하여 평가됩니다.
+ 단일 부정 일치 조건 연산자에 하나의 컨텍스트 키에 대한 다수의 값이 포함된 경우 이러한 값은 논리 연산자 `NOR`을 사용하여 평가됩니다.

조건 요소 블록의 모든 컨텍스트 키가 true로 확인되어야 원하는 `Allow` 또는 `Deny` 효과를 간접적으로 호출할 수 있습니다. 다음 그림은 여러 조건 연산자와 컨텍스트 키-값 쌍이 있는 조건에 대한 평가 로직을 보여줍니다.

![\[AND와 OR가 다수의 컨텍스트 키와 값에 적용되는 방식을 나타낸 조건 블록\]](http://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/images/AccessPolicyLanguage_Condition_Block_AND_2.diagram.png)


예를 들어, 다음 S3 버킷 정책은 이전 그림이 정책에 어떻게 표시되는지 보여줍니다. 조건 블록에는 조건 연산자 `StringEquals` 및 `ArnLike`와, 컨텍스트 키 `aws:PrincipalTag` 및 `aws:PrincipalArn`이 포함됩니다. 원하는 `Allow` 또는 `Deny` 효과를 간접적으로 호출하기 위해 조건 블록의 모든 컨텍스트 키가 true로 확인되어야 합니다. 요청하는 사용자는 정책에 지정된 태그 키 값 중 하나를 포함하는 두 개의 보안 주체 태그 키(*department*와 *role*)를 모두 가지고 있어야 합니다. 또한 요청하는 사용자의 보안 주체 ARN이 정책에서 지정된 `aws:PrincipalArn` 값 중 하나와 일치해야 true로 평가됩니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ExamplePolicy",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::222222222222:root"
      },
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/department": [
            "finance",
            "hr",
            "legal"
          ],
          "aws:PrincipalTag/role": [
            "audit",
            "security"
          ]
        },
        "ArnLike": {
          "aws:PrincipalArn": [
            "arn:aws:iam::222222222222:user/Ana",
            "arn:aws:iam::222222222222:user/Mary"
          ]
        }
      }
    }
  ]
}
```

------

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


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/department": [<br />    "finance",<br />    "hr",<br />    "legal"<br />  ],<br />  "aws:PrincipalTag/role": [<br />    "audit",<br />    "security"<br />  ]<br />},<br />"ArnLike": {<br />  "aws:PrincipalArn": [<br />      "arn:aws:iam::222222222222:user/Ana",<br />      "arn:aws:iam::222222222222:user/Mary"<br />  ]<br />}</pre>  | <pre>aws:PrincipalTag/department: legal<br />aws:PrincipalTag/role: audit<br />aws:PrincipalArn: <br />  arn:aws:iam::222222222222:user/Mary</pre>  |  **일치 항목 있음** | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/department": [<br />    "finance",<br />    "hr",<br />    "legal"<br />  ],<br />  "aws:PrincipalTag/role": [<br />    "audit",<br />    "security"<br />  ]<br />},<br />"ArnLike": {<br />  "aws:PrincipalArn": [<br />      "arn:aws:iam::222222222222:user/Ana",<br />      "arn:aws:iam::222222222222:user/Mary"<br />  ]<br />}</pre>  | <pre>aws:PrincipalTag/department: hr<br />aws:PrincipalTag/role: audit<br />aws:PrincipalArn:<br />  arn:aws:iam::222222222222:user/Nikki</pre>  | **일치 항목 없음** | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/department": [<br />    "finance",<br />    "hr",<br />    "legal"<br />  ],<br />  "aws:PrincipalTag/role": [<br />    "audit",<br />    "security"<br />  ]<br />},<br />"ArnLike": {<br />  "aws:PrincipalArn": [<br />      "arn:aws:iam::222222222222:user/Ana",<br />      "arn:aws:iam::222222222222:user/Mary"<br />  ]<br />}</pre>  | <pre>aws:PrincipalTag/department: hr<br />aws:PrincipalTag/role: payroll<br />aws:PrincipalArn:<br />  arn:aws:iam::222222222222:user/Mary</pre>  | **일치 항목 없음** | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/department": [<br />    "finance",<br />    "hr",<br />    "legal"<br />  ],<br />  "aws:PrincipalTag/role": [<br />    "audit",<br />    "security"<br />  ]<br />},<br />"ArnLike": {<br />  "aws:PrincipalArn": [<br />      "arn:aws:iam::222222222222:user/Ana",<br />      "arn:aws:iam::222222222222:user/Mary"<br />  ]<br />}</pre>  |  요청 컨텍스트에 `aws:PrincipalTag/role`가 없습니다. <pre>aws:PrincipalTag/department: hr<br />aws:PrincipalArn:<br />  arn:aws:iam::222222222222:user/Mary</pre>  | **일치 항목 없음**  | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/department": [<br />    "finance",<br />    "hr",<br />    "legal"<br />  ],<br />  "aws:PrincipalTag/role": [<br />    "audit",<br />    "security"<br />  ]<br />},<br />"ArnLike": {<br />  "aws:PrincipalArn": [<br />      "arn:aws:iam::222222222222:user/Ana",<br />      "arn:aws:iam::222222222222:user/Mary"<br />  ]<br />}</pre>  | 요청 컨텍스트에 `aws:PrincipalTag`가 없습니다. <pre>aws:PrincipalArn:<br />  arn:aws:iam::222222222222:user/Mary</pre>  | **일치 항목 없음**  | 

## 부정 일치 조건 연산자에 대한 평가 로직
<a name="reference_policies_multiple-conditions-negated-matching-eval"></a>

`StringNotEquals` 또는 `ArnNotLike`와 같은 일부 [조건 연산자](reference_policies_elements_condition_operators.md)는 부정 일치를 사용하여 정책의 컨텍스트 키-값 쌍과 요청의 컨텍스트 키-값 쌍을 비교합니다. 부정 일치 조건 연산자가 포함된 정책의 단일 컨텍스트 키에 대해 다수의 값이 지정되면 유효한 권한은 논리 연산자 `NOR`와 같이 작동합니다. 부정 일치에서 논리 연산자 `NOR` 또는 `NOT OR`은 모든 값이 false로 평가되는 경우에만 true를 반환합니다.

다음 그림은 여러 조건 연산자와 컨텍스트 키-값 쌍이 있는 조건에 대한 평가 로직을 보여줍니다. 그림에는 컨텍스트 키 3에 대한 부정 일치 조건 연산자가 포함되어 있습니다.

![\[부정 일치 조건 연산자가 사용되는 경우 AND와 OR가 다수의 컨텍스트 키와 값에 적용되는 방식을 나타낸 조건 블록\]](http://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/images/AccessPolicyLanguage_Condition_Block_AND_Negated_NOR_2.diagram.png)


예를 들어, 다음 S3 버킷 정책은 이전 그림이 정책에 어떻게 표시되는지 보여줍니다. 조건 블록에는 조건 연산자 `StringEquals` 및 `ArnNotLike`와, 컨텍스트 키 `aws:PrincipalTag` 및 `aws:PrincipalArn`이 포함됩니다. 원하는 `Allow` 또는 `Deny` 효과를 간접적으로 호출하기 위해 조건 블록의 모든 컨텍스트 키가 true로 확인되어야 합니다. 요청하는 사용자는 정책에 지정된 태그 키 값 중 하나를 포함하는 두 개의 보안 주체 태그 키(*department*와 *role*)를 모두 가지고 있어야 합니다. `ArnNotLike` 조건 연산자가 부정 일치를 사용하므로 요청하는 사용자의 보안 주체 ARN이 정책에서 지정된 `aws:PrincipalArn` 값 중에서 일치하는 게 없어야 true로 평가됩니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ExamplePolicy",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::222222222222:root"
      },
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/department": [
            "finance",
            "hr",
            "legal"
          ],
          "aws:PrincipalTag/role": [
            "audit",
            "security"
          ]
        },
        "ArnNotLike": {
          "aws:PrincipalArn": [
            "arn:aws:iam::222222222222:user/Ana",
            "arn:aws:iam::222222222222:user/Mary"
          ]
        }
      }
    }
  ]
}
```

------

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


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/department": [<br />    "finance",<br />    "hr",<br />    "legal"<br />  ],<br />  "aws:PrincipalTag/role": [<br />    "audit",<br />    "security"<br />  ]<br />},<br />"ArnNotLike": {<br />  "aws:PrincipalArn": [<br />      "arn:aws:iam::222222222222:user/Ana",<br />      "arn:aws:iam::222222222222:user/Mary"<br />  ]<br />}</pre>  | <pre>aws:PrincipalTag/department: legal<br />aws:PrincipalTag/role: audit<br />aws:PrincipalArn:<br />  arn:aws:iam::222222222222:user/Nikki<br /></pre>  |  **일치 항목 있음** | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/department": [<br />    "finance",<br />    "hr",<br />    "legal"<br />  ],<br />  "aws:PrincipalTag/role": [<br />    "audit",<br />    "security"<br />  ]<br />},<br />"ArnNotLike": {<br />  "aws:PrincipalArn": [<br />      "arn:aws:iam::222222222222:user/Ana",<br />      "arn:aws:iam::222222222222:user/Mary"<br />  ]<br />}</pre>  | <pre>aws:PrincipalTag/department: hr<br />aws:PrincipalTag/role: audit<br />aws:PrincipalArn:<br />  arn:aws:iam::222222222222:user/Mary</pre>  | **일치 항목 없음** | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/department": [<br />    "finance",<br />    "hr",<br />    "legal"<br />  ],<br />  "aws:PrincipalTag/role": [<br />    "audit",<br />    "security"<br />  ]<br />},<br />"ArnNotLike": {<br />  "aws:PrincipalArn": [<br />      "arn:aws:iam::222222222222:user/Ana",<br />      "arn:aws:iam::222222222222:user/Mary"<br />  ]<br />}</pre>  | <pre>aws:PrincipalTag/department: hr<br />aws:PrincipalTag/role: payroll<br />aws:PrincipalArn:<br />  arn:aws:iam::222222222222:user/Nikki</pre>  | **일치 항목 없음** | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/department": [<br />    "finance",<br />    "hr",<br />    "legal"<br />  ],<br />  "aws:PrincipalTag/role": [<br />    "audit",<br />    "security"<br />  ]<br />},<br />"ArnNotLike": {<br />  "aws:PrincipalArn": [<br />      "arn:aws:iam::222222222222:user/Ana",<br />      "arn:aws:iam::222222222222:user/Mary"<br />  ]<br />}</pre>  | >요청 컨텍스트에 `aws:PrincipalTag/role`가 없습니다. <pre>aws:PrincipalTag/department: hr<br />aws:PrincipalArn:<br />  arn:aws:iam::222222222222:user/Nikki</pre>  | **일치 항목 없음** | 
|  <pre>"StringEquals": {<br />  "aws:PrincipalTag/department": [<br />    "finance",<br />    "hr",<br />    "legal"<br />  ],<br />  "aws:PrincipalTag/role": [<br />    "audit",<br />    "security"<br />  ]<br />},<br />"ArnNotLike": {<br />  "aws:PrincipalArn": [<br />      "arn:aws:iam::222222222222:user/Ana",<br />      "arn:aws:iam::222222222222:user/Mary"<br />  ]<br />}</pre>  | 요청 컨텍스트에 `aws:PrincipalTag`가 없습니다. <pre>aws:PrincipalArn:<br />  arn:aws:iam::222222222222:user/Nikki</pre>  | **일치 항목 없음**  | 

# 단일 값 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`가 없습니다.  |  **일치 항목 없음**  | 

# 조건 정책 예제
<a name="reference_policies_condition_examples"></a>

IAM 정책에서 요청 컨텍스트와 비교하기 위해 단일 값 및 다중 값 컨텍스트 키 모두에 대해 여러 값을 지정할 수 있습니다. 다음은 다수의 컨텍스트 키와 값을 포함한 정책 조건을 보여주는 일련의 정책 예제입니다.

**참고**  
이 참조 설명에 포함시킬 정책을 제출하고자 하는 경우 이 페이지의 하단에 있는 **의견** 버튼을 사용합니다. IAM 자격 증명 기반 정책의 예는 [IAM 자격 증명 기반 정책의 예](access_policies_examples.md) 섹션을 참조하세요.

## 조건 정책 예: 단일 값 컨텍스트 키
<a name="reference_policies_condition_example_library_single-valued"></a>
+ 단일 값 컨텍스트 키가 있는 다수의 조건 블록. ([이 예제 보기](reference_policies_condition_examples-single-valued-context-keys.md#reference_policies_condition_examples-single-valued-context-keys-1).)
+ 다수의 단일 값 컨텍스트 키와 값이 있는 하나의 조건 블록. ([이 예제 보기](reference_policies_condition_examples-single-valued-context-keys.md#reference_policies_condition_examples-single-valued-context-keys-2).)

## 조건 정책 예: 다중 값 컨텍스트 키
<a name="reference_policies_condition_example_library_multi-valued"></a>
+ 조건 집합 연산자 `ForAllValues`를 포함하는 거부 정책 ([이 예제 보기](reference_policies_condition_examples-multi-valued-context-keys.md#reference_policies_condition_examples-multi-valued-context-keys-1).)
+ 조건 집합 연산자 `ForAnyValue`를 포함하는 거부 정책 ([이 예제 보기](reference_policies_condition_examples-multi-valued-context-keys.md#reference_policies_condition_examples-multi-valued-context-keys-2).)

# 다중 값 컨텍스트 키 예제
<a name="reference_policies_condition_examples-multi-valued-context-keys"></a>

다음은 다중 값 컨텍스트 키로 정책 조건을 만드는 방법을 보여주는 일련의 정책 예제입니다.

## 예: 조건 집합 연산자 ForAllValues를 포함한 거부 정책
<a name="reference_policies_condition_examples-multi-valued-context-keys-1"></a>

다음 예제에서는 ID 기반 정책을 사용하여 요청에 특정 태그 키 접두사가 포함된 경우 IAM 태깅 작업의 사용을 거부하는 방법을 보여줍니다. [`aws:TagKeys`](reference_policies_condition-keys.md#condition-keys-tagkeys) 값에는 부분 문자열 일치를 위한 와일드카드(\$1)가 포함됩니다. 정책에는 컨텍스트 키 `aws:TagKeys`가 포함된 `ForAllValues` 집합 연산자가 포함되는데, 요청 컨텍스트 키에 여러 값이 포함될 수 있기 때문입니다. 컨텍스트 키 `aws:TagKeys`가 일치하려면 요청 컨텍스트의 모든 값이 정책에서 하나 이상의 값과 일치해야 합니다.

요청에 컨텍스트 키가 없는 경우에도 `ForAllValues` 세트 연산자는 true를 반환합니다.

요청의 컨텍스트 키가 존재하고 그 값이 null이 아닌지 확인하기 위해 정책에 값이 `false`인 `Null` 조건 연산자를 포함하면 컨텍스트 키가 누락되거나 값이 비어 있는 컨텍스트 키가 true로 평가되는 것을 방지할 수 있습니다. 자세한 내용은 [조건 키의 존재를 확인하는 조건 연산자](reference_policies_elements_condition_operators.md#Conditions_Null) 섹션을 참조하세요.

**중요**  
이 정책은 어떤 작업도 허용하지 않습니다. 이 정책을 특정 작업을 허용하는 다른 정책과 함께 사용합니다.

**Example 다중 값 컨텍스트 키에 대한 단일 정책 조건 값 거부**  
다음 예제에서 정책은 요청의 `aws:TagKeys` 값에 접두사 **key1**이 포함되지 않은 요청을 거부합니다. 요청 컨텍스트에는 여러 값이 있을 수 있지만 `ForAllValues` 조건 세트 연산자 때문에 요청 컨텍스트의 모든 태그 키 값은 접두사 **key1**로 시작해야 합니다.    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyRestrictedTags",
      "Effect": "Deny",
      "Action": [
        "iam:Tag*",
        "iam:UnTag*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "ForAllValues:StringNotLike": {
          "aws:TagKeys": "key1*"
        }
      }
    }
  ]
}
```
다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다. 거부 문의 경우 일치 항목 있음은 거부되고 일치 항목 없음은 거부되지 않으므로 다른 문에서 허용될 수 있습니다.  


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"ForAllValues:StringNotLike": {<br />  "aws:TagKeys": "key1*"<br />}</pre>  | <pre>aws:TagKeys:<br />  – key1:legal</pre>  |  **일치 항목 없음** 다른 문에서 허용될 수 있습니다. | 
| <pre>"ForAllValues:StringNotLike": {<br />  "aws:TagKeys": "key1*"<br />}</pre>  | <pre>aws:TagKeys:<br />  – key1:hr<br />  – key1:personnel</pre>  | **일치 항목 없음** 다른 문에서 허용될 수 있습니다. | 
| <pre>"ForAllValues:StringNotLike": {<br />  "aws:TagKeys": "key1*"<br />}</pre>  | <pre>aws:TagKeys:<br />  – key2:audit</pre>  | **일치 항목 있음** | 
| <pre>"ForAllValues:StringNotLike": {<br />  "aws:TagKeys": "key1*"<br />}</pre>  | 요청 컨텍스트에 `aws:TagKeys`가 없습니다.  | **일치 항목 있음** | 

**Example 다중 값 컨텍스트 키에 대한 여러 정책 조건 값 거부**  
다음 예제에서 정책은 요청의 `aws:TagKeys` 값에 접두사 **key1** 또는 **key2**가 포함되지 않은 요청을 거부합니다. 요청 컨텍스트에는 여러 값이 있을 수 있지만 `ForAllValues` 조건 세트 연산자 때문에 요청 컨텍스트의 모든 태그 키 값은 접두사 **key1** 또는 **key2**로 시작해야 합니다.    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyRestrictedTags",
      "Effect": "Deny",
      "Action": [
        "iam:Tag*",
        "iam:UnTag*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "ForAllValues:StringNotLike": {
          "aws:TagKeys": [
            "key1*",
            "key2*"
          ]
        }
      }
    }
  ]
}
```
다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다. 거부 문의 경우 일치 항목 있음은 거부되고 일치 항목 없음은 거부되지 않으므로 다른 문에서 허용될 수 있습니다.  


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"ForAllValues:StringNotLike": {<br />  "aws:TagKeys": [<br />    "key1*",<br />    "key2*"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – key1:legal</pre>  |  **일치 항목 없음** 다른 문에서 허용될 수 있습니다. | 
| <pre>"ForAllValues:StringNotLike": {<br />   "aws:TagKeys": [<br />    "key1*",<br />    "key2*"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – key1:hr<br />  – key1:personnel</pre>  | **일치 항목 없음** 다른 문에서 허용될 수 있습니다. | 
| <pre>"ForAllValues:StringNotLike": {<br />   "aws:TagKeys": [<br />    "key1*",<br />    "key2*"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – key1:hr<br />  – key2:audit</pre>  | **일치 항목 없음** 다른 문에서 허용될 수 있습니다. | 
| <pre>"ForAllValues:StringNotLike": {<br />   "aws:TagKeys": [<br />    "key1*",<br />    "key2*"<br />  ]<br />}</pre>  | <pre>aws:TagKeys:<br />  – key3:legal</pre>  | **일치 항목 있음**  | 
| <pre>"ForAllValues:StringNotLike": {<br />   "aws:TagKeys": [<br />    "key1*",<br />    "key2*"<br />  ]<br />}</pre>  | 요청 컨텍스트에 `aws:TagKeys`가 없습니다.  | **일치 항목 있음** | 

## 예: 조건 집합 연산자 ForAnyValue를 포함한 거부 정책
<a name="reference_policies_condition_examples-multi-valued-context-keys-2"></a>

다음 자격 증명 기반 정책 예제는 정책에 지정된 태그 키(`environment` 또는 `webserver`) 중 하나로 태그가 지정된 스냅샷이 있는 경우 EC2 인스턴스 볼륨의 스냅샷 생성을 거부합니다. 정책에는 컨텍스트 키 `aws:TagKeys`가 포함된 `ForAnyValue` 집합 연산자가 포함되는데, 요청 컨텍스트 키에 여러 값이 포함될 수 있기 때문입니다. 정책에 지정된 태그 키 값 중 하나가 태깅 요청에 포함된 경우 `aws:TagKeys` 컨텍스트 키는 true를 반환하여 거부 정책 효과를 간접적으로 호출합니다.

**중요**  
이 정책은 어떤 작업도 허용하지 않습니다. 이 정책을 특정 작업을 허용하는 다른 정책과 함께 사용합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "ec2:CreateSnapshot",
        "ec2:CreateSnapshots"
      ],
      "Resource": "arn:aws:ec2:us-west-2::snapshot/*",
      "Condition": {
        "ForAnyValue:StringEquals": {
          "aws:TagKeys": "webserver"
        }
      }
    }
  ]
}
```

------

다음 표에서는 AWS가 요청에 있는 조건 키 값을 기반으로 이 정책을 평가하는 방법을 보여줍니다. 거부 문의 경우 일치 항목 있음은 거부되고 일치 항목 없음은 거부되지 않으므로 다른 문에서 허용될 수 있습니다.


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": "webserver"<br />}</pre>  | <pre>aws:TagKeys:<br />  – webserver</pre>  | **일치 항목 있음** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": "webserver"<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – webserver<br />  – test</pre>  |  **일치 항목 있음** | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": "webserver"<br />}</pre>  | <pre>aws:TagKeys:<br />  – environment<br />  – test</pre>  | **일치 항목 없음** 다른 문에서 허용될 수 있습니다. | 
|  <pre>"ForAnyValue:StringEquals": {<br />  "aws:TagKeys": "webserver"<br />}</pre>  | 요청 컨텍스트에 `aws:TagKeys`가 없습니다.  | **일치 항목 없음** 다른 문에서 허용될 수 있습니다.  | 

# 단일 값 컨텍스트 키 정책 예제
<a name="reference_policies_condition_examples-single-valued-context-keys"></a>

다음은 단일 값 컨텍스트 키로 정책 조건을 만드는 방법을 보여주는 일련의 정책 예제입니다.

## 예: 단일 값 컨텍스트 키가 있는 다수의 조건 블록
<a name="reference_policies_condition_examples-single-valued-context-keys-1"></a>

조건 블록에 각각 단일 컨텍스트 키가 있는 다수의 조건이 있는 경우 모든 컨텍스트 키가 true로 확인되어야 원하는 `Allow` 또는 `Deny` 효과가 간접적으로 호출됩니다. 부정 일치 조건 연산자를 사용하면 조건 값의 평가 로직이 반전됩니다.

다음 예제에서는 사용자가 EC2 볼륨을 생성하고 볼륨 생성 도중 볼륨에 태그를 적용합니다. 요청 컨텍스트에는 컨텍스트 키 `aws:RequestTag/project`의 값이 포함되어야 하고, 컨텍스트 키 `aws:ResourceTag/environment`의 값은 프로덕션 이외의 모두 가능합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:CreateVolume",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "ec2:CreateTags",
      "Resource": "arn:aws:ec2:us-east-1:123456789012:volume/*",
      "Condition": {
        "StringLike": {
          "aws:RequestTag/project": "*"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "ec2:CreateTags",
      "Resource": "arn:aws:ec2:us-east-1:123456789012:*/*",
      "Condition": {
        "StringNotEquals": {
          "aws:ResourceTag/environment": "production"
        }
      }
    }
  ]
}
```

------

요청 컨텍스트에는 프로젝트 태그-값이 포함되어야 하고 프로덕션 리소스가 `Allow` 효과를 간접적으로 호출하도록 생성할 수 없습니다. 프로젝트 이름이 `Feature3`이고 `QA` 리소스 태그가 있으므로 다음 EC2 볼륨이 생성됩니다.

```
aws ec2 create-volume \
    --availability-zone us-east-1a \
    --volume-type gp2 \
    --size 80 \
    --tag-specifications 'ResourceType=volume,Tags=[{Key=project,Value=Feature3},{Key=environment,Value=QA}]'
```

## 예: 다수의 단일 값 컨텍스트 키와 값이 있는 하나의 조건 블록
<a name="reference_policies_condition_examples-single-valued-context-keys-2"></a>

조건 블록에 다수의 컨텍스트 키가 있고 각 컨텍스트 키에 다수의 값이 있는 경우 각 컨텍스트 키가 true로 확인되어야 원하는 `Allow` 또는 `Deny` 효과에서 하나 이상의 키 값이 간접적으로 호출됩니다. 부정 일치 조건 연산자를 사용하면 컨텍스트 키 값의 평가 로직이 반전됩니다.

다음 예제를 통해 사용자는 Amazon Elastic Container Service 클러스터에서 작업을 시작하고 실행할 수 있습니다.
+ 요청 컨텍스트에는 `aws:RequestTag/environment` 컨텍스트 키 **AND**에 대해 `production` **또는** `prod-backup`가 포함되어야 합니다.
+ `ecs:cluster` 컨텍스트 키를 통해 작업이 `default1` **또는** `default2` ARN ECS 클러스터터에서 실행됩니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecs:RunTask",
        "ecs:StartTask"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/environment": [
            "production",
            "prod-backup"
          ]
        },
        "ArnEquals": {
          "ecs:cluster": [
            "arn:aws:ecs:us-east-1:111122223333:cluster/default1",
            "arn:aws:ecs:us-east-1:111122223333:cluster/default2"
          ]
        }
      }
    }
  ]
}
```

------

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


| 정책 조건 | 요청 컨텍스트 | 결과 | 
| --- | --- | --- | 
|  <pre>"StringEquals": {<br />  "aws:RequestTag/environment": [<br />    "production",<br />    "prod-backup"<br />  ]<br />},<br />"ArnEquals": {<br />  "ecs:cluster": [<br />    "arn:aws:ecs:us-east-1:111122223333:cluster/default1",<br />    "arn:aws:ecs:us-east-1:111122223333:cluster/default2"<br />  ]<br />}</pre>  | <pre>aws:RequestTag: environment:production<br />ecs:cluster:<br />  arn:aws:ecs:us-east-1:111122223333:cluster/default1</pre>  | 일치 항목 있음 | 
| <pre>"StringEquals": {<br />  "aws:RequestTag/environment": [<br />    "production",<br />    "prod-backup"<br />  ]<br />},<br />"ArnEquals": {<br />  "ecs:cluster": [<br />    "arn:aws:ecs:us-east-1:111122223333:cluster/default1",<br />    "arn:aws:ecs:us-east-1:111122223333:cluster/default2"<br />  ]<br />}</pre>  | <pre>aws:RequestTag: environment:prod-backup<br />ecs:cluster:<br />  arn:aws:ecs:us-east-1:111122223333:cluster/default2</pre>  | 일치 항목 있음 | 
| <pre>"StringEquals": {<br />  "aws:RequestTag/environment": [<br />    "production",<br />    "prod-backup"<br />  ]<br />},<br />"ArnEquals": {<br />  "ecs:cluster": [<br />    "arn:aws:ecs:us-east-1:111122223333:cluster/default1",<br />    "arn:aws:ecs:us-east-1:111122223333:cluster/default2"<br />  ]<br />}</pre>  | <pre>aws:RequestTag: webserver:production<br />ecs:cluster:<br />  arn:aws:ecs:us-east-1:111122223333:cluster/default2</pre>  | 일치 항목 없음 | 
| <pre>"StringEquals": {<br />  "aws:RequestTag/environment": [<br />    "production",<br />    "prod-backup"<br />  ]<br />},<br />"ArnEquals": {<br />  "ecs:cluster": [<br />    "arn:aws:ecs:us-east-1:111122223333:cluster/default1",<br />    "arn:aws:ecs:us-east-1:111122223333:cluster/default2"<br />  ]<br />}</pre>  |  요청 컨텍스트에 `aws:RequestTag`가 없습니다. <pre>ecs:cluster<br />  arn:aws:ecs:us-east-1:111122223333:cluster/default2</pre>  | 일치 항목 없음 | 

# IAM 정책 요소: 변수 및 태그
<a name="reference_policies_variables"></a>

정책 작성 시 리소스나 조건 키의 정확한 값을 모를 경우 AWS Identity and Access Management(IAM) 정책 변수를 자리 표시자로 사용하세요.

**참고**  
AWS에서 변수를 확인할 수 없는 경우 전체 문이 잘못되는 문제가 발생할 수 있습니다. 예를 들어 `aws:TokenIssueTime` 번수를 사용하는 경우 변수는 요청자가 임시 자격 증명을 사용하여 인증된 경우(IAM 역할)에만 값을 확인합니다. 잘못된 문을 유발하는 변수를 방지하려면 [...IfExists 조건 연산자](reference_policies_elements_condition_operators.md#Conditions_IfExists)를 사용하세요.

**Topics**
+ [소개](#policy-vars-intro)
+ [정책에 변수 사용](#policy-vars-using-variables)
+ [정책 변수로서의 태그](#policy-vars-tags)
+ [정책 변수를 사용할 수 있는 경우](#policy-vars-wheretouse)
+ [값이 없는 정책 변수](#policy-vars-no-value)
+ [정책 변수로 사용할 수 있는 요청 정보](#policy-vars-infotouse)
+ [기본값 지정하기](#policy-vars-default-values)
+ [자세한 정보](#policy-vars-formoreinfo)

## 소개
<a name="policy-vars-intro"></a>

IAM 정책에서는 다양한 작업을 통해 액세스를 제어하려는 특정 리소스에 이름을 지정할 수 있습니다. 예를 들어, 다음 정책은 사용자가 `marketing` 프로젝트를 위해 S3 버킷 `amzn-s3-demo-bucket`의 객체를 나열하고, 읽고, 쓸 수 있도록 허용합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],      
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket"],
      "Condition": {"StringLike": {"s3:prefix": ["marketing/*"]}}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],      
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket/marketing/*"]
    }
  ]
}
```

------

정책을 작성하다 보면 정확한 리소스 이름을 모를 때도 있습니다. 사용자마다 고유한 정책 사본을 만들 필요 없이 여러 사용자에게 작용하도록 정책을 일반화해야 할 수 있습니다. 각 사용자별로 별도의 정책을 생성하는 대신, 해당 그룹의 모든 사용자에게 적용되는 단일 그룹 정책을 생성하는 것이 좋습니다.

## 정책에 변수 사용
<a name="policy-vars-using-variables"></a>

정책에서 자리 표시자를 설정하는 *정책 변수*를 사용하여 정책 내에서 동적 값을 정의할 수 있습니다.

변수는 요청에 있는 값의 변수 이름을 감싸는 중괄호 한 쌍(**`{ }`**)을 사용하여 **`$`** 접두사 뒤에 표시됩니다.

정책을 평가할 때는 이 정책 변수가 요청에서 전달되는 조건 컨텍스트 키에서 온 값으로 바뀝니다. 변수는 [아이덴티티 기반 정책, 리소스 정책, 서비스 제어 정책, 세션 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) 및 [VPC 엔드포인트 정책](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)에 사용할 수 있습니다. 권한 경계로 사용되는 아이덴티티 기반 정책은 정책 변수도 지원합니다.

글로벌 조건 컨텍스트 키는 AWS 서비스 전반의 요청에서 변수로 사용할 수 있습니다. 서비스별 조건 키는 AWS 리소스와 상호 작용할 때 변수로도 사용할 수 있지만, 이러한 조건 키를 지원하는 리소스에 대한 요청을 할 때만 사용할 수 있습니다. 각 AWS 서비스 및 리소스에 사용할 수 있는 컨텍스트 키 목록은 [https://docs.aws.amazon.com/service-authorization/latest/reference/reference.html](https://docs.aws.amazon.com/service-authorization/latest/reference/reference.html)를 참조하세요. 특정 상황에서는 글로벌 조건 컨텍스트 키에 값을 채울 수 없습니다. 각 키에 대한 자세한 내용은 [AWS 글로벌 조건 컨텍스트 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 참조하세요.

**중요**  
키 이름은 대/소문자를 구분하지 않습니다. 예를 들어, `aws:CurrentTime`은 `AWS:currenttime`과 같습니다.
단일 값 조건 키를 변수로 사용할 수 있습니다. 다중 값 조건 키는 변수로 사용할 수 없습니다.

다음 예에서는 특정 리소스 이름을 정책 변수로 대체하는 IAM 역할 또는 사용자에 대한 정책을 보여줍니다. `aws:PrincipalTag` 조건 키를 활용하여 이 정책을 재사용할 수 있습니다. 이 정책을 평가할 때 `${aws:PrincipalTag/team}`은 버킷 이름이 `team` 보안 주체 태그의 팀 이름으로 끝나는 경우에만 작업을 허용합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],      
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket"],
      "Condition": {"StringLike": {"s3:prefix": ["${aws:PrincipalTag/team}/*"]}}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],      
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket/${aws:PrincipalTag/team}/*"]
    }
  ]
}
```

------

변수는 `$` 접두사 뒤에 중괄호(`{ }`)를 사용하여 표시합니다. `${ }` 문자 안에는 정책에서 사용할 요청 값의 이름을 추가할 수 있습니다. 사용할 수 있는 값은 이 페이지 후반에서 다루겠습니다.

이 글로벌 조건 키에 대한 자세한 내용은 글로벌 조건 키 목록의 [aws:PrincipalTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-principaltag) 섹션을 참조하세요.

**참고**  
정책 변수를 사용하려면 `Version` 요소를 문에 추가해야 하며, 이때 버전은 정책 변수를 지원하는 버전으로 설정해야 합니다. 변수는 버전 `2012-10-17`에서 도입되었습니다. 정책 언어의 조기 버전은 정책 변수를 지원하지 않기 때문입니다. `Version` 요소를 추가하지 않고 해당 버전 날짜로 설정하면 `${aws:username}` 같은 변수가 정책에서 리터럴 문자열로 처리됩니다.  
`Version` 정책 요소는 정책 버전과 다릅니다. `Version` 정책 요소는 정책 내에서 사용되며 정책 언어의 버전을 정의합니다. 반면에 정책 버전은 IAM에서 고객 관리형 정책을 변경할 때 생성됩니다. 변경된 정책은 기존 정책을 덮어쓰지 않습니다. 대신 IAM에서 관리형 정책의 새 버전을 생성합니다. `Version` 정책 요소에 대한 자세한 정보는 [IAM JSON 정책 요소: Version](reference_policies_elements_version.md)을 참조하세요. 정책 버전에 대한 자세한 정보는 [IAM 정책 버전 관리](access_policies_managed-versioning.md) 섹션을 참조하세요.

보안 주체가 S3 버킷의 /David 경로에서 객체를 가져오도록 허용하는 정책은 다음과 같습니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/David/*"
      ]
    }
  ]
}
```

------

이 정책이 사용자 `David`에게 연결된 경우 해당 사용자는 자신의 S3 버킷에서 객체를 가져오지만 각 사용자에 대해 사용자 이름을 포함하는 별도의 정책을 생성해야 합니다. 그런 다음 각 정책을 개별 사용자에 연결합니다.

정책 변수를 사용하여 재사용할 수 있는 정책을 생성할 수 있습니다. 다음 정책은 `aws:PrincipalTag`의 tag-key 값이 요청에서 전달된 tag-key `owner` 값과 일치하는 경우 사용자가 Amazon S3 버킷에서 객체를 가져올 수 있도록 허용합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [{
    "Sid": "AllowUnlessOwnedBySomeoneElse",
    "Effect": "Allow",
    "Action": ["s3:GetObject"],    
    "Resource": ["*"],
    "Condition": {
        "StringEquals": {
          "s3:ExistingObjectTag/owner": "${aws:PrincipalTag/owner}"
        }
      }
    }
  ]
}
```

------

이와 같이 사용자 대신 정책 변수를 사용하는 경우 개별 사용자마다 별도의 정책이 있을 필요가 없습니다. 다음 예시에서는 임시 보안 자격 증명을 사용하여 제품 관리자가 수임하는 IAM 역할에 정책이 연결됩니다. 사용자가 Amazon S3 객체 추가를 요청하면 IAM은 현재 요청의 `dept` 태그 값을 `${aws:PrincipalTag}` 변수로 대체하고 정책을 평가합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowOnlyDeptS3Prefix",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/${aws:PrincipalTag/dept}/*"
            ]
        }
    ]
}
```

------

## 정책 변수로서의 태그
<a name="policy-vars-tags"></a>

일부 AWS 서비스에서는 사용자 지정 속성을 해당 서비스가 생성한 리소스에 연결할 수 있습니다. 예를 들어 Amazon S3 버킷 또는 IAM 사용자에 태그를 적용할 수 있습니다. 태그는 키 값 페어입니다. 태그 키 이름을 정의하고, 해당 키 이름에 연결된 값을 정의합니다. 예를 들어 **department** 키와 **Human Resources** 값으로 태그를 만들 수 있습니다. IAM 엔터티 태그 지정에 대한 자세한 내용은 [AWS Identity and Access Management 리소스용 태그](id_tags.md) 섹션을 참조하세요. 다른 AWS 서비스에서 생성한 리소스에 대한 태그 지정 정보는 해당 서비스의 문서 섹션을 참조하세요. Tag Editor에 대한 자세한 내용은 *AWS Management Console 사용 설명서*의 [Tag Editor 작업](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/tag-editor.html) 섹션을 참조하세요.

IAM 리소스에 태그를 추가하면 IAM 리소스를 쉽게 찾고, 구성하고, 추적할 수 있습니다. 또한 IAM 자격 증명에 태그를 지정하여 리소스에 대한 액세스를 제어하거나 자체 태그를 지정할 수 있습니다. 태그를 사용하여 액세스를 제어하는 방법에 대한 자세한 내용은 [태그를 사용하여 IAM 사용자 및 역할에 대한 액세스 제어](access_iam-tags.md) 섹션을 참조하세요.

## 정책 변수를 사용할 수 있는 경우
<a name="policy-vars-wheretouse"></a>

 정책 변수는 `Resource` 요소를 비롯해 `Condition` 요소의 문자열 비교에 사용할 수 있습니다.

### 리소스 요소
<a name="policy-vars-resourceelement"></a>

`Resource` 요소에서 정책 변수를 사용할 수 있지만, ARN의 리소스 부분에서만 사용할 수 있습니다. ARN의 이 부분은 5번째 콜론(:) 뒤에 나타납니다. 변수를 사용하여 서비스나 계정과 같이 5번째 콜론 앞의 ARN 부분을 바꿀 수 없습니다. ARN 형식에 대한 자세한 내용은 [IAM ARN](reference_identifiers.md#identifiers-arns) 섹션을 참조하세요.

ARN의 일부를 태그 값으로 바꾸려면 접두사와 키 이름을 `${ }`로 묶습니다. 예를 들어 다음 Resource 요소는 요청한 사용자의 department 태그 값과 동일한 이름의 버킷만 참조합니다.

`"Resource": ["arn:aws::s3:::amzn-s3-demo-bucket/${aws:PrincipalTag/department}"]`

많은 AWS 리소스에서 사용자가 생성한 이름이 포함된 ARN을 사용합니다. 다음 IAM 정책은 access-project, access-application 및 access-environment 태그 값이 일치하는 의도된 사용자만 리소스를 수정할 수 있도록 합니다. 또한 [\$1 와일드카드 일치](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html)로 사용자 지정 리소스 이름 접미사를 허용할 수 있습니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowAccessBasedOnArnMatching",
      "Effect": "Allow",
      "Action": [
        "sns:CreateTopic",
        "sns:DeleteTopic"],      
      "Resource": ["arn:aws:sns:*:*:${aws:PrincipalTag/access-project}-${aws:PrincipalTag/access-application}-${aws:PrincipalTag/access-environment}-*"
      ]
    }
  ]
}
```

------

### 조건 요소
<a name="policy-vars-conditionelement"></a>

문자열 연산자 또는 ARN 연산자와 관련된 모든 조건의 `Condition` 값에 정책 변수를 사용할 수 있습니다. 문자열 연산자는 `StringEquals`, `StringLike` 및 `StringNotLike`를 포함합니다. ARN 연산자에는 `ArnEquals` 및 `ArnLike`가 포함됩니다. `Numeric`, `Date`, `Boolean`, `Binary`, `IP Address` 또는 `Null` 연산자와 같은 다른 연산자와 함께 정책 변수를 사용할 수 없습니다. 조건 연산자에 대한 자세한 내용은 [IAM JSON 정책 요소: 조건 연산자](reference_policies_elements_condition_operators.md) 섹션을 참조하세요.

`Condition` 요소 표현식에서 태그를 참조할 때는 관련 접두사와 키 이름을 조건 키로 사용하세요. 그런 다음 조건 값에서 테스트할 값을 사용합니다.

예를 들어, 다음 정책 예에서는 `costCenter` 태그가 리소스에 연결된 경우에만 사용자에 대한 모든 액세스를 허용합니다. 태그의 값은 `12345` 또는 `67890`이어야 합니다. 태그에 값이 없거나 다른 값이 있으면 요청이 실패합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
          "iam:*user*"
       ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "iam:ResourceTag/costCenter": [ "12345", "67890" ]
        }
      }
    }
  ]
}
```

------

## 값이 없는 정책 변수
<a name="policy-vars-no-value"></a>

값이 없거나 요청의 승인 컨텍스트에 없는 조건 컨텍스트 키를 정책 변수에서 참조하는 경우, 해당 값은 사실상 null입니다. 같거나 비슷한 값이 없습니다. 다음과 같은 경우 승인 컨텍스트에 조건 컨텍스트 키가 없을 수 있습니다.
+ 해당 조건 키를 지원하지 않는 리소스에 대한 요청에서 서비스별 조건 컨텍스트 키를 사용하는 경우
+ IAM 보안 주체, 세션, 리소스 또는 요청의 태그가 없는 경우
+ [AWS 글로벌 조건 컨텍스트 키](reference_policies_condition-keys.md)에 각 글로벌 조건 컨텍스트 키별로 나열된 기타 상황

IAM 정책의 조건 요소에 값이 없는 변수를 사용하는 경우, `StringEquals` 또는 `StringLike`와 같은 [IAM JSON 정책 요소: 조건 연산자](reference_policies_elements_condition_operators.md)이(가) 일치하지 않고 정책 문이 적용되지 않습니다.

`StringNotEquals` 또는 `StringNotLike`와 같은 역 조건 연산자는 테스트 대상 조건 키의 값이 사실상 null 값과 같거나 비슷하지 않기 때문에 null 값에 대해 일치하지 않습니다.

다음 예에서는 액세스를 허용하려면 `aws:principaltag/Team`이 `s3:ExistingObjectTag/Team`과 같아야 합니다. `aws:principaltag/Team`이 설정되지 않은 경우 액세스가 명시적으로 거부됩니다. 승인 컨텍스트에 값이 없는 변수를 정책의 `Resource` 또는 `NotResource` 요소의 일부로 사용하는 경우, 값이 없는 정책 변수를 포함하는 리소스는 어떤 리소스와도 일치하지 않습니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
   {
    "Effect": "Deny", 
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
    "Condition": {
      "StringNotEquals": {
        "s3:ExistingObjectTag/Team": "${aws:PrincipalTag/Team}"
       }
      }
    }
  ]
}
```

------

## 정책 변수로 사용할 수 있는 요청 정보
<a name="policy-vars-infotouse"></a>

 JSON 정책의 `Condition` 요소를 사용하여 [요청 컨텍스트](reference_policies_evaluation-logic_policy-eval-reqcontext.md)의 키를 정책에서 지정한 키 값과 비교할 수 있습니다. 정책 변수를 사용하는 경우 AWS은 정책의 변수 대신 요청 컨텍스트 키의 값을 대체합니다.

### 보안 주체 키 값
<a name="principaltable"></a>

`aws:username`, `aws:userid` 및 `aws:PrincipalType` 값은 요청을 시작한 보안 주체 유형에 따라 다릅니다. 예를 들어 요청은 IAM 사용자, IAM 역할 또는 AWS 계정 루트 사용자의 자격 증명을 사용하여 가능합니다. 다음은 다른 유형의 보안 주체에 사용되는 키 값을 나타낸 표 입니다.


****  

| 위탁자 | `aws:username` | `aws:userid` | `aws:PrincipalType` | 
| --- | --- | --- | --- | 
| AWS 계정 루트 사용자 | (없음) | AWS 계정 ID | Account | 
| IAM 사용자 | IAM-user-name | [고유 ID](reference_identifiers.md#identifiers-unique-ids) | User | 
| AWS STS 페더레이션 사용자 보안 주체 | (없음) | account:caller-specified-name | FederatedUser | 
| OIDC 페더레이션 보안 주체 웹 아이덴티티 페더레이션을 사용할 때 사용 가능한 정책 키에 대한 자세한 내용은 [AWS OIDC 페더레이션에서 사용 가능한 키](reference_policies_iam-condition-keys.md#condition-keys-wif) 단원을 참조하십시오. | (없음) |   *role-id*:*caller-specified-role-name*  여기서 `role-id`는 [역할의 고유 id](reference_identifiers.md#identifiers-unique-ids)이고 caller-specified-role-name은 AssumeRoleWithWebIdentity 요청에 전달된 [RoleSessionName 파라미터](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AssumeRole.html#API_AssumeRoleWithWebIdentity_RequestParameters)에 의해 지정됩니다.  | AssumedRole | 
| SAML 페더레이션 보안 주체 SAML 연동을 사용할 때 사용 가능한 정책 키에 대한 자세한 내용은 [SAML 기반 페더레이션에서 사용자를 고유하게 식별](id_roles_providers_saml.md#CreatingSAML-userid) 섹션을 참조하세요. | (없음) |  *role-id*:*caller-specified-role-name* 여기서 `role-id`는 [역할의 고유 ID](reference_identifiers.md#identifiers-unique-ids)이고 caller-specified-role-name은 [이름 속성](id_roles_providers_create_saml_assertions.md)이 https://aws.amazon.com/SAML/attributes/RoleSessionName으로 설정된 속성 요소에 의해 지정됩니다.  | AssumedRole | 
| 위임된 역할 | (없음) |  *role-id*:*caller-specified-role-name* 여기서 `role-id`는 [역할의 고유 id](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids)이고 caller-specified-role-name은 AssumeRole 요청에 전달된 [RoleSessionName 파라미터](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html#API_AssumeRole_RequestParameters)에 의해 지정됩니다.  | AssumedRole | 
| Amazon EC2 인스턴스에 할당된 역할 | (없음) |  *role-id*:*ec2-instance-id* 여기서 `role-id`는 [역할의 고유 id](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids)이고 ec2-instance-id는 [EC2 인스턴스의 고유 식별자](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html)입니다.  | AssumedRole | 
| 익명 호출자(Amazon SQS, Amazon SNS 및 Amazon S3만 해당) | (없음) | anonymous | Anonymous | 

이 테이블, 에 있는 항목의 경우 다음을 참고하세요.
+ *없음*이란 현재 요청 정보에 값이 없다는 의미이며, 이때 일치시키려고 하면 실패하고 문이 잘못됩니다.
+ *role-id*는 각 역할 생성 시 할당되는 고유 식별자입니다. AWS CLI 명령 `aws iam get-role --role-name rolename`으로 역할 ID를 표시할 수 있습니다.
+ *caller-specified-name* 및 *caller-specified-role-name*은 임시 자격 증명을 가져오기 위해 호출할 때 호출 프로세스(예: 애플리케이션 또는 서비스 등)에서 전달되는 이름입니다.
+ *ec2-instance-id*는 실행 시 인스턴스에 할당되는 값으로서 Amazon EC2 콘솔의 **인스턴스** 페이지에 표시됩니다. 또한 AWS CLI 명령 `aws ec2 describe-instances`를 실행하여 인스턴스 ID를 표시할 수도 있습니다.

### 페더레이션 보안 주체 요청에 사용할 수 있는 정보
<a name="policy-vars-infoWIF"></a>

페더레이션 보안 주체란 IAM 외에 다른 시스템을 사용하여 인증된 사용자를 말합니다. 예를 들어 AWS 호출 시 자체적으로 애플리케이션을 사용하는 회사가 있다고 가정하겠습니다. 이때는 회사의 애플리케이션 사용자 모두에게 IAM 자격 증명을 제공하는 것이 현실적으로 어렵습니다. 대신에 단일 IAM 자격 증명을 갖춘 프록시(미들 티어) 애플리케이션을 사용하거나, SAML 자격 증명 공급자(IdP)를 사용할 수 있습니다. 프록시 애플리케이션이나 SAML IdP는 회사 네트워크를 사용해 각 사용자를 인증합니다. 그런 다음 프록시 애플리케이션이 IAM 자격 증명을 사용하여 개별 사용자에 대한 임시 보안 자격 증명을 얻을 수 있습니다. SAML IdP는 AWS 임시 보안 자격 증명에 대한 ID 정보를 사실상 교환할 수 있습니다. 이후 임시 자격 증명을 사용하면 AWS 리소스에 액세스할 수 있습니다.

이와 유사한 방식으로 앱을 통해 AWS 리소스에 액세스해야 하는 모바일 디바이스용 앱을 개발하는 것도 가능합니다. 이 경우 앱이 Login with Amazon, Amazon Cognito, Facebook 또는 Google과 같은 잘 알려진 ID 공급자를 사용하여 사용자를 인증하는 *OIDC 페더레이션*을 사용할 수 있습니다. 인증이 완료되면 앱이 공급자의 사용자 인증 정보를 사용하여 임시 보안 자격 증명을 가져온 후 AWS 리소스에 액세스합니다.

OIDC 페더레이션을 위해 가장 바람직한 방법은 Amazon Cognito와 AWS 모바일 SDK를 이용하는 것입니다. 자세한 내용은 다음을 참조하세요.
+ [Amazon Cognito 사용 설명서](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html) 
+ [임시 자격 증명과 관련된 일반적인 시나리오](id_credentials_temp.md#sts-introduction)

### 특수 문자
<a name="policy-vars-specialchars"></a>

정책 변수 중에는 다른 특별한 의미를 갖는 문자를 나타낼 수 있도록 사전에 정의되어 있는 고정 값의 변수들도 몇 가지 있습니다. 이 특수 문자들은 일치시키려는 문자열의 일부이지만 리터럴로 삽입하였다면 오해할 가능성이 있습니다. 예를 들어 문자열에 별표(\$1)를 삽입하면 리터럴(\$1)이 아닌 모든 문자와 일치하는 와일드카드로 해석될 수 있습니다. 이 경우에는 다음과 같이 사전에 정의된 정책 변수를 사용할 수 있습니다.
+ **\$1\$1\$1\$1** - \$1(별표)가 필요한 경우에 사용합니다.
+ **\$1\$1?\$1** - ?(물음표)가 필요한 경우에 사용합니다.
+ **\$1\$1\$1\$1** - \$1(달러 기호)가 필요한 경우에 사용합니다.

위처럼 사전 정의된 정책 변수들은 정규 정책 변수를 사용할 수 있는 문자열이라면 어디든지 사용 가능합니다.

## 기본값 지정하기
<a name="policy-vars-default-values"></a>

변수에 기본값을 추가하려면 기본값을 작은따옴표(`' '`)를 사용하고 변수 텍스트와 기본값을 쉼표와 공백(`, `)으로 묶습니다.

예를 들어, 보안 주체가 `team=yellow`(으)로 태그가 지정된 경우, `ExampleCorp's`(이)라는 이름의 `amzn-s3-demo-bucket-yellow` Amazon S3 버킷에 액세스할 수 있습니다. 이 리소스를 사용하는 정책을 사용하면 팀 구성원이 팀 버킷에 액세스할 수 있지만 다른 팀의 버킷에는 액세스할 수 없습니다. 팀 태그가 없는 사용자의 경우 버킷 이름의 기본값은 `company-wide`입니다. 이러한 사용자는 팀 참여에 대한 지침과 같은 광범위한 정보를 볼 수 있는 `amzn-s3-demo-bucket-company-wide` 버킷에만 액세스할 수 있습니다.

```
"Resource":"arn:aws:s3:::amzn-s3-demo-bucket-${aws:PrincipalTag/team, 'company-wide'}"
```

## 자세한 정보
<a name="policy-vars-formoreinfo"></a>

정책에 대한 자세한 정보는 다음 섹션을 참조하세요.
+  [AWS Identity and Access Management의 정책 및 권한](access_policies.md) 
+  [IAM 자격 증명 기반 정책의 예](access_policies_examples.md) 
+  [IAM JSON 정책 요소 참조](reference_policies_elements.md) 
+  [정책 평가 로직](reference_policies_evaluation-logic.md) 
+  [OIDC 페더레이션](id_roles_providers_oidc.md)

# IAM JSON 정책 요소: 지원되는 데이터 형식
<a name="reference_policies_elements_datatypes"></a>

이 단원에서는 JSON 정책에서 값을 지정할 때 지원되는 데이터 형식을 설명합니다. 정책 언어는 각 정책 요소마다 모든 형식을 지원하지 않기 때문에 각 요소에 대한 자세한 내용은 이전 섹션을 참조하세요.
+ 문자열
+ 숫자(정수 및 부동 소수점)
+ 부울
+ Null
+ Lists
+ Maps
+ 구조(중첩 맵)

다음은 각 데이터 형식을 직렬화로 매핑한 표입니다. 모든 정책은 UTF-8 형식을 따라야 합니다. JSON 데이터 형식에 대한 자세한 내용은 [RFC 4627](https://datatracker.ietf.org/doc/html/rfc4627)에서 확인할 수 있습니다.


****  

| Type | JSON | 
| --- | --- | 
|  문자열  |  문자열  | 
|  Integer  |  숫자  | 
|  Float  |  숫자  | 
|  부울  |  true false  | 
|  Null  |  null  | 
|  날짜  |  [ISO 8601의 W3C 프로파일](http://www.w3.org/TR/NOTE-datetime)을 준수하는 문자열  | 
|  IpAddress  |  [RFC 4632](https://datatracker.ietf.org/doc/html/rfc4632)를 준수하는 문자열  | 
|  List  |  배열  | 
|  객체  |  객체  | 