

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

# 권한 부여
<a name="iot-authorization"></a>

권한 부여는 인증된 자격 증명에 권한을 부여하는 프로세스입니다. AWS IoT Core 및 IAM 정책을 AWS IoT Core 사용하여에 권한을 부여합니다. 이 주제에서는 AWS IoT Core 정책을 다룹니다. IAM 정책에 대한 자세한 내용은 [에 대한 자격 증명 및 액세스 관리 AWS IoT](security-iam.md) 및 [AWS IoT 에서 IAM을 사용하는 방법](security_iam_service-with-iam.md) 단원을 참조하세요.

AWS IoT Core 정책은 인증된 자격 증명이 수행할 수 있는 작업을 결정합니다. 인증된 자격 증명은 디바이스, 모바일 애플리케이션, 웹 애플리케이션 및 데스크톱 애플리케이션이 사용합니다. 인증된 자격 증명은 AWS IoT Core CLI 명령을 입력하는 사용자일 수도 있습니다. 자격 증명은 해당 AWS IoT Core 작업에 대한 권한을 부여하는 정책이 있는 경우에만 작업을 실행할 수 있습니다.

 AWS IoT Core 정책 및 IAM 정책은 모두 자격 증명(보안 *주체*라고도 함)이 수행할 수 있는 작업을 제어하는 AWS IoT Core 데와 함께 사용됩니다. 사용하는 정책 유형은 인증에 사용하는 자격 증명 유형에 따라 다릅니다 AWS IoT Core.

AWS IoT Core 작업은 두 그룹으로 나뉩니다.
+ 컨트롤 플레인 API는 인증서, 사물, 규칙 등을 생성 또는 업데이트하는 것과 같은 관리 작업을 수행할 수 있습니다.
+ 데이터 영역 API를 사용하면 데이터를 로 보내고 받을 수 있습니다 AWS IoT Core.

사용하는 정책 유형은 제어 플레인 API 또는 데이터 플레인 API를 사용하는지에 따라 달라집니다.

다음 표에는 자격 증명, 사용되는 프로토콜, 인증에 사용될 수 있는 정책 유형이 나와 있습니다.


**AWS IoT Core 데이터 영역 API 및 정책 유형**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/iot-authorization.html)


**AWS IoT Core 컨트롤 플레인 API 및 정책 유형**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/iot-authorization.html)

AWS IoT Core 정책은 X.509 인증서, Amazon Cognito 자격 증명 또는 사물 그룹에 연결됩니다. IAM 정책은 IAM 사용자, 그룹 또는 역할에 연결됩니다. AWS IoT 콘솔 또는 AWS IoT Core CLI를 사용하여 정책을 연결하는 경우(인증서, Amazon Cognito 자격 증명 또는 사물 그룹에 연결) AWS IoT Core 정책을 사용합니다. 그렇지 않으면 사물 그룹에 연결된 IAM policy. AWS IoT Core policies가 해당 사물 그룹 내의 모든 사물에 적용됩니다. AWS IoT Core 정책을 적용하려면 `clientId` 및 사물 이름이 일치해야 합니다.

정책 기반 인증은 강력한 도구입니다. 이를 통해 AWS IoT Core에서 디바이스, 사용자 또는 애플리케이션이 수행할 수 있는 작업을 완벽하게 제어할 수 있습니다. 예를 들어 인증서를 사용하여 AWS IoT Core 에 연결하는 디바이스를 가정해 보겠습니다. 디바이스가 모든 MQTT 주제에 액세스하도록 허용할 수도 있고, 단일 주제에만 액세스하도록 제한할 수도 있습니다. 또 하나의 예로 명령줄에 CLI 명령을 입력하는 사용자를 생각해 봅시다. 정책을 사용하면 사용자의 명령 또는 AWS IoT Core 리소스에 대한 액세스를 허용하거나 거부할 수 있습니다. 또한 AWS IoT Core 리소스에 대한 애플리케이션의 액세스를 제어할 수도 있습니다.

 AWS IoT 이(가) 정책 문서를 캐시하는 방법 때문에 정책에 대한 변경 사항이 적용되는 데 몇 분이 소요될 수 있습니다. 즉, 최근에 액세스 권한이 부여된 리소스에 액세스하는 데 몇 분 정도 걸릴 수 있으며 액세스가 취소된 후 몇 분 동안 리소스에 액세스할 수 있습니다.

## AWS 교육 및 인증
<a name="iot-authorization-training"></a>

의 권한 부여에 대한 자세한 내용은 AWS 훈련 및 인증 웹 사이트의 인증 및 권한 부여에 대한 AWS IoT Core심층 분석 과정을 참조하십시오. [AWS IoT Core](https://www.aws.training/Details/Curriculum?id=42335) 

# AWS IoT Core 정책
<a name="iot-policies"></a>

AWS IoT Core 정책은 JSON 문서입니다. IAM 정책과 동일한 규칙을 따릅니다.는 명명된 정책을 AWS IoT Core 지원하므로 많은 자격 증명이 동일한 정책 문서를 참조할 수 있습니다. 명명된 정책은 버전 관리되므로 용이하게 롤백이 가능합니다.

AWS IoT Core 정책을 사용하면 AWS IoT Core 데이터 영역에 대한 액세스를 제어할 수 있습니다. AWS IoT Core 데이터 영역은 AWS IoT Core 메시지 브로커에 연결하고, MQTT 메시지를 송수신하고, 사물의 디바이스 섀도우를 가져오거나 업데이트할 수 있는 작업으로 구성됩니다.

 AWS IoT Core 정책은 하나 이상의 정책 문이 포함된 JSON 문서입니다. 각 문에는 다음이 포함됩니다.
+ `Effect` - 작업이 허용되는지 또는 거부되는지를 지정합니다.
+ `Action` - 정책이 허용하거나 거부하는 작업을 지정합니다.
+ `Resource` - 작업이 허용되거나 거부되는 리소스를 지정합니다.

가 정책 문서를 AWS IoT 캐싱하는 방식 때문에 정책에 대한 변경 사항이 적용되려면 6\$18분이 걸릴 수 있습니다. 즉, 최근에 액세스 권한이 부여된 리소스에 액세스하는 데 몇 분 정도 걸릴 수 있으며 액세스가 취소된 후 몇 분 동안 리소스에 액세스할 수 있습니다.

AWS IoT Core 정책은 X.509 인증서, Amazon Cognito 자격 증명 및 사물 그룹에 연결할 수 있습니다. 사물 그룹에 연결된 정책은 해당 그룹 내의 모든 사물에 적용됩니다. 정책이 발효되려면 `clientId`와 사물 이름이 일치해야 합니다. AWS IoT Core 정책은 IAM 정책과 동일한 정책 평가 논리를 따릅니다. 기본적으로 모든 정책이 묵시적으로 거부됩니다. 자격 증명 기반 또는 리소스 기반 정책에 포함된 명시적 허용은 이 기본 동작을 재정의합니다. 어떠한 정책의 명시적 거부도 허용을 무시합니다. 자세한 내용은 **AWS Identity and Access Management 사용 설명서의 [정책 평가 로직](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)을 참조하세요.

**Topics**
+ [AWS IoT Core 정책 작업](iot-policy-actions.md)
+ [AWS IoT Core 작업 리소스](iot-action-resources.md)
+ [AWS IoT Core 정책 변수](iot-policy-variables.md)
+ [교차 서비스 혼동된 대리인 방지](cross-service-confused-deputy-prevention.md)
+ [AWS IoT Core 정책 예제](example-iot-policies.md)
+ [Amazon Cognito 자격 증명으로 권한 부여](cog-iot-policies.md)

# AWS IoT Core 정책 작업
<a name="iot-policy-actions"></a>

 AWS IoT Core가 정의하는 정책 작업은 다음과 같습니다.MQTT 정책 작업

`iot:Connect`  
 AWS IoT Core 메시지 브로커에 연결할 수 있는 권한을 나타냅니다. `CONNECT` 요청이 브로커로 전송될 때마다 `iot:Connect` 권한이 확인됩니다. 메시지 브로커는 클라이언트 ID가 동일한 2개의 클라이언트가 동시에 연결하도록 허용하지 않습니다. 두 번째 클라이언트가 연결된 후 브로커는 기존 연결을 닫습니다. `iot:Connect` 권한을 사용하여 특정 클라이언트 ID를 사용하는 권한 부여된 클라이언트만 연결할 수 있도록 합니다.

`iot:DeleteConnection`  
연결된 MQTT 클라이언트를 AWS IoT Core에서 연결 해제할 수 있는 권한을 나타냅니다. 클라이언트를 강제로 연결 해제하도록 요청할 때마다 `iot:DeleteConnection` 권한이 확인됩니다. 클라이언트 연결을 해제하면가 클라이언트의 네트워크 연결을 AWS IoT Core 닫고 선택적으로 세션 상태를 정리합니다.

`iot:GetRetainedMessage`  
유지된 단일 메시지의 내용을 가져올 수 있는 권한을 나타냅니다. 보관된 메시지는 RETAIN 플래그가 설정되고 저장된 상태로 게시된 메시지입니다 AWS IoT Core. 계정의 모든 보관된 메시지 목록을 가져올 수 있는 권한은 [iot:ListRetainedMessages](#action_listretainedmessages) 섹션을 참조하세요.

`iot:ListRetainedMessages`  
계정의 보관된 메시지에 대한 요약 정보를 검색할 수 있는 권한을 나타내지만 메시지 내용은 검색할 수 없습니다. 보관된 메시지는 RETAIN 플래그가 설정되고 저장된 상태로 게시된 메시지입니다 AWS IoT Core. 이 작업에 대해 지정된 리소스 ARN은 `*`여야 합니다. 유지된 단일 메시지의 내용을 가져올 수 있는 권한은 [iot:GetRetainedMessage](#action_getretainpublish) 섹션을 참조하세요.

`iot:Publish`  
MQTT 주제를 게시할 수 있는 권한을 나타냅니다. PUBLISH 요청이 브로커로 전송될 때마다 이 권한이 확인됩니다. 이 권한을 사용하여 클라이언트가 특정 주제 패턴에 게시하도록 허용할 수 있습니다.  
또한 `iot:Publish` 권한을 부여하기 위해 `iot:Connect` 권한을 부여할 수도 있습니다.

`iot:Receive`  
메시지를 수신할 수 있는 권한을 나타냅니다 AWS IoT Core. 메시지가 클라이언트로 전달될 때마다 `iot:Receive` 권한이 확인됩니다. 이 권한은 전달 시마다 확인되므로 현재 주제를 구독 중인 클라이언트에 대한 권한을 취소하는 데 이 권한을 사용할 수 있습니다.

`iot:RetainPublish`  
RETAIN 플래그가 설정된 MQTT 메시지를 게시할 수 있는 권한을 나타냅니다.  
또한 `iot:RetainPublish` 권한을 부여하기 위해 `iot:Publish` 권한을 부여할 수도 있습니다.

`iot:Subscribe`  
주제 필터를 구독할 수 있는 권한을 나타냅니다. SUBSCRIBE 요청이 브로커로 전송될 때마다 이 권한이 확인됩니다. 이 권한을 사용하여 클라이언트가 특정 주제 패턴과 일치하는 주제를 구독하도록 허용합니다.  
또한 `iot:Subscribe` 권한을 부여하기 위해 `iot:Connect` 권한을 부여할 수도 있습니다.디바이스 섀도우 정책 작업

`iot:DeleteThingShadow`  
사물의 디바이스 섀도우를 삭제할 수 있는 권한을 나타냅니다. 사물의 디바이스 섀도우의 내용을 삭제하는 요청이 생성될 때마다 `iot:DeleteThingShadow` 권한이 확인됩니다.

`iot:GetThingShadow`  
사물의 디바이스 섀도우를 검색할 수 있는 권한을 나타냅니다. 사물의 디바이스 섀도우의 내용을 검색하는 요청이 생성될 때마다 `iot:GetThingShadow` 권한이 확인됩니다.

`iot:ListNamedShadowsForThing`  
사물의 이름 지정된 섀도우를 나열할 수 있는 권한을 나타냅니다. 사물의 이름 지정된 섀도우를 나열하는 요청이 생성될 때마다 `iot:ListNamedShadowsForThing` 권한이 확인됩니다.

`iot:UpdateThingShadow`  
디바이스 섀도우를 업데이트할 수 있는 권한을 나타냅니다. 사물의 디바이스 섀도우의 내용을 업데이트하는 요청이 생성될 때마다 `iot:UpdateThingShadow` 권한이 확인됩니다.

**참고**  
작업 실행 정책 작업은 HTTP TLS 엔드포인트에만 적용됩니다. MQTT 엔드포인트를 사용할 경우 이 주제에서 정의하는 MQTT 정책 작업을 사용해야 합니다.  
이를 보여주는 작업 실행 정책의 예는 MQTT 프로토콜과 함께 작동하는 [기본 작업 정책 예제](basic-jobs-example.md)을 참조하세요.작업 실행 AWS IoT Core 정책 작업

`iotjobsdata:DescribeJobExecution`  
해당 사물에 대해 작업 실행을 검색할 수 있는 권한을 나타냅니다. 작업 실행 가져오기를 요청할 때마다 `iotjobsdata:DescribeJobExecution` 권한이 확인됩니다.

`iotjobsdata:GetPendingJobExecutions`  
사물에 대해 단말 상태가 아닌 작업의 목록을 검색할 수 있는 권한을 나타냅니다. 목록 검색이 요청될 때마다 `iotjobsdata:GetPendingJobExecutions` 권한이 확인됩니다.

`iotjobsdata:UpdateJobExecution`  
작업 실행을 업데이트할 수 있는 권한을 나타냅니다. 작업 실행 상태 업데이트가 요청될 때마다 `iotjobsdata:UpdateJobExecution` 권한이 확인됩니다.

`iotjobsdata:StartNextPendingJobExecution`  
사물에 대해 대기 중인 다음 작업 실행을 가져오고 시작할 수 있는 권한을 나타냅니다. (즉, 상태가 QUEUED인 작업 실행을 IN\$1PROGRESS로 업데이트할 수 있는 권한입니다.) 대기 중인 다음 작업의 실행 시작이 요청될 때마다 `iotjobsdata:StartNextPendingJobExecution` 권한이 확인됩니다.AWS IoT Core 자격 증명 공급자 정책 작업

`iot:AssumeRoleWithCertificate`  
자격 AWS IoT Core 증명 공급자를 호출하여 인증서 기반 인증으로 IAM 역할을 수임할 수 있는 권한을 나타냅니다. 자격 AWS IoT Core 증명 공급자가 역할을 수임하도록 요청할 때마다 `iot:AssumeRoleWithCertificate` 권한이 확인됩니다.

# AWS IoT Core 작업 리소스
<a name="iot-action-resources"></a>

 AWS IoT Core 정책 작업에 대한 리소스를 지정하려면 리소스의 Amazon 리소스 이름(ARN)을 사용합니다. 모든 리소스 ARN은 다음 형식으로 되어 있습니다.

```
arn:partition:iot:region:AWS-account-ID:Resource-type/Resource-name
```

다음 표는 각 작업 유형에 지정되는 리소스를 보여 줍니다. ARN 예제는 파티션 `aws`의 계정 ID `123456789012`에 대한 것으로 리전 `us-east-1`에 특정합니다. ARN 형식에 대한 자세한 내용은 AWS Identity and Access Management 사용 설명서의 [Amazon 리소스 이름(ARNs)](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference-arns.html)을 참조하세요.


| 작업 | 리소스 유형 | 리소스 이름 | ARN 예제 | 
| --- | --- | --- | --- | 
| iot:Connect | client |  클라이언트의 클라이언트 ID  | arn:aws:iot:us-east-1:123456789012:client/myClientId | 
| iot:DeleteConnection | client |  클라이언트의 클라이언트 ID  | arn:aws:iot:us-east-1:123456789012:client/myClientId | 
| iot:DeleteThingShadow | thing |  사물 이름과 섀도우 이름(해당되는 경우)  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iotjobsdata:DescribeJobExecution | thing |  사물 이름  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iotjobsdata:GetPendingJobExecutions | thing |  사물 이름  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:GetRetainedMessage | topic |  보관된 메시지 주제  |  arn:aws:iot:us-east-1:123456789012:topic/myTopicName  | 
| iot:GetThingShadow | thing |  사물 이름과 섀도우 이름(해당되는 경우)  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iot:ListNamedShadowsForThing | 모두 | 모두 |  \$1 | 
| iot:ListRetainedMessages | 모두 | 모두 |  \$1 | 
| iot:Publish | topic |  주제 문자열  | arn:aws:iot:us-east-1:123456789012:topic/myTopicName | 
| iot:Receive | topic |  주제 문자열  | arn:aws:iot:us-east-1:123456789012:topic/myTopicName | 
| iot:RetainPublish | topic |  RETAIN 플래그를 설정하여 게시할 주제  |  arn:aws:iot:us-east-1:123456789012:topic/myTopicName  | 
| iotjobsdata:StartNextPendingJobExecution | thing |  사물 이름  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:Subscribe | topicfilter | 주제 필터 문자열 | arn:aws:iot:us-east-1:123456789012:topicfilter/myTopicFilter | 
| iotjobsdata:UpdateJobExecution | thing |  사물 이름  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:UpdateThingShadow | thing |  사물 이름과 섀도우 이름(해당되는 경우)  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iot:AssumeRoleWithCertificate | rolealias |  역할 ARN을 가리키는 역할 별칭  |  arn:aws:iot:us-east-1:123456789012:rolealias/CredentialProviderRole\$1alias | 

# AWS IoT Core 정책 변수
<a name="iot-policy-variables"></a>

AWS IoT Core 는 `Resource` 또는 `Condition` 블록의 정책에 사용할 수 있는 AWS IoT Core 정책 변수를 정의합니다. 정책이 평가될 때 정책 변수가 실제 값으로 대체됩니다. 예를 들어 디바이스가 클라이언트 ID가 100-234-3456인 AWS IoT Core 메시지 브로커에 연결된 경우 `iot:ClientId` 정책 문서에서 정책 변수는 100-234-3456로 대체됩니다.

AWS IoT Core 정책은 와일드카드 문자를 사용하고 IAM 정책과 유사한 규칙을 따를 수 있습니다. 문자열에 `*`(별표)를 삽입하면 임의의 문자와 일치하는 와일드카드로 취급될 수 있습니다. 예를 들어, 정책의 `*` 속성에서 여러 MQTT 이름을 설명하기 위해 `Resource`를 사용할 수 있습니다. `+` 및 `#` 문자는 정책에서 리터럴 문자열로 취급됩니다. 와일드카드를 사용하는 방법을 보여 주는 정책 예시는 [MQTT 및 AWS IoT Core 정책에서 와일드카드 문자 사용](pub-sub-policy.md#pub-sub-policy-cert) 섹션을 참조하세요.

사전 정의된 정책 변수와 고정된 값을 사용하여 그렇지 않으면 특별한 의미를 갖는 문자를 나타낼 수도 있습니다. 이러한 특수 문자는 `$(*)`, `$(?)`, `$($)`입니다. 정책 변수 및 특수 문자에 대한 자세한 내용은 [IAM 정책 요소: 변수 및 태그](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html)와 [다수의 키 또는 값을 사용하는 조건 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_multi-value-conditions.html)을 참조하세요.

**Topics**
+ [기본 AWS IoT Core 정책 변수](basic-policy-variables.md)
+ [사물 정책 변수](thing-policy-variables.md)
+ [X.509 인증서 AWS IoT Core 정책 변수](cert-policy-variables.md)

# 기본 AWS IoT Core 정책 변수
<a name="basic-policy-variables"></a>

AWS IoT Core 는 다음과 같은 기본 정책 변수를 정의합니다.
+ `aws:SourceIp`: AWS IoT Core 메시지 브로커에 연결된 클라이언트의 IP 주소입니다.
+ `iot:ClientId`: AWS IoT Core 메시지 브로커에 연결하는 데 사용되는 클라이언트 ID입니다.
+ `iot:DomainName`: 연결된 클라이언트의 도메인 이름입니다 AWS IoT Core.

**Topics**
+ [`ClientId` 및 `SourceIp` 정책 변수의 예](#basic-policy-variables-example)
+ [`iot:DomainName` 정책 변수의 예](#basic-policy-variables-example-domain)

## `ClientId` 및 `SourceIp` 정책 변수의 예
<a name="basic-policy-variables-example"></a>

다음 AWS IoT Core 정책은 정책 변수를 사용하는 정책을 보여줍니다.는 정책의 조건 요소에서 보안 주체가 특정 주소 범위 내에서만 API를 요청하도록 허용하는 데 사용할 `aws:SourceIp` 수 있습니다. 예시는 [사용자 및 클라우드 서비스에 AWS IoT 작업 사용 권한 부여](iam-policy-users-jobs.md) 섹션을 참조하세요.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/clientid1"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}"
			],
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": "123.45.167.89"
				}
			}
		}
	]
}
```

이 예제에서는 정책이 평가될 때 `${iot:ClientId}`가 AWS IoT Core 메시지 브로커에 연결된 클라이언트의 ID로 대체됩니다. `${iot:ClientId}` 같은 정책 변수를 사용할 경우 잘못하여 의도치 않은 주제에 대한 액세스를 개방할 수 있습니다. 예를 들어 `${iot:ClientId}`를 사용하여 주제 필터를 지정하는 정책을 사용할 경우

```
{
	"Effect": "Allow",
	"Action": [
		"iot:Subscribe"
	],
	"Resource": [
		"arn:aws:iot:us-east-1:123456789012:topicfilter/my/${iot:ClientId}/topic"
	]
}
```

클라이언트가 `+`를 클라이언트 ID로 사용하여 연결할 수 있습니다. 이는 사용자가 주제 필터 `my/+/topic`와 일치하는 모든 주제를 구독하도록 허용하는 것입니다. 그러한 보안 간극을 방지하려면 `iot:Connect` 정책 작업을 사용하여 어느 클라이언트 ID가 연결할 수 있는지 제어합니다. 예를 들어 이 정책은 클라이언트 ID가 `clientid1`인 클라이언트만 연결하도록 허용합니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/clientid"
			]
		}
	]
}
```

**참고**  
정책 변수 `${iot:ClientId}`를 `Connect`와 함께 사용하는 것은 권장되지 않습니다. `ClientId`의 값은 확인하지 않으므로 다른 클라이언트의 ID를 가진 어태처가 검증을 통과할 수 있지만 연결이 끊길 수 있습니다. `ClientId`는 무엇이든 허용되므로 무작위로 클라이언트 ID를 설정하면 사물 그룹 정책을 우회할 수 있습니다.

## `iot:DomainName` 정책 변수의 예
<a name="basic-policy-variables-example-domain"></a>

`iot:DomainName` 정책 변수를 추가하여 사용할 수 있는 도메인을 제한할 수 있습니다. `iot:DomainName` 정책 변수를 추가하면 디바이스가 구성된 특정 엔드포인트에만 연결할 수 있습니다.

다음 정책은 디바이스가 지정된 도메인에 연결할 수 있도록 허용합니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": {
		"Sid": "AllowConnectionsToSpecifiedDomain",
		"Effect": "Allow",
		"Action": [
			"iot:Connect"
		],
		"Resource": "arn:aws:iot:us-east-1:123456789012:client/clientid",
		"Condition": {
			"StringEquals": {
				"iot:DomainName": "d1234567890abcdefghij-ats.iot.us-east-1.amazonaws.com"
			}
		}
	}
}
```

다음 정책은 지정된 도메인에 연결하는 디바이스를 거부합니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": {
		"Sid": "DenyConnectionsToSpecifiedDomain",
		"Effect": "Deny",
		"Action": [
			"iot:Connect"
		],
		"Resource": "arn:aws:iot:us-east-1:123456789012:client/clientid",
		"Condition": {
			"StringEquals": {
				"iot:DomainName": "d1234567890abcdefghij-ats.iot.us-east-1.amazonaws.com"
			}
		}
	}
}
```

IAM 조건 연산자에 대한 자세한 내용은 IAM 사용 설명서의 [IAM JSON 정책 요소: 조건 연산자](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)를 참조하세요. 도메인 구성에 대한 자세한 내용은 [What is a domain configuration?](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)을 참조하세요.

# 사물 정책 변수
<a name="thing-policy-variables"></a>

사물 정책 변수를 사용하면 사물 이름, 사물 유형 및 사물 속성 값과 같은 사물 속성을 기반으로 권한을 부여하거나 거부하는 AWS IoT Core 정책을 작성할 수 있습니다. 사물 정책 변수를 사용하여 동일한 정책을 적용하여 많은 AWS IoT Core 디바이스를 제어할 수 있습니다. 디바이스 프로비저닝에 대한 자세한 내용은 [디바이스 프로비저닝](iot-provision.html)을 참조하세요.

비독점 사물 연결을 사용하는 경우, 동일한 인증서를 여러 사물에 연결할 수 있습니다. 명확한 연결 관계를 유지하고 잠재적 충돌을 방지하려면, 클라이언트 ID가 사물 이름과 일치해야 합니다. 이 경우 사물이 연결될 때 전송되는 MQTT `Connect` 메시지의 클라이언트 ID에서 사물 이름을 가져옵니다 AWS IoT Core.

 AWS IoT Core 정책에서 사물 정책 변수를 사용할 때는 다음 사항에 유의하세요.
+ [AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html) API를 사용하여 인증서 또는 보안 주체(인증된 Amazon Cognito 자격 증명)를 사물에 연결할 수 있습니다.
+ 비독점 사물 연결이 이루어졌을 경우, 사물 이름을 사물 정책 변수로 바꿀 때 MQTT 연결 메시지 또는 TLS 연결의 `clientId` 값이 사물 이름과 정확히 일치해야 합니다.

다음의 사물 정책 변수를 사용할 수 있습니다.
+ `iot:Connection.Thing.ThingName`

  이렇게 하면 정책이 평가되는 AWS IoT Core 레지스트리의 사물 이름으로 확인됩니다.는 디바이스가 인증할 때 제공하는 인증서를 AWS IoT Core 사용하여 연결을 확인하는 데 사용할 사물을 결정합니다. 이 정책 변수는 디바이스가 MQTT 또는 WebSocket 프로토콜을 통한 MQTT를 통해 연결하는 경우에만 사용할 수 있습니다.
+ `iot:Connection.Thing.ThingTypeName`

  이 변수는 정책이 평가되는 사물과 연결된 사물 유형으로 변환됩니다. MQTT/WebSocket 연결의 클라이언트 ID는 사물 이름과 동일해야 합니다. 이 정책 변수는 MQTT 또는 WebSocket 프로토콜을 통한 MQTT를 통해 연결하는 경우에만 사용할 수 있습니다.
+ `iot:Connection.Thing.Attributes[attributeName]`

  이 변수는 정책이 평가되는 사물과 연결된 지정된 속성의 값으로 변환됩니다. 사물은 최대 50개의 속성을 가질 수 있습니다. 각 속성은 정책 변수 `iot:Connection.Thing.Attributes[attributeName]`으로 사용할 수 있습니다. 여기서 *attributeName*은 속성의 이름입니다. MQTT/WebSocket 연결의 클라이언트 ID는 사물 이름과 동일해야 합니다. 이 정책 변수는 MQTT 또는 MQTT over WebSocket 프로토콜을 통해 연결하는 경우에만 사용할 수 있습니다.
+ `iot:Connection.Thing.IsAttached`

  `iot:Connection.Thing.IsAttached: ["true"]`는에 등록 AWS IoT 되고 보안 주체에 연결된 디바이스만 정책 내의 권한에 액세스할 수 있도록 합니다. 레지스트리의 IoT 사물에 AWS IoT Core 연결되지 않은 인증서를 제공하는 AWS IoT Core 경우이 변수를 사용하여 디바이스가에 연결되지 않도록 할 수 있습니다.이 변수에는 연결 사물이 [AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html) API를 사용하여 레지스트리의 인증서 또는 Amazon Cognito 자격 증명에 연결되었음을 `false` 나타내는 `true` 또는 값이 있습니다. 사물 이름은 클라이언트 ID로 간주됩니다.

클라이언트 ID가 사물 이름과 일치하거나 인증서를 하나의 사물에만 독점적으로 연결하는 경우, 정책 정의에서 정책 변수를 사용하면 정책 관리를 간소화할 수 있습니다. 각 IoT 사물에 대해 개별 정책을 생성하는 대신, 사물 정책 변수를 사용하여 단일 정책을 정의할 수 있습니다. 이 정책은 모든 디바이스에 동적으로 적용할 수 있습니다. 다음은 작동 방식을 보여주는 예제 정책입니다. 자세한 내용은 [AWS IoT 사물을 MQTT 클라이언트 연결에 연결](exclusive-thing.md) 단원을 참조하십시오.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Condition": {
				"StringLike": {
					"iot:ClientId": "*${iot:Connection.Thing.Attributes[envType]}"
				}
			},
			"Effect": "Allow",
			"Action": "iot:Connect",
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/*"
		}
	]
}
```

이 정책 예제에서는 클라이언트 ID가 `envType` 속성 값으로 끝나는 AWS IoT Core 경우 사물을에 연결할 수 있습니다. 클라이언트 ID 패턴이 일치하는 사물만 연결할 수 있습니다.

# X.509 인증서 AWS IoT Core 정책 변수
<a name="cert-policy-variables"></a>

X.509 인증서 정책 변수는 AWS IoT Core 정책 작성을 지원합니다. 이러한 정책은 X.509 인증서 속성을 기반으로 권한을 부여합니다. 다음 섹션에서는 이러한 인증서 정책 변수를 사용하는 방법을 설명합니다.

**중요**  
X.509 인증서에 특정 인증서 속성이 포함되어 있지 않지만 정책 문서에서 해당 인증서 정책 변수를 사용하는 경우 정책 평가가 예기치 않은 동작으로 이어질 수 있습니다.

## CertificateId
<a name="cert-policy-variables-certid"></a>

[RegisterCertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCertificate.html) API에서 `certificateId`가 응답 본문에 나타납니다. 인증서에 대한 정보를 가져오려면 [DescribeCertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeCertificate.html)의 `certificateId`를 사용할 수 있습니다.

## 발행자 속성
<a name="issuer-attributes"></a>

다음 AWS IoT Core 정책 변수는 인증서 발급자가 설정한 인증서 속성을 기반으로 권한 허용 또는 거부를 지원합니다.
+ `iot:Certificate.Issuer.DistinguishedNameQualifier`
+ `iot:Certificate.Issuer.Country`
+ `iot:Certificate.Issuer.Organization`
+ `iot:Certificate.Issuer.OrganizationalUnit`
+ `iot:Certificate.Issuer.State`
+ `iot:Certificate.Issuer.CommonName`
+ `iot:Certificate.Issuer.SerialNumber`
+ `iot:Certificate.Issuer.Title`
+ `iot:Certificate.Issuer.Surname`
+ `iot:Certificate.Issuer.GivenName`
+ `iot:Certificate.Issuer.Initials`
+ `iot:Certificate.Issuer.Pseudonym`
+ `iot:Certificate.Issuer.GenerationQualifier` 

## 제목 속성
<a name="subject-attributes"></a>

다음 AWS IoT Core 정책 변수는 인증서 발급자가 설정한 인증서 주체 속성을 기반으로 권한 부여 또는 거부를 지원합니다.
+ `iot:Certificate.Subject.DistinguishedNameQualifier`
+ `iot:Certificate.Subject.Country`
+ `iot:Certificate.Subject.Organization`
+ `iot:Certificate.Subject.OrganizationalUnit`
+ `iot:Certificate.Subject.State`
+ `iot:Certificate.Subject.CommonName`
+ `iot:Certificate.Subject.SerialNumber`
+ `iot:Certificate.Subject.Title`
+ `iot:Certificate.Subject.Surname`
+ `iot:Certificate.Subject.GivenName`
+ `iot:Certificate.Subject.Initials`
+ `iot:Certificate.Subject.Pseudonym`
+ `iot:Certificate.Subject.GenerationQualifier` 

X.509 인증서는 이러한 속성이 하나 이상의 값을 포함한 옵션을 가지도록 허용합니다. 기본적으로 각 다중 값 속성의 정책 변수는 첫 번째 값을 반환합니다. 예를 들어 `Certificate.Subject.Country` 속성에는 국가 이름 목록이 포함되었을 수 있지만, 정책에서 평가될 때 `iot:Certificate.Subject.Country`는 첫 번째 국가 이름으로 대체됩니다.

1 기반 인덱스를 사용하여 첫 번째 값 이외의 특정 속성 값을 요청할 수 있습니다. 예를 들어 `iot:Certificate.Subject.Country.1`은 `Certificate.Subject.Country` 속성의 두 번째 국가로 대체됩니다. 존재하지 않는 인덱스 값을 지정할 경우(예: 속성에 값이 2개만 할당되었지만 세 번째 값을 요청하는 경우) 값이 대체되지 않고 권한 부여가 실패합니다. 정책 변수 이름에 `.List` 접미사를 사용하여 속성의 모든 값을 지정할 수 있습니다.

## 발행자 대체 이름 속성
<a name="issuer-alternate-name-attributes"></a>

다음 AWS IoT Core 정책 변수는 인증서 발급자가 설정한 발급자 대체 이름 속성을 기반으로 권한 부여 또는 거부를 지원합니다.
+ `iot:Certificate.Issuer.AlternativeName.RFC822Name`
+ `iot:Certificate.Issuer.AlternativeName.DNSName`
+ `iot:Certificate.Issuer.AlternativeName.DirectoryName`
+ `iot:Certificate.Issuer.AlternativeName.UniformResourceIdentifier`
+ `iot:Certificate.Issuer.AlternativeName.IPAddress`

## 제목 대체 이름 속성
<a name="subject-alternate-name-attributes"></a>

다음 AWS IoT Core 정책 변수는 인증서 발급자가 설정한 주체 대체 이름 속성을 기반으로 권한 부여 또는 거부를 지원합니다.
+ `iot:Certificate.Subject.AlternativeName.RFC822Name`
+ `iot:Certificate.Subject.AlternativeName.DNSName`
+ `iot:Certificate.Subject.AlternativeName.DirectoryName`
+ `iot:Certificate.Subject.AlternativeName.UniformResourceIdentifier`
+ `iot:Certificate.Subject.AlternativeName.IPAddress`

## 기타 속성
<a name="other-attributes"></a>

`iot:Certificate.SerialNumber`를 사용하여 인증서의 일련 번호에 따라 AWS IoT Core 리소스에 대한 액세스를 허용하거나 거부할 수 있습니다. `iot:Certificate.AvailableKeys` 정책 변수는 값을 갖는 모든 인증서 정책 변수의 이름을 포함합니다.

# X.509 인증서 정책 변수 사용
<a name="use-policy-variables"></a>

이 주제에서는 인증서 정책 변수를 사용하는 방법에 대한 세부 정보를 제공합니다. X.509 인증서 정책 변수는 X.509 인증서 속성을 기반으로 권한을 부여하는 AWS IoT Core 정책을 생성할 때 필수입니다. X.509 인증서에 특정 인증서 속성이 포함되어 있지 않지만 정책 문서에서 해당 인증서 정책 변수를 사용하는 경우 정책 평가가 예기치 않은 동작으로 이어질 수 있습니다. 이는 누락된 정책 변수가 정책 문에서 평가되지 않기 때문입니다.

**Topics**
+ [X.509 인증서 예제](#certificate-example)
+ [인증서 발행자 속성을 인증서 정책 변수로 사용](#issuer-attributes-policy)
+ [인증서 주체 속성을 인증서 정책 변수로 사용](#subject-attributes-policy)
+ [인증서 발행자 대체 이름 속성을 인증서 정책 변수로 사용](#issuer-alternate-name-attributes-policy)
+ [인증서 주체 대체 이름 속성을 인증서 정책 변수로 사용](#subject-alternate-name-attributes-policy)
+ [다른 인증서 속성을 인증서 정책 변수로 사용](#other-attributes-policy)
+ [X.509 인증서 정책 변수 제한 사항](#policy-limits)
+ [인증서 정책 변수를 사용하는 정책 예제](#example-attributes-policy)

## X.509 인증서 예제
<a name="certificate-example"></a>

일반적인 X.509 인증서는 다음과 같이 표시될 수 있습니다. 이 예제 인증서에는 인증서 속성이 포함되어 있습니다. AWS IoT Core 정책을 평가하는 동안 `Serial Number`, `Issuer`, `Subject`, `X509v3 Issuer Alternative Name` 및 `X509v3 Subject Alternative Name` 인증서 정책 변수로 다음 인증서 속성이 채워집니다.

```
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            92:12:85:cb:b7:a5:e0:86
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=IoT Devices, OU=SmartHome, ST=WA, CN=IoT Devices Primary CA, 
				GN=Primary CA1/initials=XY/dnQualifier=Example corp,
				SN=SmartHome/ title=CA1/pseudonym=Primary_CA/generationQualifier=2/serialNumber=987		
        Validity
            Not Before: Mar 26 03:25:40 2024 GMT
            Not After : Apr 28 03:25:40 2025 GMT
        Subject: C=US, O=IoT Devices, OU=LightBulb, ST=NY, CN=LightBulb Device Cert, 
				GN=Bulb/initials=ZZ/dnQualifier=Bulb001, 
				SN=Multi Color/title=RGB/pseudonym=RGB Device/generationQualifier=4/serialNumber=123
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    << REDACTED >>
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name: 
                DNS:example.com, IP Address:1.2.3.4, URI:ResourceIdentifier001, email:device1@example.com, DirName:/C=US/O=IoT/OU=SmartHome/CN=LightBulbCert
            X509v3 Issuer Alternative Name: 
                DNS:issuer.com, IP Address:5.6.7.8, URI:PrimarySignerCA, email:primary@issuer.com, DirName:/C=US/O=Issuer/OU=IoT Devices/CN=Primary Issuer CA
    Signature Algorithm: sha256WithRSAEncryption
         << REDACTED >>
```

## 인증서 발행자 속성을 인증서 정책 변수로 사용
<a name="issuer-attributes-policy"></a>

다음 표에는 인증서 발급자 속성이 AWS IoT Core 정책에 채워지는 방법에 대한 세부 정보가 나와 있습니다.


**정책에 채워질 발행자 속성**  

| 인증서 발행자 속성 | 인증서 정책 변수 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/use-policy-variables.html)  | 

## 인증서 주체 속성을 인증서 정책 변수로 사용
<a name="subject-attributes-policy"></a>

다음 표에는 인증서 주체 속성이 AWS IoT Core 정책에 채워지는 방법에 대한 세부 정보가 나와 있습니다.


**정책에 채워질 주체 속성**  

| 인증서 주체 속성 | 인증서 정책 변수 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/use-policy-variables.html)  | 

## 인증서 발행자 대체 이름 속성을 인증서 정책 변수로 사용
<a name="issuer-alternate-name-attributes-policy"></a>

다음 표에는 인증서 발행자 대체 이름 속성이 AWS IoT Core 정책에 채워지는 방법에 대한 세부 정보가 나와 있습니다.


**정책에 채워질 발행자 대체 이름 속성**  

| X509v3 발행자 대체 이름 | 정책의 속성 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/use-policy-variables.html)  | 

## 인증서 주체 대체 이름 속성을 인증서 정책 변수로 사용
<a name="subject-alternate-name-attributes-policy"></a>

다음 표에는 인증서 주체 대체 이름 속성이 AWS IoT Core 정책에 채워지는 방법에 대한 세부 정보가 나와 있습니다.


**정책에 채워질 주체 대체 이름 속성**  

| X509v3 주체 대체 이름 | 정책의 속성 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/use-policy-variables.html)  | 

## 다른 인증서 속성을 인증서 정책 변수로 사용
<a name="other-attributes-policy"></a>

다음 표에는 다른 인증서 속성이 AWS IoT Core 정책에 채워지는 방법에 대한 세부 정보가 나와 있습니다.


**정책에 채워질 기타 속성**  

| 기타 인증서 속성 | 인증서 정책 변수 | 
| --- | --- | 
|  `Serial Number: 92:12:85:cb:b7:a5:e0:86`  |  `iot:Certificate.SerialNumber = 10525622389124227206`  | 

## X.509 인증서 정책 변수 제한 사항
<a name="policy-limits"></a>

X.509 인증서 정책 변수에는 다음의 제한 사항이 적용됩니다.

누락된 정책 변수  
X.509 인증서에 특정 인증서 속성이 포함되어 있지 않지만 정책 문서에서 해당 인증서 정책 변수를 사용하는 경우 정책 평가가 예기치 않은 동작으로 이어질 수 있습니다. 이는 누락된 정책 변수가 정책 문에서 평가되지 않기 때문입니다.

인증서 SerialNumber 형식  
AWS IoT Core 는 인증서 일련 번호를 10진수 정수의 문자열 표현으로 처리합니다. 예를 들어 정책에서 인증서 일련 번호와 일치하는 클라이언트 ID와의 연결만 허용하는 경우 클라이언트 ID는 십진수 형식의 일련 번호여야 합니다.

와일드카드  
인증서 속성에 와일드카드 문자가 있을 경우 정책 변수가 인증서 속성 값으로 대체되지 않습니다. 이렇게 하면 정책 문서에 `${policy-variable}` 텍스트가 남습니다. 이는 인증 실패를 초래할 수 있습니다. `*`, `$`, `+`, `?`, `#` 등의 와일드카드 문자를 사용할 수 있습니다.

어레이 필드  
어레이를 포함하는 인증서 속성은 5개 항목으로 제한됩니다. 추가 항목은 무시됩니다.

문자열 길이  
모든 문자열 값은 1,024자로 제한됩니다. 인증서 속성이 1,024자를 초과하는 문자열을 포함할 경우 정책 변수가 인증서 속성 값으로 대체되지 않습니다. 이렇게 하면 정책 문서에 `${policy-variable}`이 남습니다. 이는 인증 실패를 초래할 수 있습니다.

특수 문자  
`,`, `"`, `\`, `+`, `=`, `<`, `>`, `;` 등의 특수 문자는 정책 변수에 사용될 때 앞에 백슬래시(`\`)가 있어야 합니다. 예를 들어, `Amazon Web Services O=Amazon.com Inc. L=Seattle ST=Washington C=US`는 `Amazon Web Service O\=Amazon.com Inc. L\=Seattle ST\=Washington C\=US`가 됩니다.

## 인증서 정책 변수를 사용하는 정책 예제
<a name="example-attributes-policy"></a>

다음 정책 문서에서는 인증서 일련번호와 일치하는 클라이언트 ID와의 연결 및 패턴과 일치하는 주제에 대한 게시를 허용합니다. `${iot:Certificate.Subject.Organization}/device-stats/${iot:ClientId}/*`.

**중요**  
X.509 인증서에 특정 인증서 속성이 포함되어 있지 않지만 정책 문서에서 해당 인증서 정책 변수를 사용하는 경우 정책 평가가 예기치 않은 동작으로 이어질 수 있습니다. 이는 누락된 정책 변수가 정책 문에서 평가되지 않기 때문입니다. 예를 들어 `iot:Certificate.Subject.Organization` 속성이 포함되지 않은 인증서에 다음 정책 문서를 연결하면 정책 평가 중에 `iot:Certificate.Subject.Organization` 인증서 정책 변수가 채워지지 않습니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Certificate.SerialNumber}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.Organization}/device-stats/${iot:ClientId}/*"
			]
		}
	]
}
```

[Null 조건 연산자](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Null)를 사용하여 정책 평가 중에 정책에 사용되는 인증서 정책 변수가 채워지도록 할 수도 있습니다. 다음 정책 문서는 인증서 일련번호 및 인증서 주체 일반 이름 속성이 있는 경우에만 인증서가 있는 `iot:Connect`를 허용합니다.

모든 인증서 정책 변수에는 문자열 값이 있으므로 모든 [문자열 조건 연산자](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String)가 지원됩니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/*"
			],
			"Condition": {
				"Null": {
					"iot:Certificate.SerialNumber": "false",
					"iot:Certificate.Subject.CommonName": "false"
				}
			}
		}
	]
}
```

# 교차 서비스 혼동된 대리인 방지
<a name="cross-service-confused-deputy-prevention"></a>

*혼동된 대리자 문제*는 작업을 수행할 권한이 없는 엔터티가 권한이 더 많은 엔터티에 작업을 수행하도록 강요할 수 있는 보안 문제입니다. 에서 AWS교차 서비스 가장은 혼동된 대리자 문제를 초래할 수 있습니다. 교차 서비스 가장은 한 서비스(*직접적으로 호출하는 서비스*)가 다른 서비스(*직접적으로 호출되는 서비스*)를 직접적으로 호출할 때 발생할 수 있습니다. 호출하는 서비스는 다른 고객의 리소스에 대해 액세스 권한이 없는 방식으로 작동하게 권한을 사용하도록 조작될 수 있습니다. 이를 방지하기 위해 AWS 에서는 계정의 리소스에 대한 액세스 권한이 부여된 서비스 위탁자를 사용하여 모든 서비스에 대한 데이터를 보호하는 데 도움이 되는 도구를 제공합니다.

리소스에 다른 서비스를 AWS IoT 제공하는 권한을 제한하려면 리소스 정책에서 [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) 및 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 전역 조건 컨텍스트 키를 사용하는 것이 좋습니다. 두 전역 조건 컨텍스트 키를 모두 사용하는 경우 `aws:SourceAccount` 값과 `aws:SourceArn` 값의 계정은 동일한 정책 문에서 사용할 경우 동일한 계정 ID를 사용해야 합니다.

혼동된 대리자 문제로부터 보호하는 가장 효과적인 방법은 리소스의 전체 Amazon 리소스 이름(ARN)이 포함된 `aws:SourceArn` 전역 조건 컨텍스트 키를 사용하는 것입니다. 의 경우 AWS IoT는 `arn:aws:iot:region:account-id:resource-type/resource-id` 리소스별 권한 또는의 형식을 준수해야 `aws:SourceArn` 합니다`arn:aws:iot:region:account-id:*`. resource-id는 허용된 리소스의 이름 또는 ID이거나 허용된 리소스 ID의 와일드카드 문입니다. *리전*이 AWS IoT 리전과 일치하고 *account-id*가 고객 계정 ID와 일치하는지 확인합니다.

다음 예제에서는 AWS IoT 역할 신뢰 정책에서 `aws:SourceArn` 및 `aws:SourceAccount` 전역 조건 컨텍스트 키를 사용하여 혼동된 대리자 문제를 방지하는 방법을 보여줍니다. 더 많은 예시는 [혼동된 대리자 방지의 세부 예제](#cross-service-confused-deputy-prevention-examples)를 참조합니다.

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:*"
        }
         }
      }
   ]
}
```

**참고**  
액세스 거부 오류가 발생하는 경우 AWS 보안 토큰 서비스(STS)와의 서비스 통합이 `aws:SourceArn` 및 `aws:SourceAccount` 컨텍스트 키를 지원하지 않기 때문일 수 있습니다.

## 혼동된 대리자 방지의 세부 예제
<a name="cross-service-confused-deputy-prevention-examples"></a>

**이 섹션에서는 AWS IoT 역할 신뢰 정책에서 `aws:SourceArn` 및 `aws:SourceAccount` 전역 조건 컨텍스트 키를 사용하여 혼동된 대리자 문제를 방지하는 방법에 대한 자세한 예를 제공합니다.**
+ [플릿 프로비저닝](#cross-service-confused-deputy-prevention-fleet-provision)
+ [JITP](#cross-service-confused-deputy-prevention-JITP)
+ [보안 인증 제공업체](#cross-service-confused-deputy-prevention-credential-provider)

### 플릿 프로비저닝
<a name="cross-service-confused-deputy-prevention-fleet-provision"></a>

프로비저닝 템플릿 리소스를 사용하여 [플릿 프로비저닝](https://docs.aws.amazon.com/iot/latest/developerguide/iot-provision.html)을 구성할 수 있습니다. 프로비저닝 템플릿이 프로비저닝 역할을 참조하면 해당 역할의 신뢰 정책에 `aws:SourceArn` 및 `aws:SourceAccount` 조건 키가 포함될 수 있습니다. 이러한 키는 구성이 `sts:AssumeRole` 요청을 간접적으로 호출할 수 있는 리소스를 제한합니다.

다음 신뢰 정책을 사용하는 역할은 `SourceArn`에 지정된 프로비저닝 템플릿에 대한 IoT 위탁자(`iot.amazonaws.com`)만 수임할 수 있습니다.

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:provisioningtemplate/example_template"
        }
         }
      }
   ]
}
```

### JITP
<a name="cross-service-confused-deputy-prevention-JITP"></a>

[적시 프로비저닝(JITP)](https://docs.aws.amazon.com//iot/latest/developerguide/jit-provisioning.html)에서는 프로비저닝 템플릿을 CA와 별도의 리소스로 사용하거나 템플릿 본문과 역할을 CA 인증서 구성의 일부로 정의할 수 있습니다. `aws:SourceArn` AWS IoT 역할 신뢰 정책의 값은 프로비저닝 템플릿을 정의하는 방법에 따라 달라집니다.

#### 프로비저닝 템플릿을 별도의 리소스로 정의
<a name="cross-service-confused-deputy-prevention-JITP-template"></a>

프로비저닝 템플릿을 별도의 리소스로 정의하는 경우 `aws:SourceArn`의 값은 `"arn:aws:iot:region:account-id:provisioningtemplate/example_template"`가 될 수 있습니다. [플릿 프로비저닝](#cross-service-confused-deputy-prevention-fleet-provision)에서 동일한 정책 예제를 사용할 수 있습니다.

#### CA 인증서에서 프로비저닝 템플릿 정의
<a name="cross-service-confused-deputy-prevention-JITP-CA"></a>

CA 인증서 리소스 내에서 프로비저닝 템플릿을 정의하는 경우 `aws:SourceArn`의 값은 `"arn:aws:iot:region:account-id:cacert/cert_id"` 또는 `"arn:aws:iot:region:account-id:cacert/*"`가 될 수 있습니다. 생성 시 CA 인증서의 ID와 같은 리소스 식별자를 알 수 없는 경우 와일드카드를 사용할 수 있습니다.

다음 신뢰 정책이 있는 역할은 `SourceArn`에 지정된 CA 인증서의 IoT 위탁자(`iot.amazonaws.com`)만 수임할 수 있습니다.

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:cacert/8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e"
        }
         }
      }
   ]
}
```

CA 인증서를 생성할 때 등록 구성에서 프로비저닝 역할을 참조할 수 있습니다. 프로비저닝 역할의 신뢰 정책은 `aws:SourceArn`을 사용하여 역할을 수임할 수 있는 리소스를 제한할 수 있습니다. 그러나 CA 인증서를 등록하기 위한 최초 [RegisterCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) 직접 호출 중에는 CA 인증서의 ARN이 `aws:SourceArn` 조건에 지정되지 않습니다.

이를 해결하려면, 즉에 등록된 특정 CA 인증서에 프로비저닝 역할 신뢰 정책을 지정하려면 다음을 수행할 AWS IoT Core수 있습니다.
+ 먼저 `RegistrationConfig` 파라미터를 제공하지 않고 [RegisterCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html)를 직접적으로 호출합니다.
+ CA 인증서가에 등록된 후 CA 인증서에서 [UpdateCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateCACertificate.html)를 AWS IoT Core호출합니다.

  UpdateCACertificate 호출에서 새로 등록된 CA 인증서의 ARN으로 `aws:SourceArn` 설정된 프로비저닝 역할 신뢰 정책을 포함하는 `RegistrationConfig`를 제공합니다.

### 보안 인증 제공업체
<a name="cross-service-confused-deputy-prevention-credential-provider"></a>

[AWS IoT Core 자격 증명 공급자](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.html)의 경우에서 역할 별칭을 생성하는 데 AWS 계정 사용하는 것과 동일한를 사용하고 `aws:SourceAccount`에서 역할별 리소스 유형의 리소스 ARN과 일치하는 문을 지정합니다`aws:SourceArn`. AWS IoT Core 자격 증명 공급자와 함께 사용할 IAM 역할을 생성할 때 역할을 수임해야 할 수 있는 역할 별칭의 ARNs을 `aws:SourceArn` 조건에 포함시켜 교차 서비스 `sts:AssumeRole` 요청을 승인해야 합니다.

다음 신뢰 정책이 있는 역할은 `SourceArn`에 지정된 roleAlias에 대한 AWS IoT Core 자격 증명 공급자(`credentials.iot.amazonaws.com`)의 위탁자만 수임할 수 있습니다. 위탁자가 `aws:SourceArn` 조건에 지정된 것 이외의 역할 별칭에 대한 자격 증명을 검색하려고 하면 다른 역할 별칭이 동일한 IAM 역할을 참조하더라도 요청이 거부됩니다.

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "credentials.iot.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:iot:us-east-1:123456789012:rolealias/example_rolealias"
        }
      }
    }
  ]
}
```

# AWS IoT Core 정책 예제
<a name="example-iot-policies"></a>

이 섹션의 정책 예는 AWS IoT Core에서 일반적인 작업을 완료하는 데 사용되는 정책 문서를 보여줍니다. 이들을 솔루션에 대한 정책을 생성할 때부터 시작하는 예로 사용할 수 있습니다.<a name="example-iot-policies-elements"></a>

이 섹션의 예에서는 다음 정책 요소를 사용합니다.
+ [AWS IoT Core 정책 작업](iot-policy-actions.md)
+ [AWS IoT Core 작업 리소스](iot-action-resources.md)
+ [AWS IoT 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md)
+ [기본 AWS IoT Core 정책 변수](basic-policy-variables.md)
+ [X.509 인증서 AWS IoT Core 정책 변수](cert-policy-variables.md)

**Topics**
+ [연결 정책 예제](connect-policy.md)
+ [게시/구독 정책 예제](pub-sub-policy.md)
+ [연결 및 게시 정책 예제](connect-and-pub.md)
+ [보관된 메시지 정책 예](retained-message-policy-examples.md)
+ [인증서 정책 예제](certificate-policy-examples.md)
+ [사물 정책 예제](thing-policy-examples.md)
+ [기본 작업 정책 예제](basic-jobs-example.md)

# 연결 정책 예제
<a name="connect-policy"></a>

다음 정책은 클라이언트 IDs `client1` 및에 대한 연결 권한을 거부합니다. `client2` AWS IoT Core클라이언트 ID는 AWS IoT Core 레지스트리에 등록되고 연결에 사용되는 보안 주체에 연결된 사물의 이름과 일치합니다.

**참고**  
등록된 디바이스의 경우 `Connect` 작업에 [사물 정책 변수](thing-policy-variables.md)를 사용하고 연결에 사용되는 보안 주체에 사물을 연결하는 것이 좋습니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/client1",
				"arn:aws:iot:us-east-1:123456789012:client/client2"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		}
	]
}
```

다음 정책은 클라이언트 ID를 사용하여에 연결할 수 AWS IoT Core 있는 권한을 부여합니다`client1`. 이 정책 예시는 등록되지 않은 디바이스를 위한 것입니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/client1"
			]
		}
	]
}
```

## MQTT 영구 세션 정책 예
<a name="persistent-sessions-examples"></a>

`connectAttributes`을(를) 사용하면 IAM 정책의 연결 메시지에 사용할 속성(예: `PersistentConnect` 또는 `LastWill`)을 지정할 수 있습니다. 자세한 내용은 [connectAttributes 사용](mqtt.md#connect-attribute) 단원을 참조하십시오.

다음 정책은 `PersistentConnect` 기능이 있는 연결을 허용합니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		}
	]
}
```

다음 정책에서는 `PersistentConnect`을(를) 허용하지 않고 다른 기능은 허용됩니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringNotEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		}
	]
}
```

위의 정책은 `StringEquals`을(를) 사용하여 표현할 수도 있습니다. 새 기능을 포함한 다른 모든 기능이 허용됩니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1"
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

다음 정책은 `PersistentConnect` 및 `LastWill` 둘 다에 의한 연결을 허용합니다. 다른 새로운 기능은 허용되지 않습니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect",
						"LastWill"
					]
				}
			}
		}
	]
}
```

다음 정책은 `LastWill`이(가) 있거나 없는 클라이언트에 의한 클린 연결을 허용합니다. 다른 기능은 허용되지 않습니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Effect": "Allow",
        "Action": [
            "iot:Connect"
        ],
        "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
        "Condition": {
            "StringEquals": {
                "iot:ConnectAttributes": "LastWill"
        }
        }
    }]
}
```

다음 정책은 기본 기능을 사용하는 연결만 허용합니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": []
				}
			}
		}
	]
}
```

다음 정책은 `PersistentConnect`이 있어야만 연결을 허용합니다. 연결에 `PersistentConnect`을(를) 사용하는 한 새로운 기능이 허용됩니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

다음 정책은 연결에 `PersistentConnect` 및 `LastWill` 두 가지가 모두 있어야 함을 나타냅니다. 새로운 기능은 허용되지 않습니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect",
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": []
				}
			}
		}
	]
}
```

다음 정책에는 `PersistentConnect`이(가) 없어야 하지만 `LastWill`은(는) 있을 수 있습니다. 다른 새로운 기능은 허용되지 않습니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "iot:ConnectAttributes": [
                        "LastWill"
                    ]
            }
        }
        }
    ]
}
```

다음 정책은 `"my/lastwill/topicName"` 주제와 관련된 `LastWill`이 있는 클라이언트에 의해서만 연결을 허용합니다. `LastWill` 주제를 사용하는 한 모든 기능이 허용됩니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ArnEquals": {
                "iot:LastWillTopic": "arn:aws:iot:us-east-1:123456789012:topic/my/lastwill/topicName"
            }
        }
        }
    ]
}
```

다음 정책은 특정 `LastWillTopic`을(를) 사용하는 클린 연결만 허용합니다. `LastWillTopic`을(를) 사용하는 한 모든 기능이 허용됩니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ArnEquals": {
                "iot:LastWillTopic": "arn:aws:iot:us-east-1:123456789012:topic/my/lastwill/topicName"
            }
        }
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

# 게시/구독 정책 예제
<a name="pub-sub-policy"></a>

사용하는 정책은 연결하는 방법에 따라 달라집니다 AWS IoT Core. MQTT 클라이언트, HTTP 또는 WebSocket을 사용하여 AWS IoT Core 에 연결할 수 있습니다. MQTT 클라이언트를 사용하여 연결하는 경우 X.509 인증서를 사용하여 인증합니다. HTTP 또는 WebSocket 프로토콜을 통해 연결하는 경우 서명 버전 4 및 Amazon Cognito를 사용하여 인증합니다.

**참고**  
등록된 디바이스의 경우 `Connect` 작업에 [사물 정책 변수](thing-policy-variables.md)를 사용하고 연결에 사용되는 보안 주체에 사물을 연결하는 것이 좋습니다.

**Topics**
+ [MQTT 및 AWS IoT Core 정책에서 와일드카드 문자 사용](#pub-sub-policy-cert)
+ [특정 주제에 대한 메시지 게시, 구독 및 수신 정책](#pub-sub-specific-topic)
+ [특정 접두사가 붙은 주제에 대한 메시지 게시, 구독 및 수신 정책](#pub-sub-policy-specific-topic-prefix)
+ [각 디바이스와 관련된 주제에 대한 메시지 게시, 구독 및 수신 정책](#pub-sub-specific-topic-device)
+ [주제 이름에 사물 속성이 포함된 주제에 대한 메시지 게시, 구독 및 수신 정책](#pub-sub-topic-attribute)
+ [주제 이름의 하위 주제에 대한 메시지 게시를 거부하는 정책](#pub-sub-deny-publish)
+ [주제 이름의 하위 주제에 대한 메시지 수신을 거부하는 정책](#pub-sub-deny-receive)
+ [MQTT 와일드카드 문자를 사용하여 주제를 구독하는 정책](#pub-sub-topic-wildcard)
+ [HTTP 및 WebSocket 클라이언트용 정책](#pub-sub-policy-cognito)

## MQTT 및 AWS IoT Core 정책에서 와일드카드 문자 사용
<a name="pub-sub-policy-cert"></a>

MQTT와 AWS IoT Core 정책은 와일드카드 문자가 다르므로 신중하게 고려한 후 선택해야 합니다. MQTT에서 와일드카드 문자 `+` 및 `#`는 [MQTT 주제 필터](https://docs.aws.amazon.com/iot/latest/developerguide/topics.html#topicfilters)에서 여러 주제 이름을 구독하는 데 사용됩니다. AWS IoT Core 정책은 `*` 및를 와일드카드 문자`?`로 사용하고 [IAM 정책의](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html#policies-grammar-json) 규칙을 따릅니다. 정책 문서에서 `*`는 문자 조합을 나타내고 `?`는 단일 문자를 나타냅니다. 정책 문서에서 MQTT 와일드카드 문자 `+` 및 `#`은 특별한 의미가 없는 문자로 취급됩니다. 정책의 `resource` 속성에서 여러 주제 이름과 주제 필터를 설명하려면 MQTT 와일드카드 문자 대신 `*` 및 `?` 와일드카드 문자를 사용하세요.

정책 문서에서 사용할 와일드카드 문자를 선택할 때는 `*` 문자가 하나의 주제 수준에 국한되지 않는다는 점을 고려하세요. `+` 문자는 MQTT 주제 필터에서 단일 주제 수준으로 제한됩니다. 와일드카드 사양을 단일 MQTT 주제 필터 수준으로 제한하려면 여러 개의 `?` 문자를 사용해 보세요. 정책 리소스에서 와일드카드 문자를 사용하는 방법과 와일드카드 문자가 무엇과 일치하는지에 대한 자세한 내용은 [리소스 ARN에서 와일드카드 사용](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_resource.html#reference_policies_elements_resource_wildcards)을 참조하세요.

아래 표는 MQTT 및 MQTT 클라이언트의 AWS IoT Core 정책에 사용되는 다양한 와일드카드 문자를 보여줍니다.


| 와일드카드 문자 | MQTT 와일드카드 문자입니까 | MQTT 예제 |  AWS IoT Core 정책 와일드카드 문자임 | MQTT 클라이언트 AWS IoT Core 정책 예제 | 
| --- | --- | --- | --- | --- | 
| \$1 | 예 | some/\$1 | 아니요 | 해당 사항 없음 | 
| \$1 | 예 | some/\$1/topic | 아니요 | 해당 사항 없음 | 
| \$1 | 아니요 | 해당 사항 없음 | 예 | `topicfilter/some/*/topic` `topicfilter/some/sensor*/topic`  | 
| ? | 아니요 | 해당 사항 없음 | 예 |  `topic/some/?????/topic` `topicfilter/some/sensor???/topic`  | 

## 특정 주제에 대한 메시지 게시, 구독 및 수신 정책
<a name="pub-sub-specific-topic"></a>

다음은 등록된 디바이스와 등록되지 않은 디바이스에서 'some\$1specific \$1topic'이라는 주제에 대해 메시지를 게시, 구독 및 수신하는 예를 보여줍니다. 또한 예제에서는 `Publish` 및 `Receive`가이 'topic'을 리소스로 사용하고 `Subscribe`가 topicfilter'를 리소스로 사용함을 강조합니다.

------
#### [ Registered devices ]

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 다음 정책은 디바이스가 레지스트리의 사물 이름과 일치하는 clientId에 연결하도록 허용합니다. 또한 'some\$1specific\$1topic'이라는 주제에 대한 `Publish`, `Subscribe` 및 `Receive` 권한을 제공합니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/some_specific_topic"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우 다음 정책은 디바이스가 clientId1, clientId2 또는 clientId3을 사용하여 연결하도록 허용합니다. 또한 'some\$1specific\$1topic'이라는 주제에 대한 `Publish`, `Subscribe` 및 `Receive` 권한을 제공합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/some_specific_topic"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
            ]
        }
    ]
}
```

------

## 특정 접두사가 붙은 주제에 대한 메시지 게시, 구독 및 수신 정책
<a name="pub-sub-policy-specific-topic-prefix"></a>

다음은 등록된 디바이스와 등록되지 않은 디바이스에서 'topic\$1prefix'라는 접두사가 붙은 주제에 대해 메시지를 게시, 구독 및 수신하는 예를 보여줍니다.

**참고**  
이 예제에서는 와일드카드 문자 `*`를 사용한다는 점에 유의하세요. `*`는 단일 명령문에서 여러 주제 이름에 대한 권한을 제공하는 데 유용하지만 디바이스에 필요한 것보다 더 많은 권한을 제공하여 의도하지 않은 결과를 초래할 수 있습니다. 따라서 와일드카드 문자 `*`는 신중하게 고려한 후에만 사용하는 것이 좋습니다.

------
#### [ Registered devices ]

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 다음 정책은 디바이스가 레지스트리의 사물 이름과 일치하는 clientId에 연결하도록 허용합니다. 또한 'topic\$1prefix' 접두사가 붙은 주제에 대한 `Publish`, `Subscribe` 및 `Receive` 권한을 제공합니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/topic_prefix*"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix*"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우 다음 정책은 디바이스가 clientId1, clientId2 또는 clientId3을 사용하여 연결하도록 허용합니다. 또한 'topic\$1prefix' 접두사가 붙은 주제에 대한 `Publish`, `Subscribe` 및 `Receive` 권한을 제공합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish",
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix*"
            ]
        }
    ]
}
```

------

## 각 디바이스와 관련된 주제에 대한 메시지 게시, 구독 및 수신 정책
<a name="pub-sub-specific-topic-device"></a>

다음은 등록된 디바이스와 등록되지 않은 디바이스에서 해당 디바이스와 관련된 주제에 대해 메시지를 게시, 구독 및 수신하는 예를 보여줍니다.

------
#### [ Registered devices ]

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 다음 정책은 디바이스가 레지스트리의 사물 이름과 일치하는 clientId에 연결하도록 허용합니다. 이 정책은 사물별 주제(`sensor/device/${iot:Connection.Thing.ThingName}`)에 게시하고 사물별 주제(`command/device/${iot:Connection.Thing.ThingName}`)를 구독 및 수신할 수 있는 권한을 제공합니다. 레지스트리의 사물 이름이 ‘thing1’인 경우 디바이스는 ‘sensor/device/thing1’ 주제에 게시할 수 있습니다. 또한 디바이스는 'command/device/thing1' 주제를 구독하고 수신할 수 있습니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/sensor/device/${iot:Connection.Thing.ThingName}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/command/device/${iot:Connection.Thing.ThingName}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/command/device/${iot:Connection.Thing.ThingName}"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우 다음 정책은 디바이스가 clientId1, clientId2 또는 clientId3을 사용하여 연결하도록 허용합니다. 이 정책은 클라이언트별 주제(`sensor/device/${iot:ClientId}`)에 게시하고 클라이언트별 주제(`command/device/${iot:ClientId}`)를 구독 및 수신할 수 있는 권한을 제공합니다. 디바이스가 clientId1으로 clientId와 연결되는 경우 'sensor/device/clientId1' 주제에 게시할 수 있습니다. 또한 디바이스는 `device/clientId1/command` 주제를 구독하고 수신할 수 있습니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/sensor/device/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/command/device/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/command/device/${iot:Connection.Thing.ThingName}"
            ]
        }
    ]
}
```

------

## 주제 이름에 사물 속성이 포함된 주제에 대한 메시지 게시, 구독 및 수신 정책
<a name="pub-sub-topic-attribute"></a>

다음은 등록된 디바이스에서 이름에 사물 속성이 포함된 주제를 게시, 구독 및 수신하는 예를 보여줍니다.

**참고**  
사물 속성은 AWS IoT Core 레지스트리에 등록된 디바이스에만 존재합니다. 등록되지 않은 디바이스에 해당하는 예제는 없습니다.

------
#### [ Registered devices ]

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 다음 정책은 디바이스가 레지스트리의 사물 이름과 일치하는 clientId에 연결하도록 허용합니다. 이 정책은 주제 이름에 사물 속성이 포함된 경우 주제(`sensor/${iot:Connection.Thing.Attributes[version]}`)에 게시하고 주제(`command/${iot:Connection.Thing.Attributes[location]}`)를 구독 및 수신할 수 있는 권한을 제공합니다. 레지스트리에 있는 사물 이름에 `version=v1` 및 `location=Seattle`이 있는 경우 디바이스는 'sensor/v1' 주제에 게시하고 'command/Seattle' 주제를 구독 및 수신할 수 있습니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/sensor/${iot:Connection.Thing.Attributes[version]}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/command/${iot:Connection.Thing.Attributes[location]}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/command/${iot:Connection.Thing.Attributes[location]}"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

사물 속성은 AWS IoT Core 의 레지스트리에 등록된 디바이스에만 존재하므로 등록되지 않은 사물에 해당하는 예제는 없습니다.

------

## 주제 이름의 하위 주제에 대한 메시지 게시를 거부하는 정책
<a name="pub-sub-deny-publish"></a>

다음은 등록된 디바이스와 등록되지 않은 디바이스에서 특정 하위 주제를 제외한 모든 주제에 메시지를 게시하는 예를 보여줍니다.

------
#### [ Registered devices ]

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 다음 정책은 디바이스가 레지스트리의 사물 이름과 일치하는 clientId에 연결하도록 허용합니다. 이 정책은 'department/' 접두사가 붙은 모든 주제에 게시할 수 있는 권한을 제공하지만 'department/admins' 하위 주제에 게시할 수 있는 권한은 제공하지 않습니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/department/*"
			]
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/department/admins"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우 다음 정책은 디바이스가 clientId1, clientId2 또는 clientId3을 사용하여 연결하도록 허용합니다. 이 정책은 'department/' 접두사가 붙은 모든 주제에 게시할 수 있는 권한을 제공하지만 'department/admins' 하위 주제에 게시할 수 있는 권한은 제공하지 않습니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/department/*"
            ]
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/department/admins"
            ]
        }
    ]
}
```

------

## 주제 이름의 하위 주제에 대한 메시지 수신을 거부하는 정책
<a name="pub-sub-deny-receive"></a>

다음은 등록된 디바이스와 등록되지 않은 디바이스에서 특정 하위 주제를 제외한 특정 접두사가 붙은 주제에 대해 메시지를 구독하고 수신하는 예를 보여줍니다.

------
#### [ Registered devices ]

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 다음 정책은 디바이스가 레지스트리의 사물 이름과 일치하는 clientId에 연결하도록 허용합니다. 이 정책은 디바이스가 'topic\$1prefix' 접두사가 붙은 모든 주제를 구독할 수 있도록 허용합니다. `iot:Receive` 명령문에서 `NotResource`를 사용하면 'topic\$1prefix/restricted' 접두사가 붙은 주제를 제외하고 디바이스가 구독한 모든 주제에서 메시지를 수신할 수 있습니다. 예를 들어, 이 정책에 따라 디바이스는 'topic\$1prefix/topic1' 및 'topic\$1prefix/restricted'를 구독할 수 있지만 'topic\$1prefix/topic1' 주제의 메시지만 수신하고 'topic\$1prefix/restricted' 주제의 메시지는 수신하지 않습니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix/*"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Receive",
			"NotResource": "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix/restricted/*"
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우 다음 정책은 디바이스가 clientId1, clientId2 또는 clientId3을 사용하여 연결하도록 허용합니다. 이 정책은 디바이스가 'topic\$1prefix' 접두사가 붙은 모든 주제를 구독할 수 있도록 허용합니다. `iot:Receive` 명령문에서 `NotResource`를 사용하면 'topic\$1prefix/restricted' 접두사가 붙은 주제를 제외하고 디바이스가 구독한 모든 주제에서 메시지를 수신할 수 있습니다. 예를 들어 이 정책을 사용하면 디바이스가 'topic\$1prefix/topic1'과 'topic\$1prefix/restricted'을 구독할 수 있습니다. 하지만 주제 'topic\$1prefix/topic1'에서는 메시지만 수신하고 주제 'topic\$1prefix/restricted'에서는 메시지를 수신하지 않습니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix/*"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Receive",
            "NotResource": "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix/restricted/*"
        }
    ]
}
```

------

## MQTT 와일드카드 문자를 사용하여 주제를 구독하는 정책
<a name="pub-sub-topic-wildcard"></a>

MQTT 와일드카드 문자 \$1 및 \$1은 리터럴 문자열로 처리되지만 AWS IoT Core 정책에서 사용할 때는 와일드카드로 처리되지 않습니다. MQTT에서 \$1 및 \$1은 주제 필터를 구독할 때만 와일드카드로 취급되고 다른 모든 컨텍스트에서는 리터럴 문자열로 취급됩니다. 이러한 MQTT 와일드카드는 신중하게 고려한 후에만 AWS IoT Core 정책의 일부로 사용하는 것이 좋습니다.

다음은 AWS IoT Core 정책에서 MQTT 와일드카드를 사용하는 등록된 사물과 등록되지 않은 사물의 예를 보여줍니다. 이러한 와일드카드는 리터럴 문자열로 취급됩니다.

------
#### [ Registered devices ]

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 다음 정책은 디바이스가 레지스트리의 사물 이름과 일치하는 clientId에 연결하도록 허용합니다. 이 정책은 디바이스가 'department/\$1/employees' 및 'location/\$1' 주제를 구독할 수 있도록 허용합니다. \$1 및 \$1은 AWS IoT Core 정책에서 리터럴 문자열로 취급되기 때문에 디바이스가 'department/\$1/employees' 주제를 구독할 수 있지만 'department/engineering/employees' 주제는 구독할 수 없습니다. 마찬가지로, 디바이스는 'location/\$1' 주제를 구독할 수 있지만 'location/Seattle' 주제는 구독할 수 없습니다. 그러나 디바이스가 'department/\$1/employees' 주제를 구독하면 정책에 따라 'department/engineering/employees' 주제에서 메시지를 수신할 수 있습니다. 마찬가지로, 디바이스가 'location/\$1' 주제를 구독하면 'location/Seattle' 주제에서도 메시지를 수신하게 됩니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/department/+/employees"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/location/#"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Receive",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topic/*"
		}
	]
}
```

------
#### [ Unregistered devices ]

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우 다음 정책은 디바이스가 clientId1, clientId2 또는 clientId3을 사용하여 연결하도록 허용합니다. 이 정책은 디바이스가 'department/\$1/employees' 및 'location/\$1' 주제를 구독할 수 있도록 허용합니다. \$1 및 \$1은 AWS IoT Core 정책에서 리터럴 문자열로 취급되기 때문에 디바이스가 'department/\$1/employees' 주제를 구독할 수 있지만 'department/engineering/employees' 주제는 구독할 수 없습니다. 마찬가지로, 디바이스는 'location/\$1' 주제를 구독할 수 있지만 'location/Seattle' 주제는 구독할 수 없습니다. 그러나 디바이스가 'department/\$1/employees' 주제를 구독하면 정책에 따라 'department/engineering/employees' 주제에서 메시지를 수신할 수 있습니다. 마찬가지로, 디바이스가 'location/\$1' 주제를 구독하면 'location/Seattle' 주제에서도 메시지를 수신하게 됩니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/department/+/employees"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/location/#"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Receive",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topic/*"
        }
    ]
}
```

------

## HTTP 및 WebSocket 클라이언트용 정책
<a name="pub-sub-policy-cognito"></a>

HTTP 또는 WebSocket 프로토콜을 통해 연결하는 경우 서명 버전 4 및 Amazon Cognito를 사용하여 인증합니다. Amazon Cognito 자격 증명은 인증되거나 인증되지 않을 수 있습니다. 인증된 자격 증명은 지원되는 자격 증명 공급자가 인증한 사용자를 위한 것이고, 인증되지 않은 자격 증명은 대개 자격 증명 공급자를 통해 인증하지 않는 게스트 사용자에 속합니다. Amazon Cognito는 인증되지 않은 자격 증명을 지원하는 고유한 식별자 및 AWS 자격 증명을 제공합니다. 자세한 내용은 [Amazon Cognito 자격 증명으로 권한 부여](cog-iot-policies.md) 단원을 참조하십시오.

다음 작업의 경우 `AttachPolicy` API를 통해 Amazon Cognito 자격 증명에 연결된 AWS IoT Core 정책을 AWS IoT Core 사용합니다. 이렇게 하면 인증된 자격 증명이 있는 Amazon Cognito ID 풀에 연결된 권한의 범위가 줄어듭니다.
+ `iot:Connect`
+ `iot:Publish`
+ `iot:Subscribe`
+ `iot:Receive`
+ `iot:GetThingShadow`
+ `iot:UpdateThingShadow`
+ `iot:DeleteThingShadow`

즉, Amazon Cognito 자격 증명에는 IAM 역할 정책 및 AWS IoT Core 정책의 권한이 필요합니다. `AttachPolicy` API를 통해 풀에 IAM 역할 정책을 연결하고 Amazon Cognito 자격 증명에 AWS IoT Core AWS IoT Core 정책을 연결합니다.

인증된 사용자와 인증되지 않은 사용자의 자격 증명 유형은 서로 다릅니다. Amazon Cognito 자격 증명에 AWS IoT 정책을 연결하지 않으면 인증된 사용자가에서 권한 부여에 실패 AWS IoT 하고 AWS IoT 리소스 및 작업에 액세스할 수 없습니다.

**참고**  
다른 AWS IoT Core 작업 또는 인증되지 않은 자격 증명의 경우 AWS IoT Core 는 Amazon Cognito 자격 증명 풀 역할에 연결된 권한의 범위를 좁히지 않습니다. 인증된 자격 증명과 인증되지 않은 자격 증명 모두에 대해 이 정책은 Amazon Cognito 풀 역할에 연결하도록 권장되는 가장 허용적인 정책입니다.

**HTTP**

인증되지 않은 Amazon Cognito 자격 증명이 Amazon Cognito 자격 증명별 주제에 HTTP를 통해 메시지를 게시하도록 허용하려면 Amazon Cognito 자격 증명 풀 역할에 다음 IAM 정책을 연결합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/${cognito-identity.amazonaws.com:sub}"
            ]
        }
    ]
}
```

인증된 사용자를 허용하려면 이전 정책을 Amazon Cognito 자격 증명 풀 역할과 AWS IoT Core [AttachPolicy](https://docs.aws.amazon.com//iot/latest/apireference/API_AttachPolicy.html) API를 사용하여 Amazon Cognito 자격 증명에 연결합니다.

**참고**  
Amazon Cognito 자격 증명을 승인할 때는 정책을 모두 AWS IoT Core 고려하고 지정된 최소 권한을 부여합니다. 두 정책이 모두 요청된 작업을 허용하는 경우에만 작업이 허용됩니다. 어느 한 정책이 작업을 허용하지 않을 경우 해당 작업은 승인되지 않습니다.

**MQTT**

인증되지 않은 Amazon Cognito 자격 증명이 사용자 계정의 Amazon Cognito 자격 증명별 주제에 WebSocket를 통해 MQTT 메시지를 게시하도록 허용하려면 Amazon Cognito 자격 증명 풀 역할에 다음 IAM 정책을 연결합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${cognito-identity.amazonaws.com:sub}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${cognito-identity.amazonaws.com:sub}"]
        }
    ]
}
```

인증된 사용자를 허용하려면 이전 정책을 Amazon Cognito 자격 증명 풀 역할과 AWS IoT Core [AttachPolicy](https://docs.aws.amazon.com//iot/latest/apireference/API_AttachPolicy.html) API를 사용하여 Amazon Cognito 자격 증명에 연결합니다.

**참고**  
Amazon Cognito 자격 증명을 승인할 때 AWS IoT Core 는 지정된 최소 권한을 고려하고 부여합니다. 두 정책이 모두 요청된 작업을 허용하는 경우에만 작업이 허용됩니다. 어느 한 정책이 작업을 허용하지 않을 경우 해당 작업은 승인되지 않습니다.

# 연결 및 게시 정책 예제
<a name="connect-and-pub"></a>

 AWS IoT Core 레지스트리에 사물로 등록된 디바이스의 경우 다음 정책은 사물 이름과 일치하는 클라이언트 ID AWS IoT Core 를 사용하여에 연결할 수 있는 권한을 부여하고 디바이스가 클라이언트 ID 또는 사물 이름별 MQTT 주제에 게시하도록 제한합니다. 연결이 성공하려면 사물 이름을 AWS IoT Core 레지스트리에 등록하고 사물에 연결된 자격 증명 또는 보안 주체를 사용하여 인증해야 합니다.

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.ThingName}"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
      ]
    }
  ]
}
```

 AWS IoT Core 레지스트리에 사물로 등록되지 않은 디바이스의 경우 다음 정책은 클라이언트 ID로에 연결할 수 AWS IoT Core 있는 권한을 부여`client1`하고 디바이스가 clientID별 MQTT 주제에 게시하도록 제한합니다.

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:client/client1"
      ]
    }
  ]
}
```

# 보관된 메시지 정책 예
<a name="retained-message-policy-examples"></a>

[보관된 메시지](mqtt.md#mqtt-retain)를 사용하려면 특정 정책이 필요합니다. 보관된 메시지는 RETAIN 플래그가 설정되고에 의해 저장된 MQTT 메시지입니다 AWS IoT Core. 이 섹션에서는 보관된 메시지의 일반적인 사용을 허용하는 정책의 예를 보여줍니다.

**Topics**
+ [보관된 메시지를 연결하고 게시하는 정책](#retained-message-policy-examples-publish)
+ [보관된 Will 메시지를 연결하고 게시하는 정책](#retained-message-policy-examples-publish-lwt)
+ [보관된 메시지를 나열하고 가져오는 정책](#retained-message-policy-examples-list-get)

## 보관된 메시지를 연결하고 게시하는 정책
<a name="retained-message-policy-examples-publish"></a>

디바이스에서 보관된 메시지를 게시하려면 디바이스가 MQTT 보관된 메시지를 연결하고 게시할 수 있어야 합니다. 다음 정책은 주제에 대해 이러한 권한을 부여합니다(클라이언트 **device1**에 대한 `device/sample/configuration`). 연결 권한을 부여하는 다른 예는 [연결 및 게시 정책 예제](connect-and-pub.md) 섹션을 참조하세요.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/device1"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:RetainPublish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/device/sample/configuration"
			]
		}
	]
}
```

## 보관된 Will 메시지를 연결하고 게시하는 정책
<a name="retained-message-policy-examples-publish-lwt"></a>

클라이언트는 클라이언트가 예기치 않게 연결 해제될 때 게시 AWS IoT Core 할 메시지를 구성할 수 있습니다. MQTT는 이러한 메시지를 [*Will* 메시지](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html#_Will_Flag)라고 합니다. Will 메시지를 포함하려면 클라이언트의 연결 권한에 조건이 더 추가되어야 합니다.

다음 정책 문서는 AWS IoT Core 도 보관하는 `will`이라는 주제로 식별되는 Will 메시지를 연결하고 게시할 수 있는 권한을 모든 클라이언트에게 부여합니다.

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/device1"
			],
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:RetainPublish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/will"
			]
		}
	]
}
```

## 보관된 메시지를 나열하고 가져오는 정책
<a name="retained-message-policy-examples-list-get"></a>

서비스 및 애플리케이션은 [https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_ListRetainedMessages.html](https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_ListRetainedMessages.html) 및 [https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_GetRetainedMessage.html](https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_GetRetainedMessage.html)를 호출하여 MQTT 클라이언트를 지원할 필요 없이 보관된 메시지에 액세스할 수 있습니다. 이러한 작업을 호출하는 서비스 및 애플리케이션은 다음 예와 같은 정책을 사용하여 권한이 부여되어야 합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:ListRetainedMessages"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/device1"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:GetRetainedMessage"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/foo"
            ]
        }
    ]
}
```

# 인증서 정책 예제
<a name="certificate-policy-examples"></a>

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우, 다음 정책은 사물 이름과 일치하는 클라이언트 ID AWS IoT Core 로에 연결하고 디바이스가 자체 인증에 사용한 인증서`certificateId`의와 이름이 동일한 주제에 게시할 수 있는 권한을 부여합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:CertificateId}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        }
    ]
}
```

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우 다음 정책은 클라이언트 IDs, , `client2` `client3` 및 AWS IoT Core 를 사용하여 `client1`에 연결하고 디바이스가 자체 인증에 사용한 인증서`certificateId`의와 이름이 동일한 주제에 게시할 수 있는 권한을 부여합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:CertificateId}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        }
    ]
}
```

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 다음 정책은 사물 이름과 일치하는 클라이언트 ID AWS IoT Core 로에 연결하고 디바이스가 자체 인증에 사용한 인증서의 제목 `CommonName` 필드와 이름이 동일한 주제에 게시할 수 있는 권한을 부여합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.CommonName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        }
    ]
}
```

**참고**  
이 예에서는 인증서 제목 공통 이름이 주제 식별자로 사용되고, 주제 공통 이름이 등록된 인증서마다 고유하다고 가정합니다. 인증서를 여러 디바이스에서 공유하는 경우, 제목 공통 이름은 이 인증서를 공유하는 모든 디바이스에서 동일하므로, 여러 디바이스에서 동일한 주제에 게시 권한을 허용하게 됩니다(권장되지 않음).

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우 다음 정책은 클라이언트 IDs, , `client2`및 AWS IoT Core 를 사용하여 `client1`에 연결하고 디바이스가 자체 인증에 사용한 인증서의 제목 `CommonName` 필드`client3`와 이름이 동일한 주제에 게시할 수 있는 권한을 부여합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.CommonName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        }
    ]
}
```

**참고**  
이 예에서는 인증서 제목 공통 이름이 주제 식별자로 사용되고, 주제 공통 이름이 등록된 인증서마다 고유하다고 가정합니다. 인증서를 여러 디바이스에서 공유하는 경우, 제목 공통 이름은 이 인증서를 공유하는 모든 디바이스에서 동일하므로, 여러 디바이스에서 동일한 주제에 게시 권한을 허용하게 됩니다(권장되지 않음).

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 다음 정책은 사물 이름과 일치하는 클라이언트 ID AWS IoT Core 로에 연결하고 디바이스를 인증하는 데 사용된 인증서의 `Subject.CommonName.2` 필드가 로 설정된 `admin/` 경우 이름이 접두사로 지정된 주제에 게시할 수 있는 권한을 부여합니다. `Administrator` 

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/*"],
            "Condition": {
                "StringEquals": {
                    "iot:Certificate.Subject.CommonName.2": "Administrator"
            }
        }
        }
    ]
}
```

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우, 다음 정책은 클라이언트 IDs `client1`, `client2` `client3` 및 AWS IoT Core 를 사용하여에 연결하고 디바이스를 인증하는 데 사용된 인증서의 `Subject.CommonName.2` 필드가 로 설정된 `admin/` 경우 이름이 접두사인 주제에 게시할 수 있는 권한을 부여합니다. `Administrator` 

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/*"],
            "Condition": {
                "StringEquals": {
                    "iot:Certificate.Subject.CommonName.2": "Administrator"
            }
        }
        }
    ]
}
```

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 `Administrator`다음 정책은 디바이스 인증에 사용된 인증서에 `Subject.CommonName` 필드 중 하나가 로 설정된 `ThingName` 경우 디바이스가 사물 이름을 사용하여 `admin/` 로 구성된 특정 주제에 게시할 수 있도록 허용합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/${iot:Connection.Thing.ThingName}"],
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:Certificate.Subject.CommonName.List": "Administrator"
            }
        }
        }
    ]
}
```

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우, 다음 정책은 디바이스를 인증하는 데 사용되는 인증서에 `Subject.CommonName` 필드 중 하나가 AWS IoT Core 로 설정된 `admin` 경우 클라이언트 IDs `client1`, `client2` `client3` 및를 사용하여에 연결하고 주제에 게시할 수 있는 권한을 부여합니다. `Administrator` 

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin"],
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:Certificate.Subject.CommonName.List": "Administrator"
            }
        }
        }
    ]
}
```

# 사물 정책 예제
<a name="thing-policy-examples"></a>

다음 정책은를 인증하는 데 사용되는 인증서 AWS IoT Core 가 정책이 평가되는 사물에 연결된 경우 디바이스가 연결되도록 허용합니다.

****  

```
{  
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {  
            "Effect":"Allow",
            "Action":["iot:Connect"],
            "Resource":[ "*" ],
            "Condition": {
                "Bool": {
                    "iot:Connection.Thing.IsAttached": ["true"]
            }
        }
        }
    ]
}
```

다음 정책은 인증서가 특정 사물 유형의 사물에 연결되어 있고 사물에 값 `attributeValue`가 있는 `attributeName`의 속성이 있는 경우 디바이스가 게시할 수 있도록 허용합니다. 사물 정책 변수에 대한 자세한 내용은 [사물 정책 변수](thing-policy-variables.md)를 참조하세요.

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": "arn:aws:iot:us-east-1:123456789012:topic/device/stats",
      "Condition": {
        "StringEquals": {
          "iot:Connection.Thing.Attributes[attributeName]": "attributeValue",
          "iot:Connection.Thing.ThingTypeName": "Thing_Type_Name"
        },
        "Bool": {
          "iot:Connection.Thing.IsAttached": "true"
        }
      }
    }
  ]
}
```

다음 정책은 디바이스가 사물의 속성으로 시작하는 주제에 게시할 수 있도록 허용합니다. 디바이스 인증서가 사물과 연결되어 있지 않으면 이 변수가 해결되지 않고 액세스 거부 오류가 발생합니다. 사물 정책 변수에 대한 자세한 내용은 [사물 정책 변수](thing-policy-variables.md)를 참조하세요.

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.Attributes[attributeName]}/*"
    }
  ]
}
```

# 기본 작업 정책 예제
<a name="basic-jobs-example"></a>

이 샘플은 단일 디바이스인 작업 대상이 작업 요청을 수신하고 AWS IoT로 작업 실행 상태를 전달하기 위해 필요한 정책 문을 보여줍니다.

*us-west-2:57EXAMPLE833*을 AWS 리전, 콜론 문자(:) 및 12자리 AWS 계정 숫자로 바꾼 다음 *uniqueThingName*을 디바이스를 나타내는 사물 리소스의 이름으로 바꿉니다 AWS IoT.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:client/uniqueThingName"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/test/dc/pubtopic",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/job/*",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topicfilter/test/dc/subtopic",
                "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/events/jobExecution/*",
                "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/test/dc/subtopic",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iotjobsdata:DescribeJobExecution",
                "iotjobsdata:GetPendingJobExecutions",
                "iotjobsdata:StartNextPendingJobExecution",
                "iotjobsdata:UpdateJobExecution"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName"
            ]
        }
    ]
}
```

# Amazon Cognito 자격 증명으로 권한 부여
<a name="cog-iot-policies"></a>

Amazon Cognito 자격 증명에는 인증된 자격 증명과 인증되지 않은 자격 증명이라는 두 가지 유형이 있습니다. 앱이 인증되지 않은 Amazon Cognito 자격 증명을 지원하는 경우 인증이 수행되지 않으므로 사용자가 누구인지 알 수 없습니다.

**인증되지 않은 자격 증명:** 인증되지 않은 Amazon Cognito 자격 증명의 경우 인증되지 않은 자격 증명 풀에 IAM 역할을 연결하여 권한을 부여합니다. 알 수 없는 사용자가 사용할 수 있도록 하려는 리소스에 대해서만 액세스 권한을 부여하는 것이 좋습니다.

**중요**  
에 연결하는 인증되지 않은 Amazon Cognito 사용자의 경우 IAM 정책에서 매우 제한된 리소스에 대한 액세스 권한을 부여하는 AWS IoT Core것이 좋습니다.

**인증된 자격 증명:** 인증된 Amazon Cognito 자격 증명의 경우 다음 두 곳에서 권한을 지정해야 합니다.
+ 인증된 Amazon Cognito 자격 증명 풀에 IAM 정책을 연결합니다.
+ Amazon Cognito 자격 증명(인증된 사용자)에 AWS IoT Core 정책을 연결합니다.

## 에 연결하는 미인증 및 인증된 Amazon Cognito 사용자에 대한 정책 예제 AWS IoT Core
<a name="cog-iot-policies-auth-unauth-examples"></a>

다음 예제는 Amazon Cognito 자격 증명의 IAM 정책과 IoT 정책에 있는 권한을 보여줍니다. 인증된 사용자가 디바이스별 주제(예: device/DEVICE\$1ID/status)에 게시하려고 합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/Client_ID"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/device/Device_ID/status"
            ]
        }
    ]
}
```

다음 예제는 인증되지 않은 Amazon Cognito 역할의 IAM 정책에 있는 권한을 보여줍니다. 인증되지 않은 사용자가 인증이 필요 없는 디바이스별 주제 이외의 주제에 게시하려고 합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/non_device_specific_topic"
            ]
        }
    ]
}
```

## GitHub 예제
<a name="cog-iot-policies-github"></a>

GitHub의 다음 예제 웹 애플리케이션은 인증된 사용자에 대한 정책 연결을 사용자 가입 및 인증 프로세스에 통합하는 방법을 보여줍니다.
+ [AWS Amplify 및를 사용한 MQTT React 웹 애플리케이션 게시/구독 AWS IoT Device SDK for JavaScript](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-cp)
+ [MQTT 게시/구독 AWS AmplifyAWS IoT Device SDK for JavaScript, 및 Lambda 함수를 사용한 React 웹 애플리케이션](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-lambda)

Amplify는 서비스와 통합되는 웹 및 모바일 애플리케이션을 구축하는 데 도움이 되는 도구 및 AWS 서비스 세트입니다. Amplify에 대한 자세한 내용은 [Amplify 프레임워크 설명서](https://docs.amplify.aws/)를 참조하세요.

두 예 모두 다음 단계를 수행합니다.

1. 사용자가 계정에 가입하면 애플리케이션에서 Amazon Cognito 사용자 풀과 자격 증명을 생성합니다.

1. 사용자가 인증하면 애플리케이션이 정책을 생성하여 자격 증명에 연결합니다. 이렇게 하면 사용자에게 게시 및 구독 권한이 부여됩니다.

1. 사용자는 애플리케이션을 사용하여 MQTT 주제를 게시하고 구독할 수 있습니다.

첫 번째 예는 인증 작업 내에서 직접 `AttachPolicy` API 작업을 사용합니다. 다음 예에서는 Amplify와 AWS IoT Device SDK for JavaScript를 사용하는 React 웹 애플리케이션 내에서 이 API 호출을 구현하는 방법을 보여줍니다.

```
function attachPolicy(id, policyName) {
    var Iot = new AWS.Iot({region: AWSConfiguration.region, apiVersion: AWSConfiguration.apiVersion, endpoint: AWSConfiguration.endpoint});
    var params = {policyName: policyName, target: id};

    console.log("Attach IoT Policy: " + policyName + " with cognito identity id: " + id);
    Iot.attachPolicy(params, function(err, data) {
         if (err) {
               if (err.code !== 'ResourceAlreadyExistsException') {
                  console.log(err);
               }
          }
         else  {
            console.log("Successfully attached policy with the identity", data);
         }
     });
}
```

이 코드는 [AuthDisplay.js](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-cp/blob/d1c307b36357be934db9dda020140fa337709cd9/src/AuthDisplay.js#L45) 파일에 나타납니다.

두 번째 예는 Lambda 함수에서 `AttachPolicy` API 작업을 구현합니다. 다음 예에서는 Lambda가 이 API 호출을 사용하는 방법을 보여줍니다.

```
iot.attachPolicy(params, function(err, data) {
     if (err) {
           if (err.code !== 'ResourceAlreadyExistsException') {
              console.log(err);
              res.json({error: err, url: req.url, body: req.body});
           }
      }
     else  {
        console.log(data);
        res.json({success: 'Create and attach policy call succeed!', url: req.url, body: req.body});
     }
 });
```

이 코드는 [app.js](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-lambda/blob/e493039581d2aff0faa3949086deead20a2c5385/amplify/backend/function/amplifyiotlambda/src/app.js#L50) 파일의 `iot.GetPolicy` 함수 안에 나타납니다.

**참고**  
Amazon Cognito 자격 증명 풀을 통해 얻은 AWS 자격 증명으로 함수를 호출하면 Lambda 함수의 컨텍스트 객체에에 대한 값이 포함됩니다`context.cognito_identity_id`. 자세한 내용은 다음을 참조하세요.  
[AWS Lambda Node.js의 컨텍스트 객체](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html)
[AWS Lambda Python의 컨텍스트 객체](https://docs.aws.amazon.com/lambda/latest/dg/python-context.html)
[AWS Lambda Ruby의 컨텍스트 객체](https://docs.aws.amazon.com/lambda/latest/dg/ruby-context.html)
[AWS Lambda Java의 컨텍스트 객체](https://docs.aws.amazon.com/lambda/latest/dg/java-context.html)
[AWS Lambda Go의 컨텍스트 객체](https://docs.aws.amazon.com/lambda/latest/dg/golang-context.html)
[AWS Lambda C\$1의 컨텍스트 객체](https://docs.aws.amazon.com/lambda/latest/dg/csharp-context.html)
[AWS Lambda PowerShell의 컨텍스트 객체](https://docs.aws.amazon.com/lambda/latest/dg/powershell-context.html)

# AWS IoT Core 자격 증명 공급자를 사용하여 AWS 서비스에 대한 직접 호출 권한 부여
<a name="authorizing-direct-aws"></a>

디바이스는 X.509 인증서를 사용하여 TLS 상호 인증 프로토콜을 AWS IoT Core 사용하여에 연결할 수 있습니다. 다른 AWS 서비스는 인증서 기반 인증을 지원하지 않지만 [AWS 서명 버전 4 형식](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)의 AWS 자격 증명을 사용하여 호출할 수 있습니다. [서명 버전 4 알고리즘](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)에서는 일반적으로 호출자에게 액세스 키 ID와 보안 액세스 키를 요구합니다. AWS IoT Core 에는 기본 제공 [X.509 인증서를](x509-client-certs.html) 고유한 디바이스 자격 증명으로 사용하여 AWS 요청을 인증할 수 있는 자격 증명 공급자가 있습니다. 따라서 디바이스에 액세스 키 ID와 보안 액세스 키를 저장할 필요가 없습니다.

이 자격 증명 공급자는 X.509 인증서를 사용하여 호출자를 인증한 후 권한이 제한된 임시 보안 토큰을 발급합니다. 토큰을 사용하여 AWS 요청에 서명하고 인증할 수 있습니다. 이렇게 AWS 요청을 인증하려면 [AWS Identity and Access Management (IAM) 역할을](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles.html) 생성 및 구성하고 자격 증명 공급자가 사용자를 대신하여 역할을 수임할 수 있도록 역할에 적절한 IAM 정책을 연결해야 합니다. AWS IoT Core 및 IAM 에 대한 자세한 내용은 [에 대한 자격 증명 및 액세스 관리 AWS IoT](security-iam.md) 단원을 참조하세요.

 AWS IoT 에서는 디바이스가 [전송 계층 보안(TLS) 프로토콜로 SNI(Server Name Indication) 확장](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)을 전송하고 `host_name` 필드에 전체 엔드포인트 주소를 제공해야 합니다. `host_name` 필드에는 호출하는 엔드포인트가 포함되어야 하며 다음과 같아야 합니다.
+ `aws iot [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) --endpoint-type iot:CredentialProvider`에서 반환한 `endpointAddress`

올바른 `host_name` 값 없이 디바이스에서 시도하는 연결은 실패합니다.

다음 다이어그램은 자격 증명 공급자의 워크플로우를 보여줍니다.

![\[AWS IoT Core 자격 증명 공급자 워크플로.\]](http://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/images/credentials-provider-diagram.png)


1.  AWS IoT Core 디바이스는 보안 토큰에 대해 자격 증명 공급자에게 HTTPS 요청을 합니다. 이 요청에는 인증을 위한 디바이스 X.509 인증서가 포함되어 있습니다.

1. 자격 증명 공급자는 AWS IoT Core 인증 및 권한 부여 모듈에 요청을 전달하여 인증서를 검증하고 디바이스에 보안 토큰을 요청할 권한이 있는지 확인합니다.

1. 인증서가 유효하고 보안 토큰을 요청할 권한이 있는 경우 AWS IoT Core 인증 및 권한 부여 모듈은 성공을 반환합니다. 그렇지 않은 경우, 디바이스에 예외를 전송합니다.

1. 인증서 검증에 성공하고 나면 자격 증명 공급자가 [AWS Security Token Service (AWS STS)](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html)을(를) 호출하여 사용자가 생성한 IAM 역할을 수임합니다.

1. AWS STS 는 권한이 제한된 임시 보안 토큰을 자격 증명 공급자에게 반환합니다.

1. 자격 증명 공급자가 이 보안 토큰을 디바이스로 반환합니다.

1. 디바이스는 보안 토큰을 사용하여 서명 버전 4로 AWS AWS 요청에 서명합니다.

1. 요청된 서비스가 서명을 검증하고 사용자가 자격 증명 공급자를 위해 생성한 IAM 역할에 연결된 액세스 정책들에 대한 요청에 권한을 부여하기 위해 IAM을 호출합니다.

1. IAM이 서명을 성공적으로 검증하고 요청에 권한을 부여하면 요청은 성공합니다. 그렇지 않은 경우, IAM이 예외를 전송합니다.

다음 단원에서는 인증서를 사용하여 보안 토큰을 얻는 방법을 설명합니다. 이 단원은 사용자가 이미 [디바이스를 등록](register-device.html)했고 이 디바이스에 [사용자의 인증서를 생성하여 활성화](device-certs-your-own.html)했다는 가정하에 작성되었습니다.

## 인증서를 사용하여 보안 토큰을 얻는 방법
<a name="authorizing-direct-aws.walkthrough"></a>

1. 자격 증명 공급자가 사용자의 디바이스를 대신하여 수임하는 IAM 역할을 구성합니다. 다음 신뢰 정책을 역할에 연결합니다.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": {"Service": "credentials.iot.amazonaws.com"},
           "Action": "sts:AssumeRole"
       }
   }
   ```

   호출하려는 각 AWS 서비스에 대해 액세스 정책을 역할에 연결합니다. 자격 증명 공급자는 다음과 같은 정책 변수를 지원합니다.
   + `credentials-iot:ThingName`
   + `credentials-iot:ThingTypeName`
   + `credentials-iot:AwsCertificateId`

   디바이스가 AWS 서비스에 대한 요청에서 사물 이름을 제시하는 경우, 자격 증명 공급자가 보안 토큰에 `credentials-iot:ThingName` 및 `credentials-iot:ThingTypeName`을(를) context 변수로 추가합니다. 디바이스가 요청에 사물 이름을 제시하지 않더라도 자격 증명 공급자는 context 변수로 `credentials-iot:AwsCertificateId`를 제공합니다. `x-amzn-iot-thingname` HTTP 요청 헤더의 값으로 그 사물 이름을 전달하세요.

   이 세 가지 변수는 AWS IoT Core 정책이 아니라 IAM 정책을 위해서만 작동합니다.

1. 다음 단계(역할 별칭 생성)를 수행하는 사용자가 새로 생성된 역할을 AWS IoT Core로 전달할 권한을 가지고 있는지 확인합니다. 다음 정책은 AWS 사용자에게 `iam:GetRole` 및 `iam:PassRole` 권한을 모두 부여합니다. `iam:GetRole` 권한은 방금 생성한 역할에 대한 정보를 사용자가 가져올 수 있도록 허용합니다. `iam:PassRole` 권한을 통해 사용자는 역할을 다른 AWS 서비스에 전달할 수 있습니다.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": [
               "iam:GetRole",
               "iam:PassRole"
           ],
           "Resource": "arn:aws:iam::123456789012:role/your role name"
       }
   }
   ```

1.  AWS IoT Core 역할 별칭을 생성합니다. AWS 서비스에 직접 호출할 디바이스는에 연결할 때 사용할 역할 ARN을 알아야 합니다 AWS IoT Core. 역할 ARN을 하드 코딩하면 역할 ARN이 바뀔 때마다 디바이스를 업데이트해야 하기 때문에 이것은 좋은 방법이 아닙니다. `CreateRoleAlias` API를 사용하여 역할 ARN을 가리키는 역할 별칭을 생성하는 것이 더 바람직합니다. 역할 ARN이 바뀔 경우 그 역할 별칭을 업데이트하면 됩니다. 디바이스에 어떤 변경도 할 필요가 없습니다. 이 API에서 사용하는 파라미터는 다음과 같습니다.  
`roleAlias`  
필수 사항입니다. 역할 별칭을 식별하는 임의 문자열입니다. 이것은 역할 별칭 데이터 모델에서 기본 키 역할을 합니다. 1-128자 길이이며 영숫자와 =, @, - 기호만 사용해야 합니다. 알파벳 대문자와 소문자가 허용됩니다. 역할 별칭은 대/소문자를 구분합니다.  
`roleArn`  
필수 사항입니다. 역할 별칭이 가리키는 역할의 ARN입니다.  
`credentialDurationSeconds`  
선택 사항. 자격 증명의 유효 시간(초)입니다. 최소값은 900초(15분)입니다. 최대값은 43,200초(12시간)입니다. 기본 값은 3,600초(1시간)입니다.  
 AWS IoT Core 자격 증명 공급자는 최대 수명이 43,200초(12시간)인 자격 증명을 발급할 수 있습니다. 자격 증명이 최대 12시간 동안 유효하면 자격 증명을 더 오래 캐싱하여 자격 증명 공급자에 대한 호출 횟수를 줄일 수 있습니다.  
`credentialDurationSeconds` 값은 역할 별칭이 참조하는 IAM 역할의 최대 세션 기간보다 작거나 같아야 합니다. 자세한 내용은 Identity and Access Management 사용 설명서의 [ 역할 최대 세션 기간(AWS API) 수정](https://docs.aws.amazon.com//IAM/latest/UserGuide/roles-managingrole-editing-api.html#roles-modify_max-session-duration-api)을 AWS 참조하세요.

   이 API에 대한 자세한 내용은 [CreateRoleAlias](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateRoleAlias.html) 단원을 참조하세요.

1. 디바이스 인증서에 정책을 연결합니다. 디바이스 인증서에 연결된 정책은 역할을 위임할 수 있는 디바이스 권한을 부여해야 합니다. 다음의 예와 같이 역할 별칭에 `iot:AssumeRoleWithCertificate` 작업 권한을 부여하면 됩니다.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "iot:AssumeRoleWithCertificate",
               "Resource": "arn:aws:iot:us-east-1:123456789012:rolealias/your role alias"
           }
       ]
   }
   ```

1. 자격 증명 공급자에게 HTTPS 요청을 하여 보안 토큰을 얻습니다. 다음 정보를 제공합니다.
   + *Certificate*: 이 요청은 TLS 상호 인증을 통한 HTTP 요청이므로 이 요청 중에 인증서와 프라이빗 키를 클라이언트에 제공해야 합니다. 인증서를 등록할 때 사용한 것과 동일한 인증서와 프라이빗 키를 사용합니다 AWS IoT Core.

     디바이스가와 통신하고 있는지( AWS IoT Core 가장 가장하는 서비스가 아님) 확인하려면 [서버 인증을](x509-client-certs.html#server-authentication) 참조하고 링크를 따라 적절한 CA 인증서를 다운로드한 다음 디바이스에 복사합니다.
   + *RoleAlias*: 자격 증명 공급자를 위해 생성한 역할 별칭의 이름입니다. 역할 별칭 이름은 대/소문자를 구분하며 생성된 역할 별칭과 일치해야 합니다 AWS IoT Core.
   + *ThingName*: 사물을 등록할 때 생성한 AWS IoT Core 사물 이름입니다. 이것은 `x-amzn-iot-thingname` HTTP 헤더의 값으로 전달됩니다. 이 값은 AWS IoT Core 또는 IAM 정책에서 사물 속성을 정책 변수로 사용하는 경우에만 필요합니다.
**참고**  
`x-amzn-iot-thingname`에서 제공한 *ThingName*은 인증서에 할당된 AWS IoT 사물 리소스의 이름과 일치해야 합니다. 일치하지 않으면 403 오류가 반환됩니다.

   에서 다음 명령을 실행 AWS CLI 하여에 대한 자격 증명 공급자 엔드포인트를 가져옵니다 AWS 계정. 이 API에 대한 자세한 내용은 [DescribeEndpoint](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeEndpoint.html) 단원을 참조하세요. FIPS 지원 엔드포인트는 [AWS IoT Core- 자격 증명 공급자 엔드포인트](iot-connect-fips.md#iot-connect-fips-credential) 섹션을 참조하세요.

   ```
   aws iot describe-endpoint --endpoint-type iot:CredentialProvider
   ```

   다음 JSON 객체는 **describe-endpoint** 명령의 샘플 출력입니다. 여기에는 보안 토큰을 요청하기 위해 사용하는 `endpointAddress`가 포함되어 있습니다.

   ```
   {
       "endpointAddress": "your_aws_account_specific_prefix.credentials.iot.your region.amazonaws.com"
   }
   ```

   이 엔드포인트를 사용하여 HTTPS 요청을 통해 자격 증명 공급자에게 보안 토큰을 반환하라고 요청합니다. 다음 예제 명령은 `curl`을 사용하지만 모든 HTTP 클라이언트를 사용할 수 있습니다.
**참고**  
*roleAlias* 이름은 대/소문자를 구분하며 생성된 역할 별칭과 일치해야 합니다 AWS IoT.

   ```
   curl --cert your certificate --key your private key -H "x-amzn-iot-thingname: your thing name" --cacert AmazonRootCA1.pem https://your endpoint /role-aliases/your role alias/credentials
   ```

   이 명령은 `accessKeyId`, `secretAccessKey`, `sessionToken`, 그리고 만료를 포함하는 보안 토큰 객체를 반환합니다. 다음 JSON 객체는 `curl` 명령의 샘플 출력입니다.

   ```
       {"credentials":{"accessKeyId":"access key","secretAccessKey":"secret access key","sessionToken":"session token","expiration":"2018-01-18T09:18:06Z"}}
   ```

   그런 다음 `accessKeyId`, `secretAccessKey`및 `sessionToken` 값을 사용하여 AWS 서비스에 대한 요청에 서명할 수 있습니다. end-to-end 데모는 *AWS 보안 블로그*[의 자격 AWS 증명 공급자 블로그 게시물을 사용하여 디바이스에서 하드 코딩된 AWS IoT 자격 증명의 필요성을 제거하는 방법을](https://aws.amazon.com/blogs/security/how-to-eliminate-the-need-for-hardcoded-aws-credentials-in-devices-by-using-the-aws-iot-credentials-provider/) 참조하세요.

# IAM을 통한 교차 계정 액세스
<a name="cross-account-access"></a>

AWS IoT Core 를 사용하면 보안 주체가 소유 AWS 계정 하지 않은에 정의된 주제를 게시하거나 구독할 수 있습니다. 교차 계정 액세스는 IAM 정책 및 IAM 역할을 생성하고 정책을 역할에 연결하여 구성합니다.

먼저 AWS 계정에서 여러 사용자 및 인증서를 생성했을 때와 마찬가지로, [IAM 정책 생성](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_create.html)에 설명된 대로 고객 관리형 IAM 정책을 생성합니다.

 AWS IoT Core 레지스트리에 등록된 디바이스의 경우 다음 정책은 디바이스의 사물 이름과 일치하는 클라이언트 ID를 AWS IoT Core 사용하여 디바이스에 연결하고 *사물 이름이* 디바이스의 사물 이름인에 게시할 수 `my/topic/thing-name ` 있는 권한을 디바이스에 부여합니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:Connection.Thing.ThingName}"
            ]
        }
    ]
}
```

 AWS IoT Core 레지스트리에 등록되지 않은 디바이스의 경우 다음 정책은 디바이스에 계정의 (123456789012) AWS IoT Core 레지스트리에 `client1` 등록된 사물 이름을 사용하여에 연결하고 이름이 접두사가 인 클라이언트 ID별 주제에 게시 AWS IoT Core 할 수 있는 권한을 부여합니다. `my/topic/` 

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}"
            ]
        }
    ]
}
```

다음으로 [역할을 생성하여 IAM 사용자에게 권한 위임](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)의 단계를 따릅니다. 액세스를 공유하려는 AWS 계정 의 계정 ID를 입력합니다. 마지막 단계로 방금 생성한 정책을 역할에 연결합니다. 나중에 액세스를 부여한 AWS 계정 ID를 수정해야 할 경우 다음의 신뢰 정책 형식을 사용할 수 있습니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::567890123456:user/MyUser"
        },
            "Action": "sts:AssumeRole"
        }
    ]
}
```