

# IAM JSON 정책 언어의 문법
<a name="reference_policies_grammar"></a>

이 페이지에서는 IAM에서 JSON 정책 생성 시 사용되는 언어의 정규 문법에 대해 살펴보겠습니다. 이 문법에 대해 살펴본 후 정책의 체계적 작성 및 검증 방법에 대해 이해할 수 있게 될 것입니다.

정책 예는 다음 주제를 참조하세요.
+ [AWS Identity and Access Management의 정책 및 권한](access_policies.md)
+ [IAM 자격 증명 기반 정책의 예](access_policies_examples.md)
+ *Amazon EC2 사용 설명서*의 [Amazon EC2 콘솔 작업을 위한 예제 정책](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-ec2-console.html) 및 [AWS CLI, Amazon EC2 CLI 또는 AWS SDK 작업을 위한 예제 정책](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ExamplePolicies_EC2.html) 
+  *Amazon Simple Storage Service 사용 설명서*의 [버킷 정책의 예제](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html) 및 [사용자 정책 예](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-policies-s3.html) 

다른 AWS 서비스의 정책 예는 해당 서비스 설명서를 참조하세요.

**Topics**
+ [정책 언어 및 JSON](#policies-grammar-json)
+ [JSON 문법에 사용되는 규칙](#policies-grammar-conventions)
+ [문법](#policies-grammar-bnf)
+ [정책 문법 참고 사항](#policies-grammar-notes)

## 정책 언어 및 JSON
<a name="policies-grammar-json"></a>

정책은 JSON으로 작성됩니다. 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)을 참조하세요.

여기에서는 유효한 JSON 구성에 대해 자세히 설명하지는 않지만 다음과 같이 몇 가지 기본 JSON 규칙을 소개합니다.
+ 각 개체 간에 공백을 넣을 수 있습니다.
+ 값은 인용 부호로 묶입니다. 숫자나 부울(Boolean) 값에서 인용 부호는 옵션입니다.
+ 대부분 요소(예: `action_string_list`, `resource_string_list`)는 JSON 배열을 값으로 사용할 수 있습니다. 배열은 하나 이상의 값을 갖습니다. 값이 2개 이상 추가되면 배열은 다음 예제와 같이 대괄호(`[` 및 `]`)로 묶여 쉼표로 구분됩니다.

  `"Action" : ["ec2:Describe*","ec2:List*"]`
+ 기본 JSON 데이터 형식(부울, 숫자, 문자열)은 [RFC 7159](https://datatracker.ietf.org/doc/html/rfc7159)에 정의되어 있습니다.

## JSON 문법에 사용되는 규칙
<a name="policies-grammar-conventions"></a>

JSON 문법에는 다음과 같은 규칙이 사용됩니다.
+ 다음 문자는 JSON 토큰으로서 정책에 *추가됩니다*.

  `{ } [ ] " , :`
+ 다음은 문법에 사용되는 특수 문자로서 정책에는 *추가되지 않습니다*.

  `= < > ( ) |`
+ 한 요소에 여러 값을 추가할 수 있는 경우에는 반복되는 값, 쉼표 구분자, 그리고 줄임표(`...`)를 사용하여 나타냅니다. 예시:

  `[<action_string>, <action_string>, ...]`

  `<principal_map> = { <principal_map_entry>, <principal_map_entry>, ... }`

  여러 값이 허용되면 단일 값을 추가하는 것도 유효합니다. 값이 단 하나인 경우에는 마지막 쉼표를 반드시 생략해야 합니다. 요소가 배열([ ]로 표시)로 이루어지더라도 추가된 값이 단 하나일 때는 괄호가 선택 사항입니다. 예시:

  `"Action": [<action_string>]`

  `"Action": <action_string>`
+ 요소 뒤에 나오는 물음표(`?`)는 요소가 선택 사항인 것을 나타냅니다. 예제: 

  <`version_block?>`

  하지만 선택 요소에 대한 자세한 내용은 문법 목록 이후에 나오는 참고 사항을 반드시 확인하시기 바랍니다.
+ 요소 사이의 수직선(`|`)은 다자간 택일을 나타냅니다. 이 문법에서는 괄호로 다자간 택일의 범위를 정의합니다. 예제:

  `("Principal" | "NotPrincipal")` 
+ 리터럴 문자열 요소는 큰따옴표(`"`)로 묶습니다. 예제:

  `<version_block> = "Version" : ("2008-10-17" | "2012-10-17" )`

기타 참고 사항은 문법 목록 다음 [정책 문법 참고 사항](#policies-grammar-notes) 섹션을 참조하세요.

## 문법
<a name="policies-grammar-bnf"></a>

다음 목록은 정책 언어 문법에 대한 설명입니다. 문법 목록에 사용된 규칙에 대해서는 앞의 섹션을 참조하세요. 그리고, 추가 정보는 이후 참고 사항을 참조하세요.

**참고**  
이 문법은 버전이 `2008-10-17 ` 및 `2012-10-17 `이라고 표시된 정책에 대한 설명입니다. `Version` 정책 요소는 정책 버전과 다릅니다. `Version` 정책 요소는 정책 내에서 사용되며 정책 언어의 버전을 정의합니다. 반면에 정책 버전은 IAM에서 고객 관리형 정책을 변경할 때 생성됩니다. 변경된 정책은 기존 정책을 덮어쓰지 않습니다. 대신 IAM에서 관리형 정책의 새 버전을 생성합니다. `Version` 정책 요소에 대한 자세한 정보는 [IAM JSON 정책 요소: Version](reference_policies_elements_version.md)을 참조하세요. 정책 버전에 대한 자세한 정보는 [IAM 정책 버전 관리](access_policies_managed-versioning.md) 섹션을 참조하세요.

```
policy  = {
     <version_block?>,
     <id_block?>,
     <statement_block>
}

<version_block> = "Version" : ("2008-10-17"		 	 	  | "2012-10-17"		 	 	 )

<id_block> = "Id" : <policy_id_string>

<statement_block> = "Statement" : [ <statement>, <statement>, ... ]

<statement> = { 
    <sid_block?>,
    <principal_block?>,
    <effect_block>,
    <action_block>,
    <resource_block>,
    <condition_block?>
}

<sid_block> = "Sid" : <sid_string>

<effect_block> = "Effect" : ("Allow" | "Deny")  

<principal_block> = ("Principal" | "NotPrincipal") : ("*" | <principal_map>)

<principal_map> = { <principal_map_entry>, <principal_map_entry>, ... }

<principal_map_entry> = ("AWS" | "Federated" | "Service" | "CanonicalUser") :   
    [<principal_id_string>, <principal_id_string>, ...]

<action_block> = ("Action" | "NotAction") : 
    ("*" | <action_string> | [<action_string>, <action_string>, ...])

<resource_block> = ("Resource" | "NotResource") : 
    : ("*" | <resource_string> | [<resource_string>, <resource_string>, ...])

<condition_block> = "Condition" : { <condition_map> }
<condition_map> = { 
  <condition_type_string> : { <condition_key_string> : <condition_value_list> },
  <condition_type_string> : { <condition_key_string> : <condition_value_list> }, ...
}  
<condition_value_list> = [<condition_value>, <condition_value>, ...]
<condition_value> = (<condition_value_string> | <condition_value_string> | <condition_value_string>)
```

## 정책 문법 참고 사항
<a name="policies-grammar-notes"></a>
+ 단일 정책에는 다수의 문이 배열로 추가될 수 있습니다.
+ 정책은 추가되는 개체에 따라 2,048\~10,240 사이에서 최대 문자 수를 갖습니다. 자세한 내용은 [IAM 및 AWS STS 할당량](reference_iam-quotas.md) 섹션을 참조하세요. 정책 크기 계산에 공백 문자는 포함되지 않습니다.
+ 개별 요소에는 동일한 키 인스턴스를 여러 개 추가할 수 없습니다. 예를 들어 동일한 문에 `Effect` 블록을 2개 추가할 수는 없습니다.
+ 블록은 순서에 상관없이 표시됩니다. 예를 들어 정책에서 `version_block`은 `id_block` 뒤에 올 수 있습니다. 마찬가지로 `effect_block`, `principal_block` 및 `action_block` 역시 동일 문에서 순서에 상관없이 표시됩니다.
+ 리소스 기반 정책에서는 `id_block`이 선택 사항입니다. ID 기반 정책에는 포함시킬 수 *없습니다*.
+ `principal_block` 요소는 리소스 기반 정책(예: Amazon S3 버킷 정책)과 IAM 역할의 신뢰 정책에 필요합니다. ID 기반 정책에는 포함시킬 수 *없습니다*.
+ Amazon S3 버킷 정책의 `principal_map` 요소에는 `CanonicalUser` ID가 포함될 수 있습니다. 대부분 리소스 기반 정책은 이러한 매핑을 지원하지 않습니다. 버킷 정책에서 표준 사용자 ID를 사용하는 방법에 대한 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [정책에서 보안 주체 지정](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-bucket-user-policy-specifying-principal-intro.html)을 참조하세요.
+ 각 문자열 값(`policy_id_string`, `sid_string`, `principal_id_string`, `action_string`, `resource_string`, `condition_type_string`, `condition_key_string`, 그리고 `condition_value`의 문자열 버전)은 자체적인 최소/최대 길이 제한, 특정 허용 값 또는 필수 내부 포맷을 가질 수 있습니다.

### 문자열 값에 대한 참고 사항
<a name="policies-grammar-notes-strings"></a>

이 섹션에서는 정책에서 각각 다른 요소에 사용되는 문자열 값에 대한 추가 정보에 대해 살펴보겠습니다.

**`action_string`**  
서비스 네임스페이스, 콜론 및 작업 이름으로 구성됩니다. 작업 이름에는 와일드카드를 추가할 수 있습니다. 예시:  

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

"Action":[
  "ec2:StartInstances",
  "ec2:StopInstances"
]

"Action":"cloudformation:*"

"Action":"*"

"Action":[
  "s3:Get*",
  "s3:List*"
]
```

**`policy_id_string`**  
정책 관련 정보를 전체적으로 추가하는 방법을 제공합니다. Amazon SQS나 Amazon SNS 같은 일부 서비스는 `Id` 요소를 예약 방식으로 사용합니다. 개별 서비스에서 달리 제한하지 않는다면 policy\_id\_string에 공백을 추가할 수 있습니다. AWS 계정 내에서 이 값의 고유성을 요구하는 서비스도 있습니다.  
`id_block`은 리소스 기반 정책에서는 허용되지만 ID 기반 정책에서는 사용할 수 없습니다.
이 문자열이 제한된 전체 정책 길이에 영향을 끼치기는 하지만 문자열 길이에 제한은 없습니다.  

```
"Id":"Admin_Policy"

"Id":"cd3ad3d9-2776-4ef1-a904-4c229d1642ee"
```

**`sid_string`**  
개별 문에 대한 정보를 추가하는 방법을 제공합니다. IAM 정책의 경우 기본 영숫자 문자(A-Z,a-z,0-9)만 `Sid` 값의 문자로 허용됩니다. 리소스 정책을 지원하는 다른 AWS 서비스는 `Sid` 값 요구 사항이 다를 수 있습니다. 예를 들어 일부 서비스는 이 값이 특정 AWS 계정에서 고유할 것을 요구하며, 일부 서비스는 `Sid` 값으로 공백과 같은 문자를 추가로 허용합니다.  

```
"Sid":"1" 

"Sid": "ThisStatementProvidesPermissionsForConsoleAccess"
```

**`principal_id_string`**  
보안 주체는 AWS 계정, IAM 사용자, IAM 역할, 페더레이션 사용자, 또는 위임된 역할 사용자의 [*Amazon 리소스 이름*(ARN)](reference_identifiers.md#identifiers-arns)을 사용해 지정합니다. AWS 계정의 경우, 전체 ARN 대신 짧은 형식인 `AWS:{{accountnumber}}`를 사용할 수도 있습니다. AWS 서비스, 위임된 역할 등을 포함한 모든 옵션에 대해서는 [보안 주체를 지정하는 방법](reference_policies_elements_principal.md#Principal_specifying) 섹션을 참조하세요.  
"모든 사용자/익명 사용자"를 지정할 때만 \*를 사용할 수 있습니다. 이름이나 ARN의 일부를 지정하기 위해 사용할 수는 없습니다.

**`resource_string`**  
대부분의 경우 [Amazon 리소스 이름](reference_identifiers.md#identifiers-arns)(ARN)으로 구성됩니다. ARN의 리소스 부분에서 와일드카드(\* 및 ?)를 사용할 수 있습니다. 와일드카드 사용에 대한 자세한 내용은 [경로에서 와일드카드 사용](reference-arns.md#arns-paths-wildcards) 섹션을 참조하세요.  
ID 기반 정책에서 불완전한 ARN(표준 필드 6개보다 필드가 적은 ARN)을 지정하면 AWS는 누락된 모든 필드에 와일드카드 문자(\*)를 추가하여 ARN을 자동으로 완성합니다. 예를 들어 `arn:aws:sqs`를 지정하는 것은 모든 리전 및 계정의 모든 Amazon SQS 리소스에 대한 액세스 권한을 부여하는 `arn:aws:sqs:*:*:*`와 동일합니다. 그러나 AWS STS AssumeRole, AssumeRoleWithWebIdentity 및 AssumeRoleWithSAML 요청에 전달된 세션 정책은 불완전한 ARN을 지원하지 않습니다. 세션 정책에서 불완전한 ARN을 사용하면 `MalformedPolicyDocumentException` 오류가 발생합니다.

```
"Resource":"arn:aws:iam::123456789012:user/Bob"

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

**`condition_type_string`**  
`StringEquals`, `StringLike`, `NumericLessThan`, `DateGreaterThanEquals`, `Bool`, `BinaryEquals`, `IpAddress`, `ArnEquals` 등 테스트할 조건 형식을 식별합니다. 조건 형식에 대한 전체 목록은 [IAM JSON 정책 요소: 조건 연산자](reference_policies_elements_condition_operators.md) 섹션을 참조하세요.  

```
"Condition": {
  "NumericLessThanEquals": {
    "s3:max-keys": "10"
  }
}

"Condition": {
  "Bool": {
    "aws:SecureTransport": "true"
  }
}

"Condition": {
  "StringEquals": {
      "s3:x-amz-server-side-encryption": "AES256"
   }
}
```

**`condition_key_string`**  
값을 테스트하여 조건 충족 여부를 판단할 수 있는 조건 키를 식별합니다. AWS은 `aws:PrincipalType`, `aws:SecureTransport` 및 `aws:userid`를 포함해 모든 AWS 서비스에 사용할 수 있는 조건 키 집합을 정의합니다.  
AWS 조건 키 목록에 대한 자세한 내용은 [AWS 글로벌 조건 컨텍스트 키](reference_policies_condition-keys.md) 섹션을 참조하세요. 서비스별 조건 키에 대한 자세한 내용은 다음과 같은 서비스 설명서를 참조하세요.  
+ *Amazon Simple Storage Service 사용 설명서*의 [정책에서 조건 지정](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazon-s3-policy-keys.html)
+ *Amazon EC2 사용 설명서*의 [Amazon EC2의 IAM 정책](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)

```
"Condition":{
  "Bool": {
      "aws:SecureTransport": "true"
   }
}

"Condition": {
  "StringNotEquals": {
      "s3:x-amz-server-side-encryption": "AES256"
   }
}

"Condition": {
  "StringEquals": {
    "aws:ResourceTag/purpose": "test"
  }
}
```

**`condition_value_string`**  
조건이 충족되는지 여부를 결정하는 condition\_key\_string 값을 식별합니다. 조건 유형에 대한 유효한 값의 전체 목록은 [IAM JSON 정책 요소: 조건 연산자](reference_policies_elements_condition_operators.md) 섹션을 참조하세요.  

```
"Condition":{
  "ForAnyValue:StringEquals": {
		"dynamodb:Attributes": [
			"{{ID}}",
			"{{PostDateTime}}"
  	      ]
  }
}
```