

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

# 역할 기반 액세스 제어 사용
<a name="role-based-access-control"></a>

Amazon Cognito 자격 증명 풀은 인증된 사용자에게 AWS 리소스에 액세스할 수 있는 권한이 제한된 임시 자격 증명 세트를 할당합니다. 각 사용자의 권한은 생성하는 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)을 통해 제어됩니다. 사용자의 ID 토큰에 있는 클레임에 따라 각 사용자의 역할을 선택하는 규칙을 정의할 수 있습니다. 인증된 사용자의 기본 역할을 정의할 수 있습니다. 인증되지 않은 게스트 사용자의 권한이 제한된 개별 IAM 역할을 정의할 수도 있습니다.

## 역할 매핑에 사용할 역할 생성
<a name="creating-roles-for-role-mapping"></a>

각 역할에 적합한 신뢰 정책을 추가하여 자격 증명 풀의 인증된 사용자에게만 Amazon Cognito에서 역할을 위임할 수 있게 해야 합니다. 다음은 신뢰 정책의 예제입니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-corner-cafe-123456790ab"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}
```

------

이 정책에 의해 `cognito-identity.amazonaws.com`의 연동 사용자(OpenID Connect 토큰의 발급자)가 이 역할을 수임할 수 있습니다. 또한 이 정책은 토큰의 `aud`(이 경우 자격 증명 풀 ID)가 자격 증명 풀과 일치하도록 제한합니다. 마지막으로, 정책은 `authenticated` 값을 지닌 Amazon Cognito `GetOpenIdToken` API 작업에서 발행한 토큰의 다중 값 `amr` 클레임의 배열 멤버 중 하나를 지정합니다

## 역할 전달 권한 부여
<a name="granting-pass-role-permission"></a>

사용자가 자격 증명 풀에 대한 사용자의 기존 권한을 초과하는 권한으로 역할을 설정하도록 허용하려면, `set-identity-pool-roles` API에 역할을 전달할 수 있는 `iam:PassRole` 권한을 해당 사용자에게 부여하세요. 예를 들어, 사용자가 Amazon S3에 쓸 수 없지만 자격 증명 풀에 설정한 IAM 역할이 Amazon S3에 대한 쓰기 권한을 부여하면 역할에 대해 `iam:PassRole` 권한이 부여된 경우에만 사용자가 이 역할을 설정할 수 있습니다. 다음 예제 정책은 `iam:PassRole` 권한을 허용하는 방법을 보여줍니다.

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

****  

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

------

이 정책 예제에서는 `iam:PassRole` 역할에 대해 `myS3WriteAccessRole` 권한이 부여됩니다. 역할은 역할의 Amazon 리소스 이름(ARN)을 사용하여 지정됩니다. 또한 사용자에게 이 정책을 연결해야 합니다. 자세한 내용은 [관리형 정책 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html)을 참조하세요.

**참고**  
Lambda 함수는 리소스 기반 정책을 사용합니다. 이때 정책은 Lambda 함수 자체에 직접 연결됩니다. Lambda 함수를 호출하는 규칙을 생성하는 경우 역할은 전달하지 않습니다. 따라서 규칙을 생성하는 사용자에게 `iam:PassRole` 권한이 필요하지 않습니다. Lambda 함수 권한 부여에 대한 자세한 내용은 [권한 관리: Lambda 함수 정책 사용](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#intro-permission-model-access-policy)을 참조하세요.

## 토큰을 사용하여 사용자에게 역할 할당
<a name="using-tokens-to-assign-roles-to-users"></a>

Amazon Cognito 사용자 풀을 통해 로그인하는 사용자의 경우 사용자 풀에서 할당한 ID 토큰에서 역할을 전달할 수 있습니다. ID 토큰의 다음 클레임에 역할이 표시됩니다.
+ `cognito:preferred_role` 클레임은 역할 ARN입니다.
+ `cognito:roles` 클레임은 허용된 역할 ARN 집합을 포함하는 쉼표로 구분된 문자열입니다.

클레임은 다음과 같이 설정됩니다.
+ `cognito:preferred_role` 클레임은 최상위(최저) `Precedence` 값을 가진 그룹의 역할로 설정됩니다. 허용된 역할이 하나뿐인 경우 `cognito:preferred_role`이 해당 역할로 설정됩니다. 여러 역할이 있고 우선 순위가 가장 높은 역할 하나가 없는 경우 이 클레임이 설정되지 않습니다.
+ 역할이 하나라도 있는 경우 `cognito:roles` 클레임이 설정됩니다.

토큰을 사용하여 역할을 할당할 때 사용자에게 할당할 수 있는 역할이 여러 개인 경우 Amazon Cognito 자격 증명 풀(페더레이션 자격 증명)은 다음과 같이 역할을 선택합니다.
+ [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html) `CustomRoleArn` 파라미터가 설정되어있고 `cognito:roles` 클레임의 역할과 일치할 경우 이 파라미터를 사용합니다. 이 파라미터가 `cognito:roles`의 역할과 일치하지 않으면 액세스를 거부합니다.
+ `cognito:preferred_role` 클레임이 설정된 경우 이 클레임을 사용합니다.
+ `cognito:preferred_role` 클레임이 설정되지 않았고 `cognito:roles` 클레임이 설정되었으며 `GetCredentialsForIdentity`에 대한 호출에 `CustomRoleArn`이 지정되지 않은 경우, 할당할 역할을 결정하는 데 콘솔의 **역할 확인** 설정 또는 `AmbiguousRoleResolution` 필드([SetIdentityPoolRoles](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_SetIdentityPoolRoles.html) API의 `RoleMappings` 파라미터)가 사용됩니다.

## 규칙 기반 매핑을 사용하여 사용자에게 역할 할당
<a name="using-rules-to-assign-roles-to-users"></a>

규칙을 사용하여 자격 증명 공급자 토큰의 클레임을 IAM 역할에 매핑할 수 있습니다.

각 규칙은 토큰 클레임(예: Amazon Cognito 사용자 풀의 ID 토큰에 있는 사용자 속성), 일치 유형, 값 및 IAM 역할을 지정합니다. 이때 일치 유형은 `Equals`, `NotEqual`, `StartsWith` 또는 `Contains`가 될 수 있습니다. 사용자가 클레임에 대해 일치하는 값을 가진 경우 자격 증명을 얻으면 해당 역할을 수임할 수 있습니다. 예를 들어, `Sales`의 `custom:dept` 사용자 지정 속성 값으로 사용자의 특정한 IAM 역할을 할당하는 규칙을 만들 수 있습니다.

**참고**  
규칙 설정에서 표준 속성을 구별하기 위해 사용자 지정 속성에 `custom:` 접두사가 필요합니다.

규칙은 순서대로 평가되며 순서를 무시하도록 `CustomRoleArn`이 지정되지 않으면 첫 번째 일치 규칙의 IAM 역할이 사용됩니다. Amazon Cognito 사용자 풀의 사용자 속성에 대한 자세한 내용은 [사용자 속성 작업](user-pool-settings-attributes.md) 섹션을 참조하세요.

자격 증명 풀(연동 자격 증명) 콘솔에서 인증 공급자에 대한 여러 규칙을 설정할 수 있습니다. 규칙은 순서대로 적용됩니다. 규칙을 드래그하여 순서를 변경할 수 있습니다. 첫 번째 일치 규칙이 우선합니다. 일치 유형이 `NotEqual`이고 클레임이 없으면 규칙이 평가되지 않습니다. 일치하는 규칙이 없으면 **역할 해결** 설정이 **기본 인증된 역할 사용** 또는 **거부**에 적용됩니다.

API 및 CLI에서, [RoleMapping](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_RoleMapping.html) 유형의 `AmbiguousRoleResolution` 필드에 일치하는 규칙이 없을 때 할당할 역할을 지정할 수 있습니다. 이 유형은 [SetIdentityPoolRoles](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_SetIdentityPoolRoles.html) API의 `RoleMappings` 파라미터에 지정됩니다.

Amazon Cognito 콘솔에서 ID 제공업체에 규칙 기반 매핑을 추가하려면 IdP를 추가하거나 업데이트하고 **역할 선택**에서 **규칙이 있는 역할 선택**을 선택합니다. 여기에서 공급자 클레임을 IAM 역할에 매핑하는 규칙을 추가할 수 있습니다.

[RoleMapping](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_RoleMapping.html) 유형의 `RulesConfiguration` 필드를 사용하여 AWS CLI 또는 API에서 자격 증명 공급자에 대한 규칙 기반 매핑을 설정할 수 있습니다. [SetIdentityPoolRoles](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_SetIdentityPoolRoles.html) API의 `RoleMappings` 파라미터에서 이 필드를 지정할 수 있습니다.

예를 들어 다음 AWS CLI 명령은 OIDC IdP에 의해 인증된 Sacramento 위치의 `arn:aws:iam::123456789012:role/Sacramento_team_S3_admin` 사용자에게 역할을 할당하는 규칙을 추가합니다. `arn:aws:iam::123456789012:oidc-provider/myOIDCIdP` 

```
aws cognito-identity set-identity-pool-roles --region us-east-1 --cli-input-json file://role-mapping.json
```

**`role-mapping.json`의 콘텐츠**:

```
{
    "IdentityPoolId": "us-east-1:12345678-corner-cafe-123456790ab",
    "Roles": {
        "authenticated": "arn:aws:iam::123456789012:role/myS3WriteAccessRole",
        "unauthenticated": "arn:aws:iam::123456789012:role/myS3ReadAccessRole"
    },
    "RoleMappings": {
        "arn:aws:iam::123456789012:oidc-provider/myOIDCIdP": {
            "Type": "Rules",
            "AmbiguousRoleResolution": "AuthenticatedRole",
            "RulesConfiguration": {
                "Rules": [
                    {
                        "Claim": "locale",
                        "MatchType": "Equals",
                        "Value": "Sacramento",
                        "RoleARN": "arn:aws:iam::123456789012:role/Sacramento_team_S3_admin"
                    }
                ]
            }
        }
    }
}
```

자격 증명 풀에 구성된 각 사용자 풀 또는 기타 인증 공급자에 대해 규칙을 25개까지 생성할 수 있습니다. 이 제한은 조정할 수 없습니다. 자세한 내용은 [Amazon Cognito의 할당량](https://docs.aws.amazon.com/cognito/latest/developerguide/limits.html)을 참조하세요.

## 규칙 기반 매핑에 사용할 토큰 클레임
<a name="token-claims-for-role-based-access-control"></a>

**Amazon Cognito**

Amazon Cognito ID 토큰은 JWT(JSON Web Token)로 표시됩니다. `name`, `family_name` 및 `phone_number`와 같은 인증된 사용자의 자격 증명에 대한 클레임이 이 토큰에 포함됩니다. 표준 클레임에 대한 자세한 내용은 [OpenID Connect 사양](http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)을 참조하세요. 다음은 표준 클레임 외에 Amazon Cognito와 관련된 추가 클레임입니다.
+ `cognito:groups`
+ `cognito:roles`
+ `cognito:preferred_role`

**Amazon**

다음 클레임은 클레임의 가능한 값과 함께 Login with Amazon에서 사용할 수 있습니다.
+ `iss`: www.amazon.com
+ `aud`: 앱 ID
+ `sub`: `sub` Login with Amazon 토큰

**Facebook**

다음 클레임은 클레임의 가능한 값과 함께 Facebook에서 사용할 수 있습니다.
+ `iss`: graph.facebook.com
+ `aud`: 앱 ID
+ `sub`: `sub` Facebook 토큰

**Google**

Google 토큰에는 [OpenID Connect 사양](http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)의 표준 클레임이 포함됩니다. OpenID 토큰의 모든 클레임은 규칙 기반 매핑에 사용할 수 있습니다. Google 토큰에서 사용할 수 있는 클레임에 대한 자세한 내용은 [OpenID Connect](https://developers.google.com/identity/protocols/OpenIDConnect)를 참조하세요.

**Apple**

Apple 토큰에는 [OpenID Connect 사양](http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)의 표준 클레임이 포함됩니다. Apple 토큰에서 사용할 수 있는 클레임에 대한 자세한 내용은 Apple 설명서에서 [Sign in with Apple로 사용자 인증](https://developer.apple.com/documentation/signinwithapple/authenticating-users-with-sign-in-with-apple)을 참조하세요. Apple의 토큰에 항상 `email`이 포함되어 있지는 않습니다.

**OpenID**

Open ID 토큰의 모든 클레임은 규칙 기반 매핑에 사용할 수 있습니다. 표준 클레임에 대한 자세한 내용은 [OpenID Connect 사양](http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)을 참조하세요. 사용 가능한 추가 클레임에 대한 내용은 OpenID 제공업체 설명서를 참조하세요.

**SAML**

수신된 SAML 어설션에서 클레임을 구문 분석합니다. SAML 어설션에서 사용할 수 있는 모든 클레임은 규칙 기반 매핑에서 사용할 수 있습니다.

## 역할 기반 액세스 제어의 모범 사례
<a name="best-practices-for-role-based-access-control"></a>

**중요**  
역할에 매핑하는 클레임을 최종 사용자가 수정할 수 있는 경우 최종 사용자가 역할을 맡고 그에 따라 정책을 설정할 수 있습니다. 최종 사용자가 직접 설정할 수 없는 클레임은 승격된 권한을 가진 역할에만 매핑하세요. Amazon Cognito 사용자 풀에서 각 사용자 속성에 대해 앱당 읽기 및 쓰기 권한을 설정할 수 있습니다.

**중요**  
Amazon Cognito 사용자 풀에서 그룹의 역할을 설정하면 이 역할이 사용자의 ID 토큰을 통해 전달됩니다. 이 역할을 사용하려면 자격 증명 풀의 인증된 역할 선택에 대해 **토큰으로부터 역할 선택**을 설정해야 합니다.  
콘솔의 [**역할 확인(Role resolution)**] 설정과 [SetIdentityPoolRoles](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_SetIdentityPoolRoles.html) API의 `RoleMappings` 파라미터를 사용하여 토큰에서 올바른 역할을 확인할 수 없는 경우 실행할 기본 동작을 지정할 수 있습니다.