

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

# Amazon Cognito 자격 증명으로 권한 부여


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


다음 예제는 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 예제


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)