

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

# Amazon Cognito 자격 증명 풀
<a name="cognito-identity"></a>

Amazon Cognito 자격 증명 풀은  AWS  보안 인증으로 교환할 수 있는 페더레이션 자격 증명의 디렉터리입니다. 자격 증명 풀은 앱 사용자가 로그인했는지 또는 아직 식별하지 않았는지에 관계없이 앱 사용자를 위한 임시 AWS 자격 증명을 생성합니다. AWS Identity and Access Management (IAM) 역할 및 정책을 사용하면 사용자에게 부여할 권한 수준을 선택할 수 있습니다. 사용자는 게스트로 시작하고 AWS 서비스에 보관하는 자산을 검색할 수 있습니다. 그런 다음 사용자는 서드 파티 ID 제공업체를 통해 로그인하여 등록된 회원에게 제공되는 자산에 대한 액세스 권한을 잠금 해제할 수 있습니다. 서드 파티 ID 제공업체는 Apple이나 Google 같은 소비자(소셜) OAuth 2.0 공급자, 사용자 지정 SAML 또는 OIDC ID 제공업체 또는 자체 설계한 사용자 지정 인증 체계(*개발자 공급자*라고도 함)일 수 있습니다.Amazon Cognito 자격 증명 풀의 기능

**에 대한 요청 서명 AWS 서비스**  
Amazon Simple Storage Service(Amazon S3) 및 Amazon DynamoDB와 AWS 서비스 같은에 대한 [API 요청에 서명](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)합니다. Amazon Pinpoint와 Amazon CloudWatch 같은 서비스를 사용하여 사용자 활동을 분석합니다.

**리소스 기반 정책으로 요청 필터링**  
리소스에 대한 사용자 액세스에 대한 세분화된 제어를 실행합니다. 사용자 클레임을 [IAM 세션 태그](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html)로 변환하고 개별 사용자 하위 집합에 리소스 액세스 권한을 부여하는 IAM 정책을 구축합니다.

**게스트 액세스 할당**  
아직 로그인하지 않은 사용자의 경우 액세스 범위가 좁은 AWS 보안 인증을 생성하도록 자격 증명 풀을 구성합니다. SSO(Single Sign-On) 공급자를 통해 사용자를 인증하여 액세스 권한을 높입니다.

**사용자 특성에 따라 IAM 역할 할당**  
인증된 모든 사용자에게 단일 IAM 역할을 할당하거나 각 사용자의 클레임을 기반으로 역할을 선택합니다.

**다양한 ID 제공업체 수락**  
자격 AWS 증명을 위해 ID 또는 액세스 토큰, 사용자 풀 토큰, SAML 어설션 또는 소셜 공급자 OAuth 토큰을 교환합니다.

**자체 자격 증명 검증**  
자체 사용자 검증을 수행하고 개발자 AWS 자격 증명을 사용하여 사용자에게 자격 증명을 발급합니다.

인증 및 권한 부여 서비스를 앱에 제공하는 Amazon Cognito 사용자 풀이 이미 있을 수도 있습니다. 사용자 풀을 자격 증명 풀에 대한 ID 제공업체(idP)로 설정할 수 있습니다. 이 경우 사용자는 사용자 풀 IdPs 통해 인증하고, 클레임을 공통 OIDC 자격 증명 토큰으로 통합하고, 해당 토큰을 AWS 자격 증명으로 교환할 수 있습니다. 그러면 사용자는 서명된 요청의 보안 인증을  AWS 서비스에 제시할 수 있습니다.

또한 어떤 ID 제공업체의 인증된 클레임도 자격 증명 풀에 직접 제시할 수 있습니다. Amazon Cognito는 SAML, OAuth, OIDC 공급자의 사용자 클레임을 단기 보안 인증을 위한 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 요청으로 사용자 지정합니다.

Amazon Cognito 사용자 풀은 SSO 지원 앱에 대한 OIDC ID 제공업체와 같습니다. 자격 증명 풀은 IAM 권한 부여에서 가장 잘 작동하는 리소스 종속성이 있는 앱에 *AWS* ID 제공업체 역할을 합니다.

Amazon Cognito 자격 증명 풀은 다음 자격 증명 공급자를 지원합니다.
+ 퍼블릭 공급자: [Amazon을 사용하여 ID 풀 IdP로 로그인 설정](amazon.md), [Facebook을 ID 풀 IdP로 설정](facebook.md), [Google을 ID 풀 IdP로 설정](google.md), [Sign in with Apple을 ID 풀 IdP로 설정](apple.md), Twitter.
+ [Amazon Cognito 사용자 풀](cognito-user-pools.md)
+ [OIDC 제공업체를 ID 풀 IdP로 설정](open-id.md)
+ [SAML 제공업체를 ID 풀 IdP로 설정](saml-identity-provider.md)
+ [개발자 인증 자격 증명](developer-authenticated-identities.md)

Amazon Cognito 자격 증명 풀 리전 가용성에 대한 자세한 내용은 [AWS 서비스 리전 가용성](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)을 참조하세요.

Amazon Cognito 자격 증명 풀에 대한 자세한 내용은 다음 주제를 참조하세요.

**Topics**
+ [

# ID 풀 콘솔 개요
](identity-pools.md)
+ [

# 자격 증명 풀 인증 흐름
](authentication-flow.md)
+ [

# IAM 역할
](iam-roles.md)
+ [

# Amazon Cognito ID 풀을 위한 보안 모범 사례
](identity-pools-security-best-practices.md)
+ [

# 액세스 제어에 속성 사용
](attributes-for-access-control.md)
+ [

# 역할 기반 액세스 제어 사용
](role-based-access-control.md)
+ [

# 자격 증명 얻기
](getting-credentials.md)
+ [

# 임시 자격 증명 AWS 서비스 으로 액세스
](accessing-aws-services.md)
+ [

# ID 풀 타사 ID 제공업체
](external-identity-providers.md)
+ [

# 개발자 인증 자격 증명
](developer-authenticated-identities.md)
+ [

# 인증되지 않은 사용자를 인증된 사용자로 전환
](switching-identities.md)

# ID 풀 콘솔 개요
<a name="identity-pools"></a>

Amazon Cognito 자격 증명 풀은 게스트(인증되지 않음)인 사용자와 인증되어 토큰을 받은 사용자에게 임시 AWS 자격 증명을 제공합니다. ID 풀은 외부 ID 제공업체에 연결된 사용자 식별자의 저장소입니다.

ID 풀의 기능과 옵션을 이해하는 한 가지 방법은 Amazon Cognito 콘솔에서 생성하는 것입니다. 다양한 설정이 인증 흐름, 역할 기반 및 속성 기반 액세스 제어, 게스트 액세스에 미치는 영향을 탐색할 수 있습니다. 여기에서 이 가이드의 후반부 장으로 이동하여 애플리케이션에 적절한 구성 요소를 추가하여 ID 풀 인증을 구현할 수 있습니다.

**Topics**
+ [

## 자격 증명 풀 생성
](#identity-pools-create)
+ [

## 사용자 IAM 역할
](#user-iam-roles)
+ [

## 인증된 자격 증명 및 인증되지 않은 자격 증명
](#authenticated-and-unauthenticated-identities)
+ [

## 게스트 액세스 활성화 또는 비활성화
](#enable-or-disable-unauthenticated-identities)
+ [

## 자격 증명 유형과 연관된 역할 변경
](#change-the-role-associated-with-an-identity-type)
+ [

## ID 제공업체 편집
](#enable-or-edit-authentication-providers)
+ [

## 자격 증명 풀 삭제
](#delete-an-identity-pool)
+ [

## 자격 증명 풀에서 자격 증명 삭제
](#delete-an-identity-from-an-identity-pool)
+ [

## Amazon Cognito Sync를 자격 증명 풀과 함께 사용
](#identity-pools-sync)

## 자격 증명 풀 생성
<a name="identity-pools-create"></a>

**콘솔에서 새 자격 증명 풀을 만들려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에 로그인하고 **자격 증명 풀**을 선택합니다.

1. **자격 증명 풀 생성**을 선택합니다.

1. **자격 증명 풀 신뢰 구성**에서 **인증된 액세스**, **게스트 액세스** 또는 둘 다에 대해 자격 증명 풀을 설정하도록 선택합니다.

   1. **인증된 액세스**를 선택한 경우 자격 증명 풀에서 인증된 자격 증명의 소스로 설정하려는 **자격 증명 유형**을 하나 이상 선택합니다. **사용자 지정 개발자 공급자**를 구성하는 경우 자격 증명 풀을 생성한 후에는 이를 수정하거나 삭제할 수 없습니다.

1. **권한 구성**에서 자격 증명 풀의 인증된 사용자 또는 게스트 사용자의 기본 IAM 역할을 선택합니다.

   1. Amazon Cognito가 기본 권한 및 자격 증명 풀과의 신뢰 관계가 있는 새 역할을 생성하도록 하려면 **새 IAM 역할 생성**을 선택합니다. 새 역할을 식별하는 **IAM 역할 이름**을 입력합니다(예: `myidentitypool_authenticatedrole`). Amazon Cognito가 새 IAM 역할에 할당할 권한을 검토하려면 **정책 문서 보기**를 선택합니다.

   1. 에 **사용하려는 역할이 이미 있는 경우 기존 IAM** 역할 사용을 선택할 수 있습니다. AWS 계정 `cognito-identity.amazonaws.com`을 포함하도록 IAM 역할 신뢰 정책을 구성해야 합니다. 특정 자격 증명 풀의 인증된 사용자로부터 요청이 시작되었다는 증거가 제시되는 경우에만 Amazon Cognito가 역할을 맡을 수 있도록 역할 신뢰 정책을 구성합니다. 자세한 내용은 [역할 트러스트 및 권한](iam-roles.md#role-trust-and-permissions) 단원을 참조하십시오.

1. **ID 제공업체 연결**에서 **자격 증명 풀 신뢰 구성**에서 선택한 ID 제공업체(idP)의 세부 정보를 입력합니다. OAuth 앱 클라이언트 정보를 제공하거나, Amazon Cognito 사용자 풀을 선택하거나, IAM IdP를 선택하거나, 개발자 공급자의 사용자 지정 식별자를 입력하라는 메시지가 표시될 수 있습니다.

   1. 각 IdP의 **역할 설정**을 선택합니다. **인증된 역할**을 구성할 때 설정한 **기본 역할**을 이 IdP의 사용자에게 할당하거나 **규칙을 사용하여 역할 선택**을 선택할 수 있습니다. Amazon Cognito 사용자 풀 IdP를 사용하면 **토큰에서 preferred\$1role을 포함한 역할을 선택**할 수도 있습니다. `cognito:preferred_role` 클레임에 대한 자세한 내용은 [그룹에 우선 순위 값 할당](cognito-user-pools-user-groups.md#assigning-precedence-values-to-groups)을 참조하세요.

      1. **규칙을 사용하여 역할 선택**을 선택한 경우 사용자 인증의 소스 **클레임**, 클레임을 비교할 **연산자**, 이 역할 선택과 일치하도록 하는 **값** 및 **역할 할당**이 일치할 때 할당할 **역할**을 입력합니다. 다른 조건에 따라 추가 규칙을 생성하려면 **다른 항목 추가**를 선택합니다.

      1. **역할 해결**을 선택합니다. 사용자의 클레임이 규칙과 일치하지 않는 경우 보안 인증을 거부하거나 **인증된 역할**의 보안 인증을 발급할 수 있습니다.

   1. 각 IdP별로 **액세스 제어를 위한 속성**을 구성합니다. 액세스 제어를 위한 속성은 사용자 클레임을 Amazon Cognito가 임시 세션에 적용하는 [보안 주체 태그](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_iam-tags.html)에 매핑합니다. 세션에 적용하는 태그를 기반으로 사용자 액세스를 필터링하는 IAM 정책을 구축할 수 있습니다.

      1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

      1. `sub` 및 `aud` 클레임 기반 보안 주체 태그를 적용하려면 **기본 매핑 사용**을 선택합니다.

      1. 보안 주체 태그에 대한 속성의 자체 사용자 지정 스키마를 생성하려면 **사용자 지정 매핑 사용**을 선택합니다. 그런 다음 태그에 표시하려는 각 **클레임**에서 소싱하려는 **태그 키**를 입력합니다.

1. **속성 구성**에서 **자격 증명 풀 이름** 아래에 **이름**을 입력합니다.

1. **기본(Classic) 인증**에서 **기본 흐름 활성화** 여부를 선택합니다. 기본 흐름이 활성화되면 IdP에 대한 역할 선택을 우회하고 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)를 직접 호출할 수 있습니다. 자세한 내용은 [자격 증명 풀 인증 흐름](authentication-flow.md) 단원을 참조하십시오.

1. 자격 증명 풀에 [태그](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html)를 적용하려면 **태그**에서 **태그 추가**를 선택합니다.

1. **검토 및 생성**에서 새 자격 증명 풀에 대한 선택 사항을 확인합니다. **편집**을 선택하여 마법사로 돌아가서 설정을 변경합니다. 완료하면 **자격 증명 풀 생성**을 선택합니다.

## 사용자 IAM 역할
<a name="user-iam-roles"></a>

IAM 역할은 사용자가와 같은 AWS 리소스에 액세스할 수 있는 권한을 정의합니다[Amazon Cognito Sync](cognito-sync.md). 생성된 역할을 애플리케이션 사용자가 수임합니다. 인증된 사용자와 인증되지 않은 사용자에게 다른 역할을 지정할 수 있습니다. IAM 역할에 대한 자세한 내용은 [IAM 역할](iam-roles.md) 섹션을 참조하세요.

## 인증된 자격 증명 및 인증되지 않은 자격 증명
<a name="authenticated-and-unauthenticated-identities"></a>

Amazon Cognito 자격 증명 풀은 인증된 자격 증명과 인증되지 않은 자격 증명을 모두 지원합니다. 인증된 자격 증명은 지원되는 자격 증명 공급자가 인증한 사용자를 위한 것이고, 인증되지 않은 자격 증명은 대개 게스트 사용자를 위한 것입니다.
+ 퍼블릭 로그인 공급자를 통해 인증된 자격 증명을 구성하려면 [ID 풀 타사 ID 제공업체](external-identity-providers.md) 섹션을 참조하세요.
+ 자체 백엔드 인증 프로세스를 구성하려면 [개발자 인증 자격 증명](developer-authenticated-identities.md) 섹션을 참조하세요.

## 게스트 액세스 활성화 또는 비활성화
<a name="enable-or-disable-unauthenticated-identities"></a>

 Amazon Cognito 자격 증명 풀 게스트 액세스(인증되지 않은 자격 증명)는 자격 증명 공급자로 인증하지 않는 사용자에게 고유한 식별자와 AWS 자격 증명을 제공합니다. 애플리케이션에서 로그인하지 않은 사용자를 허용하는 경우 인증하지 않은 자격 증명의 액세스를 활성화할 수 있습니다. 자세한 내용은 [Amazon Cognito ID 풀 시작](getting-started-with-identity-pools.md)를 참조하세요.

**자격 증명 풀에서 게스트 액세스를 업데이트하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **게스트 액세스**를 찾습니다. 현재 게스트 액세스를 지원하지 않는 자격 증명 풀에서는 **상태**가 **비활성**입니다.

   1. **게스트 액세스**가 **활성**이고 이를 비활성화하려면 **비활성화**를 선택합니다.

   1. **게스트 액세스**가 **비활성**이고 이를 활성화하려면 **편집**을 선택합니다.

      1. 자격 증명 풀의 게스트 사용자의 기본 IAM 역할을 선택합니다.

        1. Amazon Cognito가 기본 권한 및 자격 증명 풀과의 신뢰 관계가 있는 새 역할을 생성하도록 하려면 **새 IAM 역할 생성**을 선택합니다. 새 역할을 식별하는 **IAM 역할 이름**을 입력합니다(예: `myidentitypool_authenticatedrole`). Amazon Cognito가 새 IAM 역할에 할당할 권한을 검토하려면 **정책 문서 보기**를 선택합니다.

        1. 에 **사용하려는 역할이 이미 있는 경우 기존 IAM** 역할 사용을 선택할 수 있습니다. AWS 계정 `cognito-identity.amazonaws.com`을 포함하도록 IAM 역할 신뢰 정책을 구성해야 합니다. 특정 자격 증명 풀의 인증된 사용자로부터 요청이 시작되었다는 증거가 제시되는 경우에만 Amazon Cognito가 역할을 맡을 수 있도록 역할 신뢰 정책을 구성합니다. 자세한 내용은 [역할 트러스트 및 권한](iam-roles.md#role-trust-and-permissions) 단원을 참조하십시오.

        1. **변경 사항 저장**을 선택합니다.

        1. 게스트 액세스를 활성화하려면 **사용자 액세스** 탭에서 **활성화**를 선택합니다.

## 자격 증명 유형과 연관된 역할 변경
<a name="change-the-role-associated-with-an-identity-type"></a>

자격 증명 풀의 모든 자격 증명은 인증 또는 미인증입니다. 인증 자격 증명은 퍼블릭 로그인 공급자(Amazon Cognito 사용자 풀, Login with Amazon, Sign in with Apple, Facebook, Google, SAML 또는 OpenID Connect 공급자) 또는 개발자 공급자(자체 백엔드 인증 프로세스)에 의해 인증된 사용자에 속합니다. 인증되지 않은 자격 증명은 대개 게스트 사용자를 위한 것입니다.

각 자격 증명 유형에 대해 할당된 역할이 있습니다. 이 역할에는 해당 역할이 액세스할 수 있는 권한을 지정하는 정책 AWS 서비스 이 연결되어 있습니다. Amazon Cognito가 요청을 받으면 이 서비스가 자격 증명 유형을 결정하고, 해당 자격 증명 유형에 할당된 역할을 결정하고, 해당 역할에 첨부된 정책을 사용하여 대응합니다. 정책을 수정하거나 자격 증명 유형에 다른 역할을 할당하여 어떤 AWS 서비스 자격 증명 유형에 액세스할 수 있는지 제어할 수 있습니다. 자격 증명 풀에서 역할과 연관된 정책을 보거나 수정하려면 [AWS IAM 콘솔](https://console.aws.amazon.com/iam/home)을 참조하세요.

**자격 증명 풀 기본 인증 역할 또는 인증되지 않은 역할을 변경하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **게스트 액세스** 또는 **인증된 액세스**를 찾습니다. 현재 해당 액세스 유형에 대해 구성되지 않은 자격 증명 풀에서는 **상태**가 **비활성**입니다. **편집**을 선택합니다.

1. 자격 증명 풀의 게스트 또는 인증된 사용자의 기본 IAM 역할을 선택합니다.

   1. Amazon Cognito가 기본 권한 및 자격 증명 풀과의 신뢰 관계가 있는 새 역할을 생성하도록 하려면 **새 IAM 역할 생성**을 선택합니다. 새 역할을 식별하는 **IAM 역할 이름**을 입력합니다(예: `myidentitypool_authenticatedrole`). Amazon Cognito가 새 IAM 역할에 할당할 권한을 검토하려면 **정책 문서 보기**를 선택합니다.

   1. 에 **사용하려는 역할이 이미 있는 경우 기존 IAM** 역할 사용을 선택할 수 있습니다. AWS 계정 `cognito-identity.amazonaws.com`을 포함하도록 IAM 역할 신뢰 정책을 구성해야 합니다. 특정 자격 증명 풀의 인증된 사용자로부터 요청이 시작되었다는 증거가 제시되는 경우에만 Amazon Cognito가 역할을 맡을 수 있도록 역할 신뢰 정책을 구성합니다. 자세한 내용은 [역할 트러스트 및 권한](iam-roles.md#role-trust-and-permissions) 단원을 참조하십시오.

1. **변경 사항 저장**을 선택합니다.

## ID 제공업체 편집
<a name="enable-or-edit-authentication-providers"></a>

사용자가 소비자 ID 제공업체(예: Amazon Cognito 사용자 풀, Login with Amazon, Sign in with Apple, Facebook, Google)를 사용하여 인증하는 것을 허용하는 경우 Amazon Cognito 자격 증명 풀(페더레이션 자격 증명) 콘솔에서 애플리케이션 식별자를 지정할 수 있습니다. 이 퍼블릭 자격 증명 공급자는 애플리케이션 ID(퍼블릭 로그인 공급자가 제공함)와 자격 증명 풀을 연결합니다.

이 페이지에서 각 공급자에 대한 인증 규칙을 구성할 수도 있습니다. 각 공급자에 대해 최대 25개의 규칙이 허용됩니다. 규칙은 저장한 순서대로 각 공급자에 적용됩니다. 자세한 내용은 [역할 기반 액세스 제어 사용](role-based-access-control.md) 단원을 참조하십시오.

**주의**  
자격 증명 풀에서 연결된 IdP 애플리케이션 ID를 변경하면 기존 사용자가 해당 자격 증명 풀을 사용하여 인증할 수 없게 됩니다. 자세한 내용은 [ID 풀 타사 ID 제공업체](external-identity-providers.md) 단원을 참조하십시오.

**자격 증명 풀 ID 제공업체(idP)를 업데이트하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체**를 찾습니다. 편집할 ID 제공업체를 선택합니다. 새 IdP를 추가하려면 **ID 제공업체 추가**를 선택합니다.

   1. **ID 제공업체 추가**를 선택한 경우 추가하려는 **자격 증명 유형** 중 하나를 선택합니다.

1. 애플리케이션 ID를 변경하려면 **ID 제공업체 정보**에서 **편집**을 선택합니다.

1. Amazon Cognito가 이 공급자를 통해 인증한 사용자에게 보안 인증을 발급할 때 요청하는 역할을 변경하려면 **역할 설정**에서 **편집**을 선택합니다.

   1. **인증된 역할**을 구성할 때 설정한 **기본 역할**을 해당 IdP의 사용자에게 할당하거나 **규칙을 사용하여 역할 선택**을 선택할 수 있습니다. Amazon Cognito 사용자 풀 IdP를 사용하면 **토큰에서 preferred\$1role을 포함한 역할을 선택**할 수도 있습니다. `cognito:preferred_role` 클레임에 대한 자세한 내용은 [그룹에 우선 순위 값 할당](cognito-user-pools-user-groups.md#assigning-precedence-values-to-groups)을 참조하세요.

     1. **규칙을 사용하여 역할 선택**을 선택한 경우 사용자 인증의 소스 **클레임**, 클레임을 비교할 **연산자**, 이 역할 선택과 일치하도록 하는 **값** 및 **역할 할당**이 일치할 때 할당할 **역할**을 입력합니다. 다른 조건에 따라 추가 규칙을 생성하려면 **다른 항목 추가**를 선택합니다.

     1. **역할 해결**을 선택합니다. 사용자의 클레임이 규칙과 일치하지 않는 경우 보안 인증을 거부하거나 **인증된 역할**의 보안 인증을 발급할 수 있습니다.

1. Amazon Cognito가 이 공급자를 통해 인증한 사용자에게 보안 인증을 발급할 때 할당하는 보안 주체 태그를 변경하려면 **액세스 제어를 위한 속성**에서 **편집**을 선택합니다.

   1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

   1. `sub` 및 `aud` 클레임 기반 보안 주체 태그를 적용하려면 **기본 매핑 사용**을 선택합니다.

   1. 보안 주체 태그에 대한 속성의 자체 사용자 지정 스키마를 생성하려면 **사용자 지정 매핑 사용**을 선택합니다. 그런 다음 태그에 표시하려는 각 **클레임**에서 소싱하려는 **태그 키**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

## 자격 증명 풀 삭제
<a name="delete-an-identity-pool"></a>

자격 증명 풀 삭제는 실행 취소할 수 없습니다. 자격 증명 풀을 삭제하면 해당 자격 증명 풀을 사용하는 모든 앱과 사용자의 작동이 중지됩니다.

**자격 증명 풀을 삭제하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 삭제할 자격 증명 풀 옆의 라디오 버튼을 선택합니다.

1. **삭제**를 선택합니다.

1. 자격 증명 풀의 이름을 입력하거나 붙여넣고 **삭제**를 선택합니다.

**주의**  
삭제(Delete) 버튼을 선택하면 자격 증명 풀과 여기에 포함된 모든 사용자 데이터를 영구적으로 삭제합니다. 자격 증명 풀을 삭제할 경우 자격 증명 풀을 사용하는 애플리케이션과 기타 서비스의 작동이 중지됩니다.

## 자격 증명 풀에서 자격 증명 삭제
<a name="delete-an-identity-from-an-identity-pool"></a>

자격 증명 풀에서 자격 증명을 삭제하면 Amazon Cognito가 해당 페더레이션 사용자에 대해 저장한 식별 정보가 제거됩니다. 사용자가 보안 인증을 다시 요청하면 자격 증명 풀이 여전히 사용자의 ID 제공업체를 신뢰하는 경우 새 자격 증명 ID를 받게 됩니다. 이 작업은 실행 취소할 수 없습니다.

**자격 증명을 삭제하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **자격 증명 브라우저** 탭을 선택합니다.

1. 삭제할 자격 증명 옆의 확인란을 선택하고 **삭제**를 선택합니다. 자격 증명을 정말로 삭제할지 다시 묻는 메시지가 나오면 확인 후 **삭제**를 선택합니다.

## Amazon Cognito Sync를 자격 증명 풀과 함께 사용
<a name="identity-pools-sync"></a>

 Amazon Cognito Sync는 디바이스 간에 애플리케이션 관련 사용자 데이터를 동기화할 수 있는 AWS 서비스 및 클라이언트 라이브러리입니다. Amazon Cognito Sync를 사용하면 자체 백엔드를 사용하지 않고 모바일 디바이스 및 웹 간에 사용자 프로필 데이터를 동기화할 수 있습니다. 클라이언트 라이브러리는 디바이스 연결 상태와 관계없이 앱에서 데이터를 읽고 쓸 수 있도록 로컬로 데이터를 캐싱합니다. 디바이스가 온라인 상태일 때 데이터를 동기화할 수 있습니다. 푸시 동기화를 설정한 경우 업데이트가 있음을 다른 디바이스에 즉시 알릴 수 있습니다.

### 데이터 집합 관리
<a name="managing-datasets-in-the-amazon-cognito-console"></a>

애플리케이션에서 Amazon Cognito Sync 기능을 구현한 경우 Amazon Cognito 자격 증명 풀 콘솔에서는 개별 자격 증명에 대한 데이터 집합과 레코드를 수동으로 생성하고 삭제할 수 있습니다. Amazon Cognito 자격 증명 풀 콘솔에서 자격 증명의 데이터 집합 또는 레코드에 대한 변경 사항은 사용자가 콘솔에서 **동기화(Synchronize)**를 선택할 때까지 저장되지 않습니다. 자격 증명이 **동기화(Synchronize)**를 호출할 때까지 최종 사용자에게 변경 사항이 표시되지 않습니다. 개별 자격 증명에 대해 다른 장치에서 동기화되고 있는 데이터는 특정 자격 증명에 대한 목록 데이터 집합 페이지를 새로 고칠 경우 표시됩니다.

#### 자격 증명에 대한 데이터 집합 생성
<a name="create-a-dataset-for-an-identity"></a>

Amazon Cognito Sync는 데이터 세트를 하나의 자격 증명과 연결합니다. 자격 증명이 나타내는 사용자에 대한 식별 정보로 데이터 세트를 채운 다음 해당 정보를 사용자의 모든 디바이스에 동기화할 수 있습니다.

**자격 증명에 데이터 세트와 데이터 세트 레코드를 추가하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **자격 증명 브라우저** 탭을 선택합니다.

1. 편집할 자격 증명을 선택합니다.

1. **데이터 세트**에서 **데이터 세트 생성**을 선택합니다.

1. **데이터 세트 이름**을 입력하고 **데이터 세트 생성**을 선택합니다.

1. 데이터 세트에 레코드를 추가하려면 자격 증명 세부 정보에서 데이터 세트를 선택합니다. **레코드**에서 **레코드 생성**을 선택합니다.

1. 레코드의 **키**와 **값**을 입력합니다. **확인**을 선택합니다. 레코드를 더 추가하려면 이 단계를 반복합니다.

#### 자격 증명과 연결된 데이터 집합 삭제
<a name="delete-a-dataset-associated-with-an-identity"></a>

**자격 증명에서 데이터 세트와 해당 레코드를 삭제하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **자격 증명 브라우저** 탭을 선택합니다.

1. 삭제할 데이터 세트가 포함된 자격 증명을 선택합니다.

1. **데이터 세트**에서 삭제할 데이터 세트 옆에 있는 라디오 버튼을 선택합니다.

1. **삭제**를 선택합니다. 선택 사항을 검토하고 **삭제**를 다시 선택합니다.

### 데이터 대량 게시
<a name="bulk-publish-data"></a>

 Amazon Cognito Sync 스토어에 이미 저장되어 있는 데이터를 Amazon Kinesis 스트림으로 내보내는 데 대량 게시를 사용할 수 있습니다. 모든 스트림을 대량 게시하는 방법에 대한 자세한 내용은 [Amazon Cognito Sync 스트림 구현](cognito-streams.md) 섹션을 참조하세요.

### 푸시 동기화 활성화
<a name="enable-push-synchronization"></a>

 Amazon Cognito는 자격 증명과 디바이스 간의 연결 관계를 자동으로 추적합니다. 푸시 동기화 기능을 사용하면 자격 증명 데이터가 변경될 경우 지정한 자격 증명의 모든 인스턴스가 통지되도록 할 수 있습니다. 푸시 동기화는 자격 증명의 데이터 세트가 변경될 때마다 해당 자격 증명과 연결된 모든 디바이스가 변경 사항에 대해 알리는 자동 푸시 알림을 받도록 합니다.

 Amazon Cognito 콘솔에서 푸시 동기화를 활성화할 수 있습니다.

**푸시 동기화를 활성화하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **자격 증명 풀 속성** 탭을 선택합니다.

1. **푸시 동기화**에서 **편집**을 선택합니다.

1. **자격 증명 풀과 푸시 동기화 활성화**를 선택합니다.

1. 현재  AWS 리전에 생성한 Amazon Simple Notification Service(SNS) **플랫폼 애플리케이션** 중 하나를 선택합니다. Amazon Cognito는 플랫폼 애플리케이션에 푸시 알림을 게시합니다. **플랫폼 애플리케이션 생성**을 선택하여 Amazon SNS 콘솔로 이동하고 새 플랫폼 애플리케이션을 생성합니다.

1. Amazon Cognito는 플랫폼 애플리케이션에 게시하기 위해  AWS 계정의 IAM 역할을 맡습니다. Amazon Cognito가 기본 권한 및 자격 증명 풀과의 신뢰 관계가 있는 새 역할을 생성하도록 하려면 **새 IAM 역할 생성**을 선택합니다. 새 역할을 식별하는 **IAM 역할 이름**을 입력합니다(예: `myidentitypool_authenticatedrole`). Amazon Cognito가 새 IAM 역할에 할당할 권한을 검토하려면 **정책 문서 보기**를 선택합니다.

1. 에 **사용하려는 역할이 이미 있는 경우 기존 IAM** 역할 사용을 선택할 수 있습니다. AWS 계정 `cognito-identity.amazonaws.com`을 포함하도록 IAM 역할 신뢰 정책을 구성해야 합니다. 특정 자격 증명 풀의 인증된 사용자로부터 요청이 시작되었다는 증거가 제시되는 경우에만 Amazon Cognito가 역할을 맡을 수 있도록 역할 신뢰 정책을 구성합니다. 자세한 내용은 [역할 트러스트 및 권한](iam-roles.md#role-trust-and-permissions) 단원을 참조하십시오.

1. **변경 사항 저장**을 선택합니다.

### Amazon Cognito 스트림 설정
<a name="set-up-cognito-streams"></a>

 Amazon Cognito 스트림은 개발자에게 Amazon Cognito Sync에 저장된 데이터에 대한 제어와 인사이트를 제공합니다. 개발자는 이제 이벤트를 데이터로 수신하도록 Kinesis 스트림을 구성할 수 있습니다. Amazon Cognito는 각 데이터 집합 변경 사항을 사용자가 소유하는 Kinesis 스트림으로 실시간으로 푸시합니다. Amazon Cognito 콘솔에서 Amazon Cognito 스트림을 설정하는 방법에 대한 지침은 [Amazon Cognito Sync 스트림 구현](cognito-streams.md) 섹션을 참조하세요.

### Amazon Cognito 이벤트 설정
<a name="set-up-cognito-events"></a>

 Amazon Cognito 이벤트를 사용하면 Amazon Cognito Sync의 중요한 이벤트에 대한 응답으로 AWS Lambda 함수를 실행할 수 있습니다. Amazon Cognito Sync는 데이터 집합이 동기화될 경우 동기화 트리거 이벤트를 유발합니다. 사용자가 데이터를 업데이트할 때 동기화 트리거 이벤트를 사용하여 작업을 수행할 수 있습니다. 콘솔에서 Amazon Cognito 이벤트를 설정하는 방법에 대한 자세한 내용은 [Amazon Cognito Events를 사용하여 워크플로 사용자 지정](cognito-events.md) 섹션을 참조하세요.

 에 대한 자세한 내용은 단원을 AWS Lambda참조하십시오[AWS Lambda](https://aws.amazon.com/lambda/).

# 자격 증명 풀 인증 흐름
<a name="authentication-flow"></a>

Amazon Cognito를 사용하면 디바이스와 플랫폼에서 일관성이 유지되는 최종 사용자의 고유한 식별자를 생성할 수 있습니다. 또한 Amazon Cognito는 AWS 리소스에 액세스하기 위해 애플리케이션에 제한된 권한의 임시 자격 증명을 제공합니다. 이 페이지에서는 Amazon Cognito의 기본 인증 방법을 다루며, 자격 증명 풀 내에서 자격 증명의 수명 주기에 대해 설명합니다.

**외부 공급자 인증 흐름**

Amazon Cognito로 인증하는 사용자는 자격 증명을 부트스트랩하기 위해 다단계 프로세스를 진행합니다. Amazon Cognito는 퍼블릭 공급자로부터 인증을 받기 위한, 향상된 흐름과 기본 흐름의 두 가지 흐름을 제공합니다.

이러한 흐름 중 하나를 완료하면 역할의 액세스 정책에 정의된 AWS 서비스 대로 다른에 액세스할 수 있습니다. 기본적으로 [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/)은 Amazon Cognito Sync 스토어 및 Amazon Mobile Analytics에 액세스할 수 있는 역할을 생성합니다. 추가 액세스 권한을 부여하는 방법에 대한 자세한 내용은 [IAM 역할](iam-roles.md)을 참조하세요.

ID 풀은 공급자의 다음 아티팩트를 수락합니다.


| 제공업체 | 인증 아티팩트 | 
| --- | --- | 
| Amazon Cognito 사용자 풀 | ID 토큰 | 
| OIDC(OpenID Connect) | ID 토큰 | 
| SAML 2.0 | SAML 어설션 | 
| 소셜 공급자 | 액세스 토큰 | 

## 향상된(단순화된) 인증 흐름
<a name="authentication-flow-enhanced"></a>

향상된 인증 흐름을 사용하면 앱은 먼저 [GetId](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html) 요청에서 인증된 Amazon Cognito 사용자 풀 또는 타사 ID 제공업체의 인증 증명을 제공합니다.

1. 애플리케이션은 [GetID](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html) 요청에서 승인된 Amazon Cognito 사용자 풀 또는 타사 ID 제공업체의 JSON 웹 토큰 또는 SAML 어설션 인증 증명을 제공합니다.

1. 사용자의 ID 풀은 자격 증명 ID를 반환합니다.

1. 애플리케이션은 [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html) 요청에서 자격 증명 ID를 동일한 인증 증명과 결합합니다.

1. 자격 증명 풀은 AWS 자격 증명을 반환합니다.

1. 애플리케이션은 임시 자격 증명으로 AWS API 요청에 서명합니다.

향상된 인증은 ID 풀 구성에서 IAM 역할 선택 및 자격 증명 검색의 로직을 관리합니다. 기본 역할을 선택하고, 속성 기반 액세스 제어(ABAC) 또는 역할 기반 액세스 제어(RBAC) 원칙을 역할 선택에 적용하도록 ID 풀을 구성할 수 있습니다. 향상된 인증의 자격 AWS 증명은 1시간 동안 유효합니다.

**향상된 인증의 작업 순서**

1. `GetId`

1. `GetCredentialsForIdentity`

![\[향상된 인증의 흐름을 보여주는 다이어그램\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/amazon-cognito-ext-auth-enhanced-flow.png)


## 기본(클래식) 인증 흐름
<a name="authentication-flow-basic"></a>

기본 인증 흐름을 구현하면 애플리케이션에서 사용자가 수임할 IAM 역할을 선택합니다.

1. 애플리케이션은 [GetID](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html) 요청에서 승인된 Amazon Cognito 사용자 풀 또는 타사 ID 제공업체의 JSON 웹 토큰 또는 SAML 어설션 인증 증명을 제공합니다.

1. 사용자의 ID 풀은 자격 증명 ID를 반환합니다.

1. 애플리케이션은 [GetOpenIdToken](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html) 요청에서 자격 증명 ID를 동일한 인증 증명과 결합합니다.

1. `GetOpenIdToken`은 ID 풀에서 발급한 새 OAuth 2.0 토큰을 반환합니다.

1. 애플리케이션에서 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 요청에 새 토큰을 표시합니다.

1. AWS Security Token Service (AWS STS)는 AWS 자격 증명을 반환합니다.

1. 애플리케이션은 임시 자격 증명으로 AWS API 요청에 서명합니다.

기본 워크플로를 통해 사용자에게 배포하는 자격 증명을 보다 세밀하게 제어할 수 있습니다. 향상된 인증 흐름의 `GetCredentialsForIdentity` 요청은 액세스 토큰의 내용을 기반으로 역할을 요청합니다. 클래식 워크플로의 `AssumeRoleWithWebIdentity` 요청은 앱에 충분한 신뢰 정책으로 구성한 AWS Identity and Access Management 역할에 대한 자격 증명을 요청할 수 있는 더 많은 기능을 부여합니다. 사용자 지정 역할 세션 기간을 요청할 수도 있습니다.

역할 매핑이 없는 사용자 풀에서 기본 인증 흐름으로 로그인할 수 있습니다. 이 유형의 ID 풀에는 기본 인증 또는 인증되지 않은 역할이 없으며 역할 기반 또는 속성 기반 액세스 제어가 구성되어 있지 않습니다. 역할 매핑이 있는 ID 풀에서 `GetOpenIdToken`를 시도하면 다음과 같은 오류가 발생합니다.

```
Basic (classic) flow is not supported with RoleMappings, please use enhanced flow.
```

**기본 인증의 작업 순서**

1. `GetId`

1. `GetOpenIdToken`

1. `AssumeRoleWithWebIdentity`

![\[기본 인증의 흐름을 보여주는 다이어그램\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/amazon-cognito-ext-auth-basic-flow.png)


## 개발자가 인증한 인증 흐름
<a name="authentication-flow-developer"></a>

[개발자 인증 자격 증명](developer-authenticated-identities.md)을 사용할 때 클라이언트는 Amazon Cognito에 속하지 않는 코드가 포함된 다른 인증 흐름을 사용하여 자체 인증 시스템에서 사용자를 검증합니다. ID 풀의 관점에서 자격 증명에 대한 요청에 제시되는 클레임은 임의 식별자이며 인증은 애플리케이션에서 인코딩하는 IAM 자격 증명에 의해 승인됩니다.

**개발자 공급자를 통한 향상된 인증의 작업 순서**

1. 개발자 공급자를 통해 로그인(Amazon Cognito에 속하지 않는 코드)

1. 사용자 로그인 검증(Amazon Cognito에 속하지 않는 코드)

1. [GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html)

1. [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html)

![\[개발자 인증 향상된 인증의 흐름을 보여주는 다이어그램\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/amazon-cognito-dev-auth-enhanced-flow.png)


**개발자 공급자를 사용한 기본 인증의 작업 순서**

1. ID 풀 외부에서 로직을 구현하여 로그인하고 개발자-공급자 식별자를 생성합니다.

1. 저장된 서버 측 AWS 자격 증명을 검색합니다.

1. 승인된 AWS 자격 증명으로 서명된 [GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html) API 요청에서 개발자 공급자 식별자를 전송합니다.

1. [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)를 사용하여 애플리케이션 자격 증명을 요청합니다.

![\[개발자 인증 기본 인증의 흐름을 보여주는 다이어그램\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/amazon-cognito-dev-auth-basic-flow.png)


## 어떤 인증 흐름을 구현해야 하나요?
<a name="authentication-flow-choosing"></a>

**향상된 흐름**은 개발자의 노력이 가장 적게 들면서 가장 안전한 선택입니다.
+ 향상된 흐름은 API 요청의 복잡성, 크기 및 속도를 줄입니다.
+ 애플리케이션은 AWS STS에 추가 API 요청을 할 필요가 없습니다.
+ ID 풀은 사용자가 받아야 하는 IAM 역할 자격 증명에 대해 사용자를 평가합니다. 클라이언트에서 역할 선택을 위해 로직을 포함할 필요는 없습니다.

**중요**  
새 ID 풀을 생성할 때 모범 사례로 기본(클래식) 인증을 기본적으로 활성화하지 마세요. 기본 인증을 구현하려면 먼저 웹 ID에 대한 IAM 역할의 신뢰 관계를 평가합니다. 그런 다음 클라이언트에 역할 선택을 위한 로직을 빌드하고 사용자가 수정하지 못하도록 클라이언트를 보호하세요.

**기본 인증 흐름**은 IAM 역할 선택의 로직을 애플리케이션에 위임합니다. 이 흐름에서 Amazon Cognito는 사용자의 인증 또는 미인증 세션을 검증하고 자격 증명으로 교환할 수 있는 토큰을 발급합니다 AWS STS. 사용자는 기본 인증의 토큰을 ID 풀 및 `amr` 또는 인증됨/인증되지 않음 상태를 신뢰하는 모든 IAM 역할에 대해 교환할 수 있습니다.

마찬가지로 **개발자 인증**은 ID 제공업체 인증 검증의 지름길입니다. Amazon Cognito는 요청 내용에 대한 추가 검증 없이 [GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html) 요청을 승인하는 AWS 자격 증명을 신뢰합니다. 사용자의 액세스로부터 개발자 인증을 승인하는 보안 암호를 보호합니다.

## 인증 흐름 API 작업 개요
<a name="authentication-flow-operations"></a>

**GetId**  
[GetId](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html) API 호출은 Amazon Cognito에서 새 ID를 설정하는 데 필요한 첫 번째 호출입니다.    
인증되지 않은 액세스  
Amazon Cognito는 애플리케이션에서 인증되지 않은 게스트 액세스를 허용할 수 있습니다. 자격 증명 풀에서 이 기능이 활성화되면 사용자는 언제든지 `GetId` API를 통해 새 자격 증명 ID를 요청할 수 있습니다. 애플리케이션에서는 다음에 Amazon Cognito를 호출하기 위해 이 자격 증명 ID를 캐시해야 합니다. 브라우저의 AWS Mobile SDKs 및 AWS SDK for JavaScript에는이 캐싱을 처리하는 자격 증명 공급자가 있습니다.  
인증된 액세스  
퍼블릭 로그인 공급자(Facebook, Google\$1, Login with Amazon 또는 Sign in with Apple)의 지원을 통해 애플리케이션을 구성한 경우 사용자는 해당 공급자에서 자신을 식별하는 토큰(OAuth 또는 OpenID Connect)을 제공할 수도 있습니다. `GetId` 호출에 사용된 경우 Amazon Cognito는 새 인증 자격 증명을 생성하거나 이미 특정 로그인에 연결되어 있는 자격 증명을 반환합니다. Amazon Cognito는 공급자로 토큰을 검증하고 다음을 확인하여 이를 수행합니다.  
+ 토큰이 유효하며 구성된 공급자로부터 받음
+ 토큰이 만료되지 않음
+ 토큰이 해당 공급자를 통해 생성된 애플리케이션 식별자와 일치함(예: Facebook 앱 ID)
+ 토큰이 사용자 식별자와 일치함

**GetCredentialsForIdentity**  
자격 증명 ID를 설정한 후 [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html) API를 호출할 수 있습니다. 이 작업은 [GetOpenIdToken](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html)과 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)를 차례대로 호출하는 것과 기능적으로 동일합니다.  
사용자 대신 Amazon Cognito에서 `AssumeRoleWithWebIdentity`를 호출하기 위해 자격 증명 풀에 IAM 역할이 연결되어 있어야 합니다. Amazon Cognito 콘솔을 통하거나 [SetIdentityPoolRoles](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_SetIdentityPoolRoles.html) 작업을 통해 수동으로 이를 수행할 수 있습니다.

**GetOpenIdToken**  
자격 증명 ID를 설정한 후 [GetOpenIdToken](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html) API 요청을 수행합니다. 첫 번째 요청 후 자격 증명 ID를 캐시하고 `GetOpenIdToken`을 사용하여 해당 자격 증명에 대한 후속 기본(클래식) 세션을 시작합니다.  
`GetOpenIdToken` API 요청에 대한 응답은 Amazon Cognito가 생성하는 토큰입니다. 이 토큰을 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 요청의 `WebIdentityToken` 파라미터로 제출할 수 있습니다.  
OpenID 토큰을 제출하기 전에 앱에서 토큰을 확인하세요. SDK의 OIDC 라이브러리 또는 [https://github.com/awslabs/aws-jwt-verify](https://github.com/awslabs/aws-jwt-verify)와 같은 라이브러리를 사용하여 Amazon Cognito가 토큰을 발급했는지 확인할 수 있습니다. OpenID 토큰의 서명 키 ID, 즉 `kid`는 Amazon Cognito 자격 증명 [jwks\$1uri 문서](https://cognito-identity.amazonaws.com/.well-known/jwks_uri)†에 나열된 것 중 하나입니다. 이러한 키는 변경될 수 있습니다. Amazon Cognito 자격 증명 토큰을 확인하는 함수는 jwks\$1uri 문서에서 키 목록을 정기적으로 업데이트해야 합니다.** Amazon Cognito는 jwks\$1uri 캐시 제어 응답 헤더에 새로 고침 기간을 설정하며, 현재 `max-age`인 30일로 설정되어 있습니다.**    
인증되지 않은 액세스  
미인증 자격 증명에 대한 토큰을 얻으려면 자격 증명 ID 자체만 필요합니다. 인증된 자격 증명이나 비활성화된 자격 증명에 대한 미인증 토큰은 가져올 수 없습니다.  
인증된 액세스  
인증 자격 증명이 있는 경우 이미 해당 자격 증명과 연관된 로그인에 대해 유효한 토큰을 하나 이상 전달해야 합니다. `GetOpenIdToken`을 호출하는 동안 전달된 모든 토큰은 이전에 언급한 동일한 검증을 통과해야 합니다. 토큰 중 하나가 실패한 경우 전체 호출이 실패합니다. `GetOpenIdToken` 호출의 응답에도 자격 증명 ID가 포함됩니다. 이는 전달된 자격 증명 ID가 반환된 자격 증명 ID가 아닐 수도 있기 때문입니다.  
로그인 연결  
아직 자격 증명과 연관되지 않은 로그인에 대한 토큰을 제출하면 해당 로그인이 연관된 자격 증명에 '연결된' 것으로 간주됩니다. 퍼블릭 공급자당 로그인 하나만 연결할 수 있습니다. 퍼블릭 공급자에 로그인을 둘 이상 연결하려고 시도하면 `ResourceConflictException` 오류 응답이 발생합니다. 로그인이 기존 자격 증명에 연결만 되어 있는 경우 `GetOpenIdToken`에서 반환된 자격 증명 ID는 전달된 자격 증명 ID와 동일합니다.  
자격 증명 병합  
현재 지정된 자격 증명과 연결되지 않았지만 다른 자격 증명에 연결된 로그인에 대한 토큰을 전달하면 자격 증명 두 개가 병합됩니다. 병합되면 자격 증명 하나가 연관된 모든 로그인의 상위/소유자가 되며 다른 자격 증명이 비활성화됩니다. 이 경우 상위/소유자의 자격 증명 ID가 반환됩니다. 이 값이 다른 경우 로컬 캐시를 업데이트해야 합니다. 브라우저의 AWS Mobile SDKs AWS SDK for JavaScript의 공급자가이 작업을 자동으로 수행합니다.

**GetOpenIdTokenForDeveloperIdentity**  
개발자 인증 ID를 사용할 경우 [GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html) 작업은 디바이스에서 [GetId](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html) 및 [GetOpenIdToken](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html)의 사용을 대체합니다. 애플리케이션이 AWS 자격 증명으로 이 API 작업에 대한 요청에 서명하기 때문에 Amazon Cognito는 요청에 제공된 사용자 식별자가 유효하다고 신뢰합니다. 개발자 인증은 Amazon Cognito가 외부 공급자를 통해 수행하는 토큰 검증을 대체합니다.  
이 API의 페이로드에는 `logins` 맵이 포함됩니다. 이 맵에는 개발자 공급자의 키와 시스템의 사용자에 대한 식별자 값이 포함되어야 합니다. 사용자 식별자가 기존 자격 증명에 아직 연결되지 않은 경우 Amazon Cognito는 새 자격 증명을 생성하고 새 자격 증명 ID와 해당 자격 증명에 대한 OpenID Connect 토큰을 반환합니다. 사용자 식별자가 이미 연결된 경우 Amazon Cognito는 기존 자격 증명 ID와 OpenID Connect 토큰을 반환합니다. 첫 번째 요청 후 개발자 자격 증명 ID를 캐시하고 `GetOpenIdTokenForDeveloperIdentity`을 사용하여 해당 자격 증명에 대한 후속 기본(클래식) 세션을 시작합니다.  
`GetOpenIdTokenForDeveloperIdentity` API 요청에 대한 응답은 Amazon Cognito가 생성하는 토큰입니다. 이 토큰을 `AssumeRoleWithWebIdentity` 요청의 `WebIdentityToken` 파라미터로 제출할 수 있습니다.  
OpenID Connect 토큰을 제출하기 전에 앱에서 토큰을 확인하세요. SDK의 OIDC 라이브러리 또는 [https://github.com/awslabs/aws-jwt-verify](https://github.com/awslabs/aws-jwt-verify)와 같은 라이브러리를 사용하여 Amazon Cognito가 토큰을 발급했는지 확인할 수 있습니다. OpenID 토큰의 서명 키 ID, 즉 `kid`는 Amazon Cognito 자격 증명 [**jwks\$1uri 문서](https://cognito-identity.amazonaws.com/.well-known/jwks_uri)†에 나열된 것 중 하나입니다. 이러한 키는 변경될 수 있습니다. Amazon Cognito 자격 증명 토큰을 확인하는 함수는 **jwks\$1uri 문서에서 키 목록을 정기적으로 업데이트해야 합니다. Amazon Cognito는 **jwks\$1uri `cache-control` 응답 헤더에 새로 고침 기간을 설정하며, 현재 `max-age`인 30일로 설정되어 있습니다.    
로그인 연결  
외부 공급자와 마찬가지로 아직 자격 증명에 연결되지 않은 추가 로그인을 제공하면 이러한 로그인과 해당 자격 증명이 암시적으로 연결됩니다. 외부 공급자 로그인을 자격 증명에 연결하면 사용자는 해당 공급자와 함께 외부 공급자 인증 흐름을 사용할 수 있습니다. 하지만 `GetId` 또는 `GetOpenIdToken`을 호출할 때는 로그인 맵에서 개발자 공급자 이름을 사용할 수 없습니다.  
자격 증명 병합  
개발자 인증 자격 증명을 사용하면 Amazon Cognito는 [MergeDeveloperIdentities](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_MergeDeveloperIdentities.html) API를 통해 암시적 병합과 명시적 병합을 모두 지원합니다. 이러한 명시적 병합을 통해 시스템에서 사용자 식별자가 있는 두 개의 자격 증명을 단일 자격 증명으로 표시할 수 있습니다. 소스 및 대상 사용자 식별자를 제공하기만 하면 Amazon Cognito에서는 이를 병합합니다. 다음에 이 두 사용자 식별자에 대한 OpenId Connect 토큰을 요청하면 동일한 자격 증명 ID가 반환됩니다.

**AssumeRoleWithWebIdentity**  
OpenID Connect 토큰이 있으면 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 요청을 통해 이를 임시 AWS 자격 증명으로 교환할 수 있습니다 AWS Security Token Service (AWS STS).  
생성할 수 있는 자격 증명의 수에 대한 제한이 없으므로 사용자에게 부여되는 권한을 이해하는 것이 중요합니다. 애플리케이션에 대해 서로 다른 IAM 역할, 즉 인증되지 않은 사용자에 대한 역할과 인증된 사용자에 대한 역할을 설정합니다. Amazon Cognito 콘솔은 ID 풀을 처음 설정할 때 기본 역할을 생성할 수 있습니다. 이러한 역할에는 사실상 권한이 부여되지 않습니다. 필요에 맞게 수정합니다.  
[역할 트러스트 및 권한](iam-roles.md#role-trust-and-permissions)에 대해 자세히 알아보세요.

† 기본 Amazon Cognito 자격 증명 [jwks\$1uri](https://cognito-identity.amazonaws.com/.well-known/jwks_uri) 문서에는 대부분의 AWS 리전에 있는 자격 증명 풀의 토큰을 서명하는 키에 대한 정보가 포함되어 있습니다.** 다음 리전에는 서로 다른 jwks\$1uri 문서가 있습니다.**


| AWS 리전 | **jwks\$1uri 문서의 경로 | 
| --- |--- |
| AWS GovCloud (US-West) | https://cognito-identity.us-gov-west-1.amazonaws.com/.well-known/jwks\$1uri | 
| China (Beijing) | https://cognito-identity---cn-north-1.amazonaws.com.rproxy.govskope.us.cn/.well-known/jwks\$1uri | 
| Opt-in Regions like Europe (Milan) and Africa (Cape Town) | https://cognito-identity.리전.amazonaws.com/.well-known/jwks\$1uri | 

발급자(`iss`)가 제공한 jwks\$1uri를 외삽하거나 Amazon Cognito로부터 OpenID 토큰에서 jwks\$1uri를 외삽할 수도 있습니다.** OIDC 표준 검색 엔드포인트 `<issuer>/.well-known/openid-configuration`는 토큰의 **jwks\$1uri 경로를 나열합니다.

# IAM 역할
<a name="iam-roles"></a>

자격 증명 풀을 생성하는 동안 사용자가 맡을 IAM 역할을 업데이트하라는 메시지가 표시됩니다. 사용자가 앱에 로그인할 때 Amazon Cognito는 사용자에 대해 임시 AWS 자격 증명을 생성합니다. IAM 역할은 이런 식으로 작동합니다. 이러한 임시 자격 증명은 특정 IAM 역할에 연결됩니다. IAM 역할을 사용하면 AWS 리소스에 액세스할 수 있는 일련의 권한을 정의할 수 있습니다.

인증 및 미인증 사용자에 대해 기본 IAM 역할을 지정할 수 있습니다. 또한 사용자의 ID 토큰에 있는 클레임에 따라 각 사용자에 대한 역할을 선택하는 규칙을 정의할 수 있습니다. 자세한 내용은 [역할 기반 액세스 제어 사용](role-based-access-control.md) 섹션을 참조하세요.

기본적으로 Amazon Cognito 콘솔은 Amazon Mobile Analytics 및 Amazon Cognito Sync에 대한 액세스 권한을 제공하는 IAM 역할을 생성합니다. 또는 기존 IAM 역할을 사용하도록 선택할 수 있습니다.

다른 서비스에 대한 액세스를 허용하거나 제한하도록 IAM 역할을 수정합니다. 이렇게 하려면 [IAM 콘솔에 로그인합니다](https://console.aws.amazon.com/iam/home). 그런 다음 **역할(Roles)**을 선택하고 역할을 선택합니다. 선택한 역할에 연결된 정책은 **권한(Permissions)** 탭에 나열됩니다. 해당하는 **정책 관리(Manage Policy)** 링크를 선택하여 액세스 정책을 사용자 지정할 수 있습니다. 정책 사용 및 정의에 대한 자세한 내용은 [IAM 정책 개요](https://docs.aws.amazon.com/IAM/latest/UserGuide/PoliciesOverview.html)를 참조하세요.

**참고**  
가장 좋은 방법은 *최소 권한* 부여 원칙을 따르는 정책을 정의하는 것입니다. 다시 말해, 해당 정책은 사용자가 작업을 수행하는 데 필요한 권한만을 포함합니다. 자세한 내용은 *IAM 사용 설명서*에서 [최소 권한 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)를 참조하세요.  
인증되지 않은 자격 증명은 앱에 로그인하지 않은 사용자에 의해 수임된다는 점을 유의하세요. 일반적으로, 인증되지 않은 자격 증명에 할당한 권한은 인증된 자격 증명의 권한보다 더 제한적이어야 합니다.

**Topics**
+ [

## 트러스트 정책 설정
](#trust-policies)
+ [

## 액세스 정책
](#access-policies)
+ [

## 역할 트러스트 및 권한
](#role-trust-and-permissions)

## 트러스트 정책 설정
<a name="trust-policies"></a>

Amazon Cognito는 IAM 역할을 사용하여 애플리케이션의 사용자에 대한 임시 자격 증명을 생성합니다. 권한에 대한 액세스는 역할의 신뢰 관계에 의해 제어됩니다. [역할 트러스트 및 권한](#role-trust-and-permissions) 섹션에 대해 자세히 알아봅니다. Amazon Cognito는 AWS STS 및 자격 증명 풀 IdPs.

에 표시되는 토큰 AWS STS 은 사용자 풀, 소셜 또는 OIDC 공급자 토큰 또는 SAML 어설션을 자체 토큰으로 변환하는 자격 증명 풀에 의해 생성됩니다. 자격 증명 풀 토큰에는 자격 증명 풀 ID인 `aud` 클레임이 포함되어 있습니다.

IAM 역할 신뢰 정책의 `Principal`가 `cognito-identity.amazonaws.com`과 같은 ID 풀 서비스 보안 주체인 경우 모든 ID 풀이 역할을 수임하도록 허용하는 역할 신뢰 정책을 생성하거나 수정할 수 없습니다. ID 풀 보안 주체의 경우 `Action` 요소에 `cognito-identity.amazonaws.com:aud`과 같은 조건 키로 지정된 대로 ID 풀에서만 `AssumeRoleWithWebIndentity`를 수행해야 하는 `Condition`이 있어야 합니다. 다른 조건 키를 사용할 수 있지만 `aud`는 필수입니다. 이 유형의 조건 없이 역할 신뢰 정책을 저장하려고 하면 IAM에서 오류를 반환합니다.

OIDC(웹 자격 증명) 페더레이션 키에 대한 자세한 내용은 [AWS OIDC 페더레이션에 사용 가능한 키를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-wif) 참조하세요.

다음은 Amazon Cognito에 사용할 수 있는 OIDC 페더레이션 조건 키입니다.

**`cognito-identity.amazonaws.com:aud`**  
역할을 하나 이상의 ID 풀에서 작업으로 제한합니다. Amazon Cognito는 ID 풀 토큰의 `aud` 클레임에 있는 소스 ID 풀을 나타냅니다.

**`cognito-identity.amazonaws.com:amr`**  
역할을 `authenticated` 또는 `unauthenticated`(게스트) 사용자로 제한합니다. Amazon Cognito는 ID 풀 토큰의 `amr` 클레임에 인증 상태를 나타냅니다.

**`cognito-identity.amazonaws.com:sub`**  
[UUID](cognito-terms.md#terms-uuid)를 통해 역할을 한 명 이상의 사용자로 제한합니다. 이 UUID는 ID 풀에 있는 사용자의 자격 증명 ID입니다. 이 값은 사용자의 원래 ID 제공업체의 `sub` 값이 아닙니다. Amazon Cognito는 이 UUID를 ID 풀 토큰의 `sub` 클레임에 나타냅니다.

다음 예제 역할 신뢰 정책은 페더레이션 서비스 보안 주체가 AWS STS API를 호출`cognito-identity.amazonaws.com`하도록 허용합니다`AssumeRoleWithWebIdentity`. API 요청의 자격 증명 풀 토큰에 다음과 같은 클레임이 있는 경우에만 요청이 성공합니다.

1. 자격 증명 풀 ID `us-west-2:abcdefg-1234-5678-910a-0e8443553f95`에 대한 `aud` 클레임.

1. 사용자가 로그인했지만 게스트 사용자가 아닌 경우에 추가되는 `authenticated`에 대한 `amr` 클레임.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "cognito-identity.amazonaws.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "cognito-identity.amazonaws.com:aud": "us-west-2:abcdefg-1234-5678-910a-0e8443553f95"
                },
                "ForAnyValue:StringLike": {
                    "cognito-identity.amazonaws.com:amr": "authenticated"
                }
            }
        }
    ]
}
```

------

### 기본(클래식) 인증의 IAM 역할에 대한 신뢰 정책
<a name="trust-policies-classic"></a>

**요약**  
ID 풀은 대상 역할의 신뢰 정책에 `aud` 조건이 포함된 경우에만 [기본 인증 흐름](authentication-flow.md#authentication-flow-basic)에서 사용자를 대신하여 역할을 맡을 수 있습니다.

기본 인증은 향상된 인증과 마찬가지로 안전하지 않은 역할 신뢰 정책에 대한 제한이 있습니다. 지원되는 ID 풀을 `aud` 조건으로 제한하지 않는 역할 신뢰 정책은 저장할 수 없습니다. 이 제한은 서비스가 시작될 때 적용되지 않았습니다. 이 요구 사항을 적용하기 전에 추가 보안 조건이 없는 역할 신뢰 정책을 생성할 수 있습니다. 이 요구 사항을 적용한 후는 조건으로 보호되지 않는 역할을 수임하도록 웹 자격 증명을 AWS STS 허용하지만 이러한 조건을 도입하지 않으면 해당 역할을 **수정할 수 없습니다**.

향상된 흐름 인증을 사용하려면 IAM 역할이 ID 풀과 동일한 AWS 계정 에 있어야 합니다. 그러나 애플리케이션이 `AssumeRoleWithWebIdentity` 요청을 구성하는 기본 인증에서는 애플리케이션이 다른 계정에서 역할을 맡도록 요청할 수 있습니다. 대상 역할에 `aud` 조건을 적용하지 않는 레거시 신뢰 정책이 있는 경우 [교차 계정](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html) 수임 역할 요청이 실패합니다.

자격 증명 풀이 자격 증명에 대해 발급하는 토큰에는 자격 증명 풀 AWS 계정 의 원본에 대한 정보가 포함됩니다. [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 요청에 자격 증명 풀 토큰을 제시하면는 발신 자격 증명 풀이 AWS 계정 IAM 역할과 동일한에 있는지 AWS STS 확인합니다. 에서 요청이 교차 계정이라고 AWS STS 판단하면 역할 신뢰 정책에 `aud` 조건이 있는지 확인합니다. 역할 신뢰 정책에 해당 조건이 없으면 **assume-role 호출은 실패합니다**. 요청이 교차 계정이 아닌 경우이 제한을 적용 AWS STS 하지 않습니다. 가장 좋은 방법은 항상 이 유형의 조건을 ID 풀 역할의 신뢰 정책에 적용하는 것입니다.

다음은 여러 ID 풀을 사용한 기본 인증을 위한 IAM 역할의 *최소* 요구 사항을 충족하는 신뢰 정책의 예입니다. 가장 좋은 방법은 `"cognito-identity.amazonaws.com:amr": "authenticated"` 조건이 있는 인증된 ID만 허용하는 것입니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "cognito-identity.amazonaws.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "cognito-identity.amazonaws.com:aud": [
                        "us-west-2:abcdefg-1234-5678-910a-0e8443553f95",
                        "us-west-2:hijklmo-5678-9101-112b-0e4221776g96",
                        "us-west-2:pqrstuv-9101-1121-314c-0e2110887h97"
                    ]
                }
            }
        }
    ]
}
```

------

### 추가 신뢰 정책 조건
<a name="trust-policies-examples"></a>

다음 신뢰 정책 조건을 사용하여 IAM 역할을 맡을 수 있는 소스 ID 풀, ID 및 제공업체를 정의할 수 있습니다.

**참고**  
[향상된 인증 흐름](authentication-flow.md#authentication-flow-enhanced)에서 ID 풀이 수임하는 IAM 역할에 대한 신뢰 정책에서 [aws:SourceIp](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceip) 조건 키를 구현하지 마세요. 향상된 흐름은 애플리케이션을 대신하여 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 요청을 생성하기 때문에 요청의 소스 IP는 애플리케이션 클라이언트의 IP가 아니며 조건이 충족되지 않습니다. 네트워크 기반 조건 키는 향상된 흐름의 서비스 측 기능이 부족한 [기본 흐름](authentication-flow.md#authentication-flow-basic)을 *통해서만* ID 풀이 맡는 역할에 유효합니다.

**자격 증명 풀에서 역할 재사용**  
여러 자격 증명 풀에서 역할을 재사용하려면 역할이 공통 권한 집합을 공유하므로 다음과 같이 여러 자격 증명 풀을 포함할 수 있습니다.

```
"StringEquals": {
    "cognito-identity.amazonaws.com:aud": [
        "us-east-1:12345678-abcd-abcd-abcd-123456790ab",
        "us-east-1:98765432-dcba-dcba-dcba-123456790ab"
    ]
}
```

**특정 자격 증명으로 액세스 제한**  
특정 앱 사용자 집합에 제한된 정책을 생성하려면 `cognito-identity.amazonaws.com:sub` 값을 선택하세요.

```
"StringEquals": {
    "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-abcd-abcd-abcd-123456790ab",
    "cognito-identity.amazonaws.com:sub": [
        "us-east-1:12345678-1234-1234-1234-123456790ab",
        "us-east-1:98765432-1234-1234-1243-123456790ab"
    ]
}
```

**특정 공급자로 액세스 제한**  
특정 공급자(고유한 로그인 공급자)를 통해 로그인한 사용자에 제한된 정책을 생성하려면 `cognito-identity.amazonaws.com:amr` 값을 선택하세요.

```
"ForAnyValue:StringLike": {
    "cognito-identity.amazonaws.com:amr": "login.myprovider.myapp"
}
```

예를 들어, Facebook만 신뢰하는 앱에는 다음 amr 절이 있습니다.

```
"ForAnyValue:StringLike": {
    "cognito-identity.amazonaws.com:amr": "graph.facebook.com"
}
```

## 액세스 정책
<a name="access-policies"></a>

역할에 연결하는 권한은 해당 역할을 맡은 모든 사용자에게 적용됩니다. 사용자의 액세스를 분할하려면 정책 조건 및 변수를 사용해야 합니다. 자세한 내용은 [IAM 정책 요소: 변수 및 태그](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html) 단원을 참조하세요. `sub` 조건을 사용하여 액세스 정책에서 Amazon Cognito ID에 대한 작업을 제한할 수 있습니다. 이 옵션은 주의해서 사용해야 하며, 일관된 사용자 ID가 부족한 미인증 ID의 경우에는 더욱 주의해야 합니다. Amazon Cognito와의 웹 페더레이션을 위한 IAM 정책 변수에 대한 자세한 내용은 *AWS Identity and Access Management 사용 설명서*의 [IAM 및 AWS STS 조건 컨텍스트 키를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-wif) 참조하세요.

보안 강화를 위해, Amazon Cognito는 `GetCredentialsForIdentity`를 사용하여 [향상된 흐름](https://docs.aws.amazon.com/cognito/latest/developerguide/authentication-flow.html)에서 미인증 사용자에 할당된 보안 인증 정보에 범위 축소 정책을 적용합니다. 범위 축소 정책은 미인증 역할에 적용하는 IAM 정책에 [인라인 세션 정책](#access-policies-inline-policy) 및 [AWS 관리형 세션 정책](#access-policies-managed-policy)을 추가합니다. 역할에 대한 IAM 정책과 세션 정책 모두에서 액세스 권한을 부여해야 하므로, 범위 축소 정책은 다음 목록에 있는 서비스 이외의 서비스에 대한 사용자의 액세스를 제한합니다.

**참고**  
기본(클래식) 흐름에서는 자체 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 요청을 하고, 이러한 제한을 요청에 적용할 수 있습니다. 보안 모범 사례는 미인증 사용자에게 이 범위 제한 정책을 초과하는 권한을 할당하지 않는 것입니다.

또한 Amazon Cognito는 인증된 사용자와 인증되지 않은 사용자가 Amazon Cognito 자격 증명 풀 및 Amazon Cognito Sync에 API를 요청하는 것을 방지합니다. 다른 에서는 웹 자격 증명의 서비스 액세스를 제한할 AWS 서비스 수 있습니다.

향상된 흐름으로 요청을 하는 데 성공하면, Amazon Cognito가 백그라운드에서 `AssumeRoleWithWebIdentity` API 요청을 합니다. 이 요청의 파라미터 중에서 Amazon Cognito에는 다음이 포함됩니다.

1. 사용자의 자격 증명 ID입니다.

1. 사용자가 수임할 IAM 역할의 ARN입니다.

1. *인라인 세션 정책*을 추가하는`policy` 파라미터입니다.

1. Amazon CloudWatch에서 추가 권한을 부여하는AWS 관리형 정책이 값인 `PolicyArns.member.N` 파라미터입니다.**

### 미인증 사용자가 액세스할 수 있는 서비스
<a name="access-policies-scope-down-services"></a>

향상된 흐름을 사용하는 경우, Amazon Cognito가 사용자 세션에 적용하는 범위 축소 정책에 따라 사용자는 다음 표에 나열된 서비스 이외의 서비스를 사용할 수 없습니다. 일부 서비스의 경우, 특정 작업만 허용됩니다.


| 카테고리 | 서비스 | 
| --- | --- | 
|  분석  |  Amazon Data Firehose Amazon Managed Service for Apache Flink  | 
|  애플리케이션 통합  |  Amazon Simple Queue Service  | 
| AR 및 VR |  Amazon Sumerian¹  | 
| 비즈니스 애플리케이션 |  Amazon Mobile Analytics Amazon Simple Email Service  | 
| 컴퓨팅 |  AWS Lambda  | 
| 암호화 및 PKI |  AWS Key Management Service 1  | 
| Database |  Amazon DynamoDB Amazon SimpleDB  | 
| 프런트 엔드 웹 및 모바일 |  AWS AppSync Amazon Location Service  Amazon Simple Notification Service Amazon Pinpoint Amazon Location Service  | 
| 게임 개발 |  Amazon GameLift Servers  | 
| 사물 인터넷(IoT) |  AWS IoT  | 
| 기계 학습 |  Amazon CodeWhisperer Amazon Comprehend Amazon Lex Amazon Machine Learning Amazon Personalize Amazon Polly Amazon Rekognition Amazon SageMaker AI¹ Amazon Textract¹ Amazon Transcribe Amazon Translate  | 
| 관리 및 거버넌스 |  Amazon CloudWatch Amazon CloudWatch Logs  | 
| 네트워킹 및 콘텐츠 전송 |  Amazon API Gateway  | 
| 보안, 자격 증명 및 규정 준수 |  Amazon Cognito 사용자 풀  | 
| 스토리지 |  Amazon Simple Storage Service  | 

1 다음 표의 AWS 서비스 의 경우 인라인 정책은 작업의 하위 집합을 부여합니다. 표에는 각 항목에서 사용할 수 있는 작업이 표시됩니다.


| AWS 서비스 | 미인증 향상된 흐름 사용자의 최대 권한 | 
| --- | --- | 
| AWS Key Management Service |  `Encrypt` `Decrypt` `ReEncryptTo` `ReEncryptFrom` `GenerateDataKey` `GenerateDataKeyPair` `GenerateDataKeyPair` `GenerateDataKeyPairWithoutPlaintext` `GenerateDataKeyWithoutPlaintext`  | 
| Amazon SageMaker AI |  `InvokeEndpoint`  | 
| Amazon Textract |  `DetectDocumentText` `AnalyzeDocument`  | 
| Amazon Sumerian |  `View*`  | 
| Amazon Location Service |  `SearchPlaceIndex*` `GetPlace` `CalculateRoute*` `*Geofence` `*Geofences` `*DevicePosition*`  | 

이 목록을 AWS 서비스 넘어에 대한 액세스 권한을 부여하려면 자격 증명 풀에서 **기본(클래식) 인증 흐름을** 활성화합니다. 인증되지 않은 사용자의 IAM 역할에 할당된 정책에서 AWS 서비스 허용하는의 `NotAuthorizedException` 오류가 사용자에게 표시되는 경우 사용 사례에서 해당 서비스를 제거할 수 있는지 평가합니다. 제거할 수 없다면 기본 흐름으로 전환하세요.

### 게스트 사용자를 위한 인라인 세션 정책
<a name="access-policies-inline-policy"></a>

Amazon Cognito는 먼저 IAM 자격 증명 요청에 인라인 정책을 적용합니다. 인라인 세션 정책은 사용자의 유효 권한에 다음 목록에 나오지 않는 AWS 서비스 에 대한 액세스를 포함하지 못하게 합니다. 또한 사용자의 IAM 역할에 적용하는 정책 AWS 서비스 에서 이러한에 권한을 부여해야 합니다. 수임하는 역할 세션에 대한 사용자의 유효 권한은 해당 역할에 할당된 정책과 관련 세션 정책의 교차점입니다. 자세한 정보는 *AWS Identity and Access Management 사용 설명서*의 [세션 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)을 참조하세요.

Amazon Cognito는 기본적으로 활성화된  AWS 리전 의 사용자 세션에 다음과 같은 인라인 정책을 추가합니다. 인라인 정책 및 기타 세션 정책의 순 효과에 대한 개요는 [미인증 사용자가 액세스할 수 있는 서비스](#access-policies-scope-down-services) 섹션을 참조하세요.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:*",
                "logs:*",
                "dynamodb:*",
                "kinesis:*",
                "mobileanalytics:*",
                "s3:*",
                "ses:*",
                "sns:*",
                "sqs:*",
                "lambda:*",
                "machinelearning:*",
                "execute-api:*",
                "iot:*",
                "gamelift:*",
                "cognito-identity:*",
                "cognito-idp:*",
                "lex:*",
                "polly:*",
                "comprehend:*",
                "translate:*",
                "transcribe:*",
                "rekognition:*",
                "mobiletargeting:*",
                "firehose:*",
                "appsync:*",
                "personalize:*",
                "sagemaker:InvokeEndpoint",
                "cognito-sync:*",
                "codewhisperer:*",
                "textract:DetectDocumentText",
                "textract:AnalyzeDocument",
                "sdb:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

다른 모든 리전의 경우, 인라인 범위 축소 정책에는 다음 `Action` 문을 제외하고 기본 리전에 나열된 모든 항목이 포함됩니다.

```
                "cognito-sync:*",
                "sumerian:View*",
                "codewhisperer:*",
                "textract:DetectDocumentText",
                "textract:AnalyzeDocument",
                "sdb:*"
```

### 게스트에 대한 AWS 관리형 세션 정책
<a name="access-policies-managed-policy"></a>

또한 Amazon Cognito는 AWS 관리형 정책을 인증되지 않은 게스트의 향상된 흐름 세션에 세션 정책으로 적용합니다. 이 정책은 `AmazonCognitoUnAuthedIdentitiesSessionPolicy` 정책으로 인증되지 않은 사용자의 권한 범위를 제한합니다.

인증되지 않은 IAM 역할에 연결하는 정책에서도 이 권한을 부여해야 합니다. 수임하는 역할 세션에 대한 사용자의 유효 권한은 해당 역할에 할당된 IAM 정책과 관련 세션 정책의 교차점입니다. 자세한 정보는 *AWS Identity and Access Management 사용 설명서*의 [세션 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)을 참조하세요.

이 AWS 관리형 정책 및 기타 세션 정책의 순 효과에 대한 개요는 섹션을 참조하세요[미인증 사용자가 액세스할 수 있는 서비스](#access-policies-scope-down-services).

`AmazonCognitoUnAuthedIdentitiesSessionPolicy` 관리형 정책에는 다음 권한이 있습니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Effect": "Allow",
        "Action": [
            "rum:PutRumEvents",
            "polly:*",
            "comprehend:*",
            "translate:*",
            "transcribe:*",
            "rekognition:*",
            "mobiletargeting:*",
            "firehose:*",
            "personalize:*",
            "sagemaker:InvokeEndpoint",
            "geo:GetMap*",
            "geo:SearchPlaceIndex*",
            "geo:GetPlace",
            "geo:CalculateRoute*",
            "geo:*Geofence",
            "geo:*Geofences",
            "geo:*DevicePosition*",
            "kms:Encrypt",
            "kms:Decrypt",
            "kms:ReEncryptTo",
            "kms:ReEncryptFrom",
            "kms:GenerateDataKey",
            "kms:GenerateDataKeyPair",
            "kms:GenerateDataKeyPairWithoutPlaintext",
            "kms:GenerateDataKeyWithoutPlaintext"
        ],
        "Resource": "*"
    }]
}
```

------

### 액세스 정책 예제
<a name="access-policy-examples"></a>

이 섹션에서는 특정 작업을 완료하는 데 필요한 최소 권한만 사용자에게 부여하는 Amazon Cognito 액세스 정책의 예시를 찾을 수 있습니다. 가능한 경우 정책 변수를 사용하여 지정된 자격 증명 ID에 대한 권한을 한층 더 제한할 수 있습니다. 예를 들면, \$1\$1cognito-identity.amazonaws.com:sub\$1를 사용합니다. 자세한 내용은 *AWS 모바일 블로그*에서 [Amazon Cognito 인증 이해 3부: 역할 및 정책](https://aws.amazon.com/blogs/mobile/understanding-amazon-cognito-authentication-part-3-roles-and-policies/)을 참조하세요.

**참고**  
보안 모범 사례로, 정책은 사용자가 작업을 수행하는 데 필요한 권한만을 포함해야 합니다. 다시 말해서 가능한 경우 항상 액세스 범위를 객체에 대한 개별 자격 증명으로 조정해야 합니다.

**Amazon S3에서 단일 객체에 대한 읽기 권한을 자격 증명에 부여**  
다음 액세스 정책은 지정된 S3 버킷에서 단일 객체를 검색할 수 있는 읽기 권한을 자격 증명에게 부여합니다.

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

****  

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

------

**Amazon S3에서 자격 증명 관련 경로에 대한 읽기 및 쓰기 권한을 모두 자격 증명에 부여**  
다음 액세스 정책은 접두사를 `${cognito-identity.amazonaws.com:sub}` 변수에 매핑하여 S3 버킷에서 특정 접두사 “folder”에 액세스할 수 있는 읽기 및 쓰기 권한을 부여합니다.

이 정책을 사용하면 `${cognito-identity.amazonaws.com:sub}`를 통해 삽입된 `us-east-1:12345678-1234-1234-1234-123456790ab`와 같은 자격 증명은 객체를 `arn:aws:s3:::amzn-s3-demo-bucket/us-east-1:12345678-1234-1234-1234-123456790ab`로 가져오고 넣고 나열할 수 있습니다. 하지만 `arn:aws:s3:::amzn-s3-demo-bucket`의 다른 객체에 대한 액세스는 이 자격 증명에게 부여되지 않습니다.

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

****  

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

------

[Amazon S3 Access Grants](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants.html)를 사용하면 유사한 액세스 모델을 얻을 수 있습니다.

**자격 증명에 Amazon DynamoDB에 대한 세분화된 액세스 권한 할당**  
다음 액세스 정책은 Amazon Cognito 환경 변수를 사용하여 Amazon DynamoDB 리소스에 대한 세분화된 액세스 제어를 제공합니다. 이러한 변수는 자격 증명 ID를 기준으로 DynamoDB의 항목에 대한 액세스 권한을 부여합니다. 자세한 내용은 *Amazon DynamoDB 개발자 가이드*에서 [IAM 정책 조건을 사용하여 세부적인 액세스 제어 구현](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/specifying-conditions.html)을 참조하세요.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:BatchGetItem",
        "dynamodb:Query",
        "dynamodb:PutItem",
        "dynamodb:UpdateItem",
        "dynamodb:DeleteItem",
        "dynamodb:BatchWriteItem"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-west-2:123456789012:table/MyTable"
      ],
      "Condition": {
        "ForAllValues:StringEquals": {
          "dynamodb:LeadingKeys":  ["${cognito-identity.amazonaws.com:sub}"]
        }
      }
    }
  ]
}
```

------

**Lambda 함수를 호출할 수 있는 권한을 자격 증명에 부여**  
다음 액세스 정책은 Lambda 함수를 호출할 수 있는 권한을 자격 증명에 부여합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
         { 
             "Effect": "Allow",
             "Action": "lambda:InvokeFunction",
             "Resource": [
                 "arn:aws:lambda:us-west-2:123456789012:function:MyFunction"
             ]
         }
     ]
 }
```

------

**레코드를 Amazon Kinesis Data Streams에 게시할 수 있는 권한을 자격 증명에 부여**  
다음 액세스 정책은 자격 증명이 Kinesis Data Streams 중 하나에 대해 `PutRecord` 작업을 사용하도록 허용합니다. 계정의 모든 스트림에 데이터 레코드를 추가해야 하는 사용자에게 이 정책을 적용할 수 있습니다. 자세한 내용은 *Amazon Kinesis Data Streams 개발자 가이드*에서 [IAM을 사용하여 Amazon Kinesis Data Streams 리소스에 대한 액세스 제어](https://docs.aws.amazon.com/streams/latest/dev/controlling-access.html)를 참조하세요.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kinesis:PutRecord",
            "Resource": [
                "arn:aws:kinesis:us-east-1:111122223333:stream/stream1"
            ]
        }
    ]
}
```

------

**Amazon Cognito Sync 스토어에 있는 자신의 데이터에 액세스할 수 있는 권한을 자격 증명에 부여**  
다음 액세스 정책은 Amazon Cognito Sync 스토어에 있는 자신의 데이터에만 액세스할 수 있는 권한을 자격 증명에 부여합니다.

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

****  

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

------

## 역할 트러스트 및 권한
<a name="role-trust-and-permissions"></a>

이러한 역할이 서로 다른 방식은 신뢰 관계에 있습니다. 다음은 인증되지 않은 역할에 대한 신뢰 정책의 예입니다.

------
#### [ 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": "unauthenticated"
        }
      }
    }
  ]
}
```

------

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

Amazon Cognito에서 토큰을 생성하면 해당 토큰의 `amr`을 `unauthenticated` 또는 `authenticated`로 설정합니다. `amr`이 `authenticated`이면 토큰에 인증 중에 사용되는 모든 공급자가 포함됩니다. 즉, `amr` 조건을 다음과 같이 변경하여 Facebook을 통해 로그인한 사용자만 신뢰하는 역할을 생성할 수 있습니다.

```
"ForAnyValue:StringLike": {
  "cognito-identity.amazonaws.com:amr": "graph.facebook.com"
}
```

역할에 대한 신뢰 관계를 변경할 때 또는 자격 증명 풀에 대해 역할을 사용하려고 시도할 때 주의를 기울이세요. 역할이 자격 증명 풀을 신뢰하도록 올바르게 구성되지 않은 경우 다음과 같은 STS 예외가 발생합니다.

```
AccessDenied -- Not authorized to perform sts:AssumeRoleWithWebIdentity
```

이러한 메시지가 표시되면 자격 증명 풀과 인증 유형에서 적절한 역할을 사용하는지 확인합니다.

# Amazon Cognito ID 풀을 위한 보안 모범 사례
<a name="identity-pools-security-best-practices"></a>

Amazon Cognito 자격 증명 풀은 애플리케이션에 대한 임시 AWS 자격 증명을 제공합니다. AWS 계정 에는 종종 애플리케이션 사용자에게 필요한 리소스와 프라이빗 백엔드 리소스가 모두 포함되어 있습니다. AWS 자격 증명을 구성하는 IAM 역할 및 정책은 이러한 리소스에 대한 액세스 권한을 부여할 수 있습니다.

ID 풀 구성의 주요 모범 사례는 애플리케이션이 과도하거나 의도하지 않은 권한 없이 작업을 완료할 수 있도록 하는 것입니다. 보안 구성 오류를 방지하려면 프로덕션에 릴리스하려는 각 애플리케이션을 시작하기 전에 이러한 권장 사항을 검토하세요.

**Topics**
+ [

## IAM 구성 모범 사례
](#identity-pools-security-best-practices-iam)
+ [

## ID 풀 구성 모범 사례
](#identity-pools-security-best-practices-cib)

## IAM 구성 모범 사례
<a name="identity-pools-security-best-practices-iam"></a>

게스트 또는 인증된 사용자가 애플리케이션에서 ID 풀 자격 증명이 필요한 세션을 시작하면 애플리케이션이 IAM 역할에 대한 임시 AWS 자격 증명을 검색합니다. 자격 증명은 기본 역할, ID 풀 구성의 규칙에 의해 선택된 역할 또는 앱에서 선택된 사용자 지정 역할에 대한 것일 수 있습니다. 각 역할에 할당된 권한을 통해 사용자는 AWS 리소스에 액세스할 수 있습니다.

일반적인 IAM 모범 사례에 대한 자세한 내용은 AWS Identity and Access Management 사용 설명서의 [IAM 모범 사례를](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) 참조하세요.

### IAM 역할에서 신뢰 정책 조건 사용
<a name="identity-pools-security-best-practices-iam-conditions"></a>

IAM을 사용하려면 ID 풀의 역할에 하나 이상의 신뢰 정책 조건이 있어야 합니다. 예를 들어이 조건은 역할의 범위를 인증된 사용자로만 설정할 수 있습니다. AWS STS 또한 교차 계정 기본 인증 요청에는 `cognito-identity.amazonaws.com:aud` 및 라는 두 가지 특정 조건이 있어야 합니다`cognito-identity.amazonaws.com:amr`. 가장 좋은 방법은 ID 풀 서비스 보안 주체 `cognito-identity.amazonaws.com`을 신뢰하는 모든 IAM 역할에 이러한 두 조건을 모두 적용하는 것입니다.
+ `cognito-identity.amazonaws.com:aud`: ID 풀 토큰의 *aud* 클레임은 신뢰할 수 있는 ID 풀 ID와 일치해야 합니다.
+ `cognito-identity.amazonaws.com:amr`: ID 풀 토큰의 *amr* 클레임은 *인증*되거나 *인증되지 않아야* 합니다. 이 조건에서는 인증되지 않은 게스트 또는 인증된 사용자에 대해서만 역할에 대한 액세스를 예약할 수 있습니다. 이 조건의 값을 추가로 구체화하여 `graph.facebook.com`과 같은 특정 공급자의 사용자로 역할을 제한할 수 있습니다.

다음 예제 역할 신뢰 정책은 다음 조건에서 역할에 대한 액세스 권한을 부여합니다.

------
#### [ 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:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}
```

------

**ID 풀과 관련된 요소**
+ `"Federated": "cognito-identity.amazonaws.com"`: 사용자는 ID 풀에서 와야 합니다.
+ `"cognito-identity.amazonaws.com:aud": "us-east-1:a1b2c3d4-5678-90ab-cdef-example11111"`: 사용자는 특정 ID 풀 `us-east-1:a1b2c3d4-5678-90ab-cdef-example11111`에서 와야 합니다.
+ `"cognito-identity.amazonaws.com:amr": "authenticated"`: 사용자를 인증해야 합니다. 게스트 사용자는 역할을 수임할 수 없습니다.

### 최소 권한 적용
<a name="identity-pools-security-best-practices-iam-least-privilege"></a>

인증된 액세스 또는 게스트 액세스에 대해 IAM 정책을 사용하여 권한을 설정할 때 특정 작업을 수행하는 데 필요한 특정 권한 또는 *최소 권한*만 부여합니다. 다음 예제 IAM 정책은 역할에 적용될 때 Amazon S3 버킷의 단일 이미지 파일에 대한 읽기 전용 액세스 권한을 부여합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::mybucket/assets/my_picture.jpg"]
    }
  ]
}
```

------

## ID 풀 구성 모범 사례
<a name="identity-pools-security-best-practices-cib"></a>

자격 증명 풀에는 AWS 자격 증명 생성을 위한 유연한 옵션이 있습니다. 애플리케이션이 가장 안전한 방법으로 작동할 수 있는 경우 디자인 바로 가기를 사용하지 마세요.

### 게스트 액세스의 영향 이해
<a name="identity-pools-security-best-practices-cib-guest"></a>

인증되지 않은 게스트 액세스를 사용하면 사용자가 로그인하기 전에 t사용자의 AWS 계정 에서 데이터를 검색할 수 있습니다. ID 풀 ID를 알고 있는 사람은 누구나 인증되지 않은 자격 증명을 요청할 수 있습니다. ID 풀 ID는 기밀 정보가 아닙니다. 게스트 액세스를 활성화하면 인증되지 않은 세션에 부여하는 AWS 권한을 모든 사용자가 사용할 수 있습니다.

모범 사례는 게스트 액세스를 비활성화한 상태로 두고 사용자가 인증한 후에만 필요한 리소스를 가져오는 것입니다. 애플리케이션에 로그인하기 전에 리소스에 대한 액세스 권한이 필요한 경우 다음 예방 조치를 취하세요.
+ [인증되지 않은 역할에 적용되는 자동 제한 사항](iam-roles.md#access-policies-scope-down-services)을 숙지합니다.
+ 애플리케이션의 특정 요구 사항에 맞게 인증되지 않은 IAM 역할의 권한을 모니터링하고 조정합니다.
+ 특정 리소스에 대한 액세스 권한을 부여합니다.
+ 인증되지 않은 기본 IAM 역할의 신뢰 정책을 보호합니다.
+ 인터넷에 있는 모든 사람에게 IAM 역할의 권한을 부여할 수 있다고 확신하는 경우에만 게스트 액세스를 활성화합니다.

### 기본적으로 향상된 인증 사용
<a name="identity-pools-security-best-practices-cib-enhanced"></a>

기본(클래식) 인증을 통해 Amazon Cognito는 IAM 역할 선택을 앱에 위임합니다. 반면 향상된 흐름은 ID 풀의 중앙 집중식 로직을 사용하여 IAM 역할을 결정합니다. 또한 IAM 권한에 대한 상한을 설정하는 [범위 축소 정책](iam-roles.md#access-policies-scope-down-services)을 통해 인증되지 않은 ID에 대한 추가 보안을 제공합니다. 향상된 흐름은 개발자의 노력이 가장 적게 들면서 가장 안전한 선택입니다. 이러한 옵션에 대해 자세히 알아보려면 [자격 증명 풀 인증 흐름](authentication-flow.md) 섹션을 참조하세요.

기본 흐름은 자격 증명에 대한 AWS STS API 요청의 역할 선택 및 조립에 들어가는 클라이언트 측 로직을 노출할 수 있습니다. 향상된 흐름은 ID 풀 자동화 뒤에 있는 로직 및 스태프 역할 요청을 모두 숨깁니다.

기본 인증을 구성할 때 IAM 역할 및 권한에 [IAM 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 적용합니다.

### 개발자 공급자를 안전하게 사용
<a name="identity-pools-security-best-practices-cib-developer"></a>

개발자 인증 ID는 서버 측 애플리케이션을 위한 ID 풀의 기능입니다. 자격 증명 풀이 개발자 인증에 필요한 인증의 유일한 증거는 자격 증명 풀 개발자의 AWS 자격 증명입니다. ID 풀은 이 인증 흐름에 표시되는 개발자-제공자 식별자의 유효성에 대한 제한을 적용하지 않습니다.

개발자 공급자는 다음 조건에서만 구현하는 것이 가장 좋습니다.
+ 개발자 인증 자격 증명 사용에 대한 책임을 생성하려면 개발자 공급자 이름과 식별자를 설계하여 인증 소스를 표시합니다. 예를 들어 `"Logins" : {"MyCorp provider" : "[provider application ID]"}`입니다.
+ 수명이 긴 사용자 자격 증명을 사용하지 마세요. [EC2 인스턴스 프로파일](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html) 및 [Lambda 실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)과 같은 서비스 연결 역할이 있는 ID를 요청하도록 서버 측 클라이언트를 구성합니다.
+ 동일한 ID 풀에서 내부 및 외부 신뢰 소스를 혼합하지 마세요. 개발자 공급자와 Single Sign-On(SSO) 공급자를 별도의 ID 풀에 추가합니다.

# 액세스 제어에 속성 사용
<a name="attributes-for-access-control"></a>

액세스 제어를 위한 속성은 ABAC(속성 기반 액세스 제어)의 Amazon Cognito 자격 증명 풀 구현입니다. IAM 정책을 사용하여 사용자 속성을 기반으로 Amazon Cognito 자격 증명 풀을 통한 AWS 리소스 액세스를 제어할 수 있습니다. 이러한 속성은 소셜 및 기업 자격 증명 공급자에서 가져올 수 있습니다. 공급자의 액세스 및 ID 토큰 또는 SAML 어설션 내의 속성을 IAM 권한 정책에서 참조되는 태그에 매핑할 수 있습니다.

Amazon Cognito 자격 증명 풀에서 기본 매핑을 선택하거나 사용자 지정 매핑을 생성할 수 있습니다. 기본 매핑을 사용하면 고정된 사용자 속성 세트를 기반으로 IAM 정책을 작성할 수 있습니다. 사용자 지정 매핑을 사용하면 IAM 권한 정책에서 참조되는 사용자 속성 세트를 선택할 수 있습니다. Amazon Cognito 콘솔의 **속성 이름**이 IAM 권한 정책에서 참조되는 태그인 **보안 주체의 태그 키**에 매핑됩니다.

예를 들어 무료 멤버십과 유료 멤버십이 있는 미디어 스트리밍 서비스를 보유하고 있다고 가정해 보겠습니다. 미디어 파일을 Amazon S3에 저장하고 무료 또는 프리미엄 태그로 태깅합니다. 액세스 제어를 위한 속성을 사용하여 사용자 프로필의 일부인 사용자 멤버십 수준에 따라 무료 및 유료 콘텐츠에 대한 액세스를 허용할 수 있습니다. IAM 권한 정책에 전달될 보안 주체의 태그 키에 멤버십 속성을 매핑할 수 있습니다. 이렇게 하면 단일 권한 정책을 생성하고 콘텐츠 파일의 멤버십 수준 및 태그 값에 따라 프리미엄 콘텐츠에 대한 액세스를 조건부로 허용할 수 있습니다.

**Topics**
+ [

## Amazon Cognito 자격 증명 풀에서 액세스 제어에 속성 사용
](#using-afac-with-cognito-identity-pools)
+ [

## 액세스 제어에 속성 사용 정책 예
](#using-attributes-for-access-control-policy-example)
+ [

## 액세스 제어를 위한 속성 끄기(콘솔)
](#disable-afac)
+ [

## 기본 공급자 매핑
](#provider-mappings)

속성을 사용하여 액세스를 제어하면 여러 가지 장점이 있습니다.
+ 액세스 제어를 위한 속성을 사용하면 더 효율적으로 권한을 관리할 수 있습니다. 직무별로 여러 개의 정책을 만드는 대신 사용자 속성을 사용하는 기본 권한 정책을 만들 수 있습니다.
+ 애플리케이션에 리소스 또는 사용자를 추가하거나 제거할 때마다 정책을 업데이트할 필요가 없습니다. 권한 정책은 일치하는 사용자 속성을 가진 사용자에게만 액세스 권한을 부여합니다. 예를 들어 사용자의 직책에 따라 특정 S3 버킷에 대한 액세스를 제어해야 할 수 있습니다. 이 경우 정의된 작책 내의 사용자만 이러한 파일에 액세스하도록 허용하는 권한 정책을 생성할 수 있습니다. 자세한 내용은 [IAM 자습서: ABAC에 SAML 세션 태그 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_abac-saml.html)을 참조하세요.
+ 해당 속성의 값에 따라 권한을 허용하거나 거부하는 정책에 속성을 보안 주체 태그로 전달할 수 있습니다.

## Amazon Cognito 자격 증명 풀에서 액세스 제어에 속성 사용
<a name="using-afac-with-cognito-identity-pools"></a>

액세스 제어에 속성을 사용하려면 먼저 다음 사전 요구 사항을 충족해야 합니다.
+ [AWS 계정](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html#aws-sign-up-identity-pools)
+ [사용자 풀](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)
+ [자격 증명 풀](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html#create-identity-pools)
+ [SDK 설정](getting-started-with-identity-pools.md#install-the-mobile-or-javascript-sdk)
+ [통합된 자격 증명 공급자](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html##integrate-the-identity-providers)
+ [보안 인증](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html#get-credentials)

액세스 제어를 위한 속성을 사용하기 위해서는 데이터 세트 소스로 설정한 **클레임**이 선택한 **태그 키**의 값을 설정합니다. Amazon Cognito는 태그 키와 값을 사용자 세션에 적용합니다. IAM 정책은 `${aws:PrincipalTag/tagkey}` 조건을 통해 사용자의 액세스를 평가할 수 있습니다. IAM은 정책과 비교하여 사용자 태그의 값을 평가합니다.

보안 인증 정보를 사용자에게 전달할 IAM 역할을 준비해야 합니다. 이러한 역할의 신뢰 정책에서 Amazon Cognito가 사용자에 대한 역할을 맡을 수 있도록 허용해야 합니다. 액세스 제어 속성의 경우 Amazon Cognito가 사용자 임시 세션에 보안 주체 태그를 적용할 수 있도록 허용해야 합니다. [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 작업을 통해 이러한 역할을 맡을 수 있는 권한을 부여합니다. [권한 전용 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awssecuritytokenservice.html#awssecuritytokenservice-actions-as-permissions) `sts:TagSession`을 사용하여 사용자 세션에 태그를 지정할 수 있는 권한을 부여합니다. 자세한 내용은 *AWS Identity and Access Management 사용 설명서*의 [AWS Security Token Service에서 세션 태그 전달](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html)을 참조하세요. Amazon Cognito 서비스 보안 주체 `cognito-identity.amazonaws.com`에 `sts:AssumeRoleWithWebIdentity` 및 `sts:TagSession` 권한을 부여하는 신뢰 정책의 예는 [액세스 제어에 속성 사용 정책 예](#using-attributes-for-access-control-policy-example) 섹션을 참조하세요.

**콘솔에서 액세스 제어를 위한 속성을 구성하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에 로그인하고 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체**를 찾습니다. 편집할 ID 제공업체를 선택합니다. 새 IdP를 추가하려면 **ID 제공업체 추가**를 선택합니다.

1. Amazon Cognito가 이 공급자를 통해 인증한 사용자에게 보안 인증을 발급할 때 할당하는 보안 주체 태그를 변경하려면 **액세스 제어를 위한 속성**에서 **편집**을 선택합니다.

   1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

   1. `sub` 및 `aud` 클레임 기반 보안 주체 태그를 적용하려면 **기본 매핑 사용**을 선택합니다.

   1. 보안 주체 태그에 대한 속성의 자체 사용자 지정 스키마를 생성하려면 **사용자 지정 매핑 사용**을 선택합니다. 그런 다음 태그에 표시하려는 각 **클레임**에서 소싱하려는 **태그 키**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

## 액세스 제어에 속성 사용 정책 예
<a name="using-attributes-for-access-control-policy-example"></a>

회사 법무 부서의 직원이 해당 부서에 속하고 보안 수준으로 분류된 버킷의 모든 파일을 나열해야 하는 시나리오를 생각해 보세요. 이 직원이 자격 증명 공급자로부터 가져온 토큰에 다음 클레임이 포함되어 있다고 가정합니다.

**클레임**

```
            { .
              .
            "sub" : "57e7b692-4f66-480d-98b8-45a6729b4c88",
            "department" : "legal",
            "clearance" : "confidential",
             .
             .
            }
```

이러한 속성은 태그에 매핑될 수 있으며 IAM 권한 정책에서 보안 주체 태그로 참조할 수 있습니다. 이제 자격 증명 제공자의 끝에서 사용자 프로파일을 변경하여 액세스를 관리할 수 있습니다. 또는 정책 자체를 변경하지 않고 이름이나 태그를 사용하여 리소스 측에서 속성을 변경할 수 있습니다.

다음 권한 정책은 두 가지 기능을 합니다.
+ 사용자의 부서 이름과 일치하는 접두사로 끝나는 모든 S3 버킷에 대한 목록 액세스를 허용합니다.
+ 파일의 승인 태그가 사용자의 승인 속성과 일치하는 한 이러한 버킷의 파일에 대한 읽기 액세스를 허용합니다.

**권한 정책**

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

****  

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

------

신뢰 정책은 이 역할을 수임할 수 있는 사용자를 결정합니다. 신뢰 관계 정책은 `sts:AssumeRoleWithWebIdentity` 및 `sts:TagSession`을 사용하여 액세스하도록 허용합니다. 생성한 자격 증명 풀로 정책을 제한하는 조건을 추가하고 인증된 역할에만 정책이 적용되도록 합니다.

**신뢰 정책**

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRoleWithWebIdentity",
        "sts:TagSession"
      ],
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "IDENTITY-POOL-ID"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}
```

------

## 액세스 제어를 위한 속성 끄기(콘솔)
<a name="disable-afac"></a>

액세스 제어를 위한 속성을 비활성화하려면 다음 절차를 따릅니다.

**액세스 제어를 위한 속성을 비활성화하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에 로그인하고 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체**를 찾습니다. 편집할 ID 제공업체를 선택합니다.

1. **액세스 제어를 위한 속성**에서 **편집**을 선택합니다.

1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

1. **변경 사항 저장**을 선택합니다.

## 기본 공급자 매핑
<a name="provider-mappings"></a>

다음 표에는 Amazon Cognito가 지원하는 인증 공급자에 대한 기본 매핑 정보가 나와 있습니다.


| 제공업체 | 토큰 유형 | 보안 주체 태그 값 | 예제 | 
| --- | --- | --- | --- | 
|  Amazon Cognito 사용자 풀  |  ID 토큰  |  aud(클라이언트 ID) 및 sub(사용자 ID)  |  "6jk8ltokc7ac9es6jrtg9q572f", "57e7b692-4f66-480d-98b8-45a6729b4c88"  | 
|  Facebook  |  액세스 토큰  |  aud(app\$1id), sub(user\$1id)  |  "492844718097981", "112177216992379"  | 
|  Google  |  ID 토큰  |  aud(클라이언트 ID) 및 sub(사용자 ID)  |  "620493171733-eebk7c0hcp5lj3e1tlqp1gntt3k0rncv.apps.googleusercontent.com", "109220063452404746097"  | 
|  SAML  |  어설션  |  "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" , "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"  |  "auth0\$15e28d196f8f55a0eaaa95de3", "user123@gmail.com"  | 
|  Apple  |  ID 토큰  |  aud(클라이언트 ID) 및 sub(사용자 ID)  |  "com.amazonaws.ec2-54-80-172-243.compute-1.client", "001968.a6ca34e9c1e742458a26cf8005854be9.0733"  | 
|  Amazon  |  액세스 토큰  |  aud (Client ID on Amzn Dev Ac), user\$1id(user ID)  |  "amzn1.application-oa2-client.9d70d9382d3446108aaee3dd763a0fa6", "amzn1.account.AGHNIFJQMFSBG3G6XCPVB35ORQAA"  | 
|  표준 OIDC 공급자  |  ID 및 액세스 토큰  |  aud (as client\$1id), sub (as user ID)  |  "620493171733-eebk7c0hcp5lj3e1tlqp1gntt3k0rncv.apps.googleusercontent.com", "109220063452404746097"  | 
|  Twitter  |  액세스 토큰  |  aud (app ID; app Secret), sub (user ID)  |  "DfwifTtKEX1FiIBRnOTlR0CFK;Xgj5xb8xIrIVCPjXgLIdkW7fXmwcJJrFvnoK9gwZkLexo1y5z1", "1269003884292222976"  | 
|  DevAuth  |  맵  |  해당 사항 없음  |  "tag1", "tag2"  | 

**참고**  
[**보안 주체의 태그 키(Tag Key for Principal)**] 및 [**속성 이름(Attribute names)**]에 기본 속성 매핑 옵션이 자동으로 채워집니다. 기본 매핑은 변경할 수 없습니다.

# 역할 기반 액세스 제어 사용
<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` 파라미터를 사용하여 토큰에서 올바른 역할을 확인할 수 없는 경우 실행할 기본 동작을 지정할 수 있습니다.

# 자격 증명 얻기
<a name="getting-credentials"></a>

Amazon Cognito를 사용하여 애플리케이션에 제한된 권한의 임시 자격 증명을 제공하여 사용자가 AWS 리소스에 액세스할 수 있도록 할 수 있습니다. 이 섹션에서는 자격 증명을 가져오는 방법과 자격 증명 풀에서 Amazon Cognito 자격 증명을 가져오는 방법을 설명합니다.

Amazon Cognito는 인증된 자격 증명과 인증되지 않은 자격 증명을 모두 지원합니다. 미인증 사용자는 자격 증명이 인증되지 않았으므로 앱 혹은 자격 증명의 인증이 중요하지 않은 경우 게스트 사용자 역할에 적합합니다. 인증받은 사용자는 타사 자격 증명 공급자(IdP)를 통해, 또는 자격 증명을 인증받은 사용자 풀을 통해 애플리케이션에 로그인합니다. 미인증 사용자의 액세스 권한을 허용하지 않도록 리소스 권한 범위를 충분히 정했는지 확인하세요.

Amazon Cognito 자격 증명(identity)은 자격 증명(credential)이 아닙니다. ()에서 웹 자격 증명 연동 지원을 사용하여 자격 증명으로 교환됩니다 AWS Security Token Service AWS STS. 앱 사용자를 위해 AWS 자격 증명을 얻는 권장 방법은 `AWS.CognitoIdentityCredentials`를 사용하는 것입니다. 그런 다음 자격 증명 객체의 자격 증명은를 사용하여 자격 증명으로 교환됩니다 AWS STS.

**참고**  
2015년 2월 이전에 자격 증명 풀을 만든 경우 파라미터 역할 없이 `AWS.CognitoIdentityCredentials` 생성자를 사용하려면 역할을 자격 증명 풀과 다시 연결해야 합니다. 이렇게 하려면 [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)을 열고, **자격 증명 풀 관리(Manage Identity Pools)**를 선택한 다음, 자격 증명 풀을 선택합니다. **자격 증명 풀 편집(Edit Identity Pool)**을 선택하고, 인증된 역할과 인증되지 않은 역할을 지정한 다음, 변경 사항을 저장합니다.

웹 자격 증명 보안 인증 공급자는 AWS SDK의 기본 보안 인증 공급자 체인의 일부입니다. SDK 또는의 로컬 `config` 파일에서 자격 증명 풀 토큰을 AWS 설정하려면 `web_identity_token_file` 프로필 항목을 AWS CLI추가합니다. SDK 및 도구 참조 안내서의 [역할 자격 증명 공급자 수임을](https://docs.aws.amazon.com/sdkref/latest/guide/feature-assume-role-credentials.html) 참조하세요. AWS SDKs 

SDK에 웹 자격 증명 보안 인증을 채우는 방법에 대한 자세한 내용은 SDK 개발자 안내서를 참조하세요. 최상의 결과를 얻으려면에 내장된 자격 증명 풀 통합으로 프로젝트를 시작합니다 AWS Amplify.

**AWS 자격 증명 풀을 사용하여 자격 증명을 가져오고 설정하기 위한 SDK 리소스**
+ Amplify 개발자 센터의 [자격 증명 풀 페더레이션](https://docs.amplify.aws/lib/auth/advanced/q/platform/android/#identity-pool-federation)(Android)
+ Amplify 개발자 센터의 [자격 증명 풀 페더레이션](https://docs.amplify.aws/lib/auth/advanced/q/platform/ios/#identity-pool-federation)(iOS)
+  AWS SDK for JavaScript 개발자 안내서의[ Amazon Cognito 자격 증명을 사용하여 사용자 인증](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/loading-browser-credentials-cognito.html) 
+  AWS SDK for .NET 개발자 안내서의 [Amazon Cognito 자격 증명 공급자](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-creds-provider.html) 
+  AWS SDK for Go 개발자 안내서의 [프로그래밍 방식으로 자격 증명 지정](https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/#specify-credentials-programmatically) 
+  AWS SDK for Java 2.x 개발자 안내서[의 코드에 임시 자격 증명 제공](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials-explicit.html) 
+  AWS SDK for PHP 개발자 안내서의 [assumeRoleWithWebIdentityCredentialProvider](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials_provider.html#assume-role-with-web-identity-provider) 공급자
+  AWS SDK for Python (Boto3)  설명서의 [웹 ID 제공업체를 사용하여 역할 수임](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#assume-role-with-web-identity-provider)
+  AWS SDK for Rust 개발자 안내서의 자격 [증명 및 기본 리전 지정](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/credentials.html) 

다음 섹션에서는 일부 AWS SDKs의 예제 코드를 제공합니다.

## Android
<a name="getting-credentials-1.android"></a>

Amazon Cognito를 사용하여 애플리케이션에 제한된 권한의 임시 자격 증명을 제공하여 사용자가 AWS 리소스에 액세스할 수 있도록 할 수 있습니다. Amazon Cognito는 인증된 자격 증명과 인증되지 않은 자격 증명을 모두 지원합니다. 앱에 AWS 자격 증명을 제공하려면 아래 단계를 따르세요.

Android 앱에서 Amazon Cognito 자격 증명 풀을 사용하려면를 설정합니다 AWS Amplify. 자세한 내용은 *Amplify 개발자 센터*의 [인증](https://docs.amplify.aws/lib/auth/getting-started/q/platform/android/)을 참조하세요.

**Amazon Cognito 자격 증명 검색**

인증되지 않은 사용자를 허용하는 경우 최종 사용자의 고유한 Amazon Cognito 식별자(자격 증명 ID)를 즉시 검색할 수 있습니다. 사용자를 인증하는 경우 자격 증명 공급자에서 로그인 토큰을 설정한 후 자격 증명 ID를 검색할 수 있습니다.

```
String identityId = credentialsProvider.getIdentityId();
Log.d("LogTag", "my ID is " + identityId);
```

**참고**  
 애플리케이션의 기본 스레드에서 `getIdentityId()`, `refresh()` 또는 `getCredentials()`를 호출하지 마세요. Android 3.0(API 레벨 11)을 기준으로 기본 애플리케이션 스레드에서 네트워크 I/O를 수행하는 경우 앱이 자동으로 실패하고 [NetworkOnMainThreadException](https://developer.android.com/reference/android/os/NetworkOnMainThreadException.html)이 발생합니다. `AsyncTask`를 사용하여 코드를 백그라운드 스레드로 이동해야 합니다. 자세한 내용은 [Android 설명서](https://developer.android.com/training/basics/network-ops/connecting.html#AsyncTask)를 참조하세요. 이미 로컬에 캐시된 경우에만 `getCachedIdentityId()`를 호출하여 ID를 검색할 수 있습니다. 그렇지 않으면 메서드가 null을 반환합니다.

## iOS - Objective-C
<a name="getting-credentials-1.ios-objc"></a>

Amazon Cognito를 사용하여 애플리케이션에 제한된 권한의 임시 자격 증명을 제공하여 사용자가 AWS 리소스에 액세스할 수 있도록 할 수 있습니다. Amazon Cognito 자격 증명 풀은 인증된 자격 증명과 인증되지 않은 자격 증명을 모두 지원합니다. 앱에 AWS 자격 증명을 제공하려면 다음 단계를 완료하세요.

iOS 앱에서 Amazon Cognito 자격 증명 풀을 사용하려면를 설정합니다 AWS Amplify. 자세한 내용은 *Amplify 개발자 센터*의 [Swift 인증](https://docs.amplify.aws/lib/auth/getting-started/q/platform/ios/) 및 [Flutter 인증](https://docs.amplify.aws/lib/auth/getting-started/q/platform/flutter/)을 참조하세요.

**Amazon Cognito 자격 증명 검색**

인증되지 않은 사용자를 허용하는 경우 또는 사용자를 인증하는 경우 자격 증명 공급자에서 로그인 토큰을 설정한 후에 최종 사용자의 Amazon Cognito 식별자(자격 증명 ID)를 즉시 검색할 수 있습니다.

```
// Retrieve your Amazon Cognito ID
[[credentialsProvider getIdentityId] continueWithBlock:^id(AWSTask *task) {
    if (task.error) {
        NSLog(@"Error: %@", task.error);
    }
    else {
        // the task result will contain the identity id
        NSString *cognitoId = task.result;
    }
    return nil;
}];
```

**참고**  
 `getIdentityId`는 비동기식 호출입니다. 자격 증명 ID가 이미 공급자에 설정된 경우 `credentialsProvider.identityId`를 호출하여 해당 자격 증명을 검색할 수 있으며 이 자격 증명은 로컬에 캐시됩니다. 그러나 자격 증명 ID가 공급자에 설정되지 않은 경우 `credentialsProvider.identityId`를 호출하면 `nil`이 반환됩니다. 자세한 내용은 [Amplify iOS SDK 참조](https://github.com/aws-amplify/aws-sdk-ios)를 참조하세요.

## iOS - Swift
<a name="getting-credentials-1.ios-swift"></a>

Amazon Cognito를 사용하여 애플리케이션에 제한된 권한의 임시 자격 증명을 제공하여 사용자가 AWS 리소스에 액세스할 수 있도록 할 수 있습니다. Amazon Cognito는 인증된 자격 증명과 인증되지 않은 자격 증명을 모두 지원합니다. 앱에 AWS 자격 증명을 제공하려면 아래 단계를 따르세요.

iOS 앱에서 Amazon Cognito 자격 증명 풀을 사용하려면를 설정합니다 AWS Amplify. 자세한 내용은 *Amplify 개발자 센터*의 [Swift 인증](https://docs.amplify.aws/lib/auth/getting-started/q/platform/ios/)을 참조하세요.

**Amazon Cognito 자격 증명 검색**

인증되지 않은 사용자를 허용하는 경우 또는 사용자를 인증하는 경우 자격 증명 공급자에서 로그인 토큰을 설정한 후에 최종 사용자의 Amazon Cognito 식별자(자격 증명 ID)를 즉시 검색할 수 있습니다.

```
// Retrieve your Amazon Cognito ID
credentialsProvider.getIdentityId().continueWith(block: { (task) -> AnyObject? in
    if (task.error != nil) {
        print("Error: " + task.error!.localizedDescription)
    }
    else {
        // the task result will contain the identity id
        let cognitoId = task.result!
        print("Cognito id: \(cognitoId)")
    }
    return task;
})
```

**참고**  
 `getIdentityId`는 비동기식 호출입니다. 자격 증명 ID가 이미 공급자에 설정된 경우 `credentialsProvider.identityId`를 호출하여 해당 자격 증명을 검색할 수 있으며 이 자격 증명은 로컬에 캐시됩니다. 그러나 자격 증명 ID가 공급자에 설정되지 않은 경우 `credentialsProvider.identityId`를 호출하면 `nil`이 반환됩니다. 자세한 내용은 [Amplify iOS SDK 참조](https://github.com/aws-amplify/aws-sdk-ios)를 참조하세요.

## JavaScript
<a name="getting-credentials-1.javascript"></a>

자격 증명 풀을 아직 만들지 않았다면 `AWS.CognitoIdentityCredentials`를 사용하기 전에 [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito)에서 자격 증명 풀을 만듭니다.

자격 증명 제공자로 자격 증명 풀을 구성한 후에는 `AWS.CognitoIdentityCredentials`를 사용하여 사용자를 인증할 수 있습니다. `AWS.CognitoIdentityCredentials`를 사용하도록 애플리케이션 자격 증명을 구성하려면, `credentials` 또는 서비스당 구성의 `AWS.Config` 속성을 설정하세요. 다음 예에는 `AWS.Config`가 사용됩니다.

```
// Set the region where your identity pool exists (us-east-1, eu-west-1)
AWS.config.region = 'us-east-1';

// Configure the credentials provider to use your identity pool
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'IDENTITY_POOL_ID',
    Logins: { // optional tokens, used for authenticated login
        'graph.facebook.com': 'FBTOKEN',
        'www.amazon.com': 'AMAZONTOKEN',
        'accounts.google.com': 'GOOGLETOKEN',
        'appleid.apple.com': 'APPLETOKEN'
    }
});

// Make the call to obtain credentials
AWS.config.credentials.get(function(){

    // Credentials will be available when this function is called.
    var accessKeyId = AWS.config.credentials.accessKeyId;
    var secretAccessKey = AWS.config.credentials.secretAccessKey;
    var sessionToken = AWS.config.credentials.sessionToken;

});
```

선택 사항인 `Logins` 속성은 공급자의 자격 증명 토큰에 대한 자격 증명 공급자 이름의 맵입니다. 자격 증명 공급자에게서 토큰을 받는 방법은 어떤 공급자를 사용하느냐에 따라 다릅니다. 예를 들어 Facebook이 자격 증명 공급자 중 하나인 경우 [Facebook SDK](https://developers.facebook.com/docs/facebook-login/web)의 `FB.login` 함수를 사용하여 자격 증명 공급자 토큰을 얻을 수 있습니다.

```
FB.login(function (response) {
    if (response.authResponse) { // logged in
        AWS.config.credentials = new AWS.CognitoIdentityCredentials({
          IdentityPoolId: 'us-east-1:1699ebc0-7900-4099-b910-2df94f52a030',
          Logins: {
            'graph.facebook.com': response.authResponse.accessToken
          }
        });

        console.log('You are now logged in.');
    } else {
        console.log('There was a problem logging you in.');
    }
});
```

**Amazon Cognito 자격 증명 검색**

인증되지 않은 사용자를 허용하는 경우 또는 사용자를 인증하는 경우 자격 증명 공급자에서 로그인 토큰을 설정한 후에 최종 사용자의 Amazon Cognito 식별자(자격 증명 ID)를 즉시 검색할 수 있습니다.

```
var identityId = AWS.config.credentials.identityId;
```

## Unity
<a name="getting-credentials-1.unity"></a>

 Amazon Cognito를 사용하여 애플리케이션에 제한된 권한의 임시 자격 증명을 제공하여 사용자가 AWS 리소스에 액세스할 수 있도록 할 수 있습니다. Amazon Cognito는 인증된 자격 증명과 인증되지 않은 자격 증명을 모두 지원합니다. 앱에 AWS 자격 증명을 제공하려면 아래 단계를 따르세요.

[AWS  SDK for Unity](https://docs.aws.amazon.com/mobile/sdkforunity/developerguide/what-is-unity-plugin.html)는 이제 [SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/welcome.html)의 일부입니다. 에서 Amazon Cognito를 시작하려면 AWS SDK for .NET 개발자 안내서의 [Amazon Cognito 자격 증명 공급자](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-creds-provider.html)를 SDK for .NET참조하세요. 또는를 사용하여 앱을 빌드하는 옵션은 [Amplify Dev Center](https://docs.amplify.aws/)를 참조하세요 AWS Amplify.

**Amazon Cognito 자격 증명 검색**

 인증되지 않은 사용자를 허용하는 경우 또는 사용자를 인증하는 경우 자격 증명 공급자에서 로그인 토큰을 설정한 후에 최종 사용자의 Amazon Cognito 식별자(자격 증명 ID)를 즉시 검색할 수 있습니다.

```
credentials.GetIdentityIdAsync(delegate(AmazonCognitoIdentityResult<string> result) {
    if (result.Exception != null) {
        //Exception!
    }
    string identityId = result.Response;
});
```

## Xamarin
<a name="getting-credentials-1.xamarin"></a>

Amazon Cognito를 사용하여 애플리케이션에 제한된 권한의 임시 자격 증명을 제공하여 사용자가 AWS 리소스에 액세스할 수 있도록 할 수 있습니다. Amazon Cognito는 인증된 자격 증명과 인증되지 않은 자격 증명을 모두 지원합니다. 앱에 AWS 자격 증명을 제공하려면 아래 단계를 따르세요.

[AWS  SDK for Xamarin](https://docs.aws.amazon.com/mobile/sdkforxamarin/developerguide/Welcome.html)은 이제 [SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/welcome.html)의 일부입니다. 에서 Amazon Cognito를 시작하려면 AWS SDK for .NET 개발자 안내서의 [Amazon Cognito 자격 증명 공급자](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-creds-provider.html)를 SDK for .NET참조하세요. 또는를 사용하여 앱을 빌드하는 옵션은 [Amplify Dev Center](https://docs.amplify.aws/)를 참조하세요 AWS Amplify.

**참고**  
 **참고:** 2015년 2월 이전에 자격 증명 풀을 만든 경우 파라미터 역할 없이 이 생성자를 사용하려면 역할을 작업 증명 풀과 다시 연결해야 합니다. 이렇게 하려면 [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)을 열고, **자격 증명 풀 관리(Manage Identity Pools)**를 선택한 다음, 자격 증명 풀을 선택합니다. **자격 증명 풀 편집(Edit Identity Pool)**을 선택하고, 인증된 역할과 인증되지 않은 역할을 지정한 다음, 변경 사항을 저장합니다.

**Amazon Cognito 자격 증명 검색**

 인증되지 않은 사용자를 허용하는 경우 또는 사용자를 인증하는 경우 자격 증명 공급자에서 로그인 토큰을 설정한 후에 최종 사용자의 Amazon Cognito 식별자(자격 증명 ID)를 즉시 검색할 수 있습니다.

```
var identityId = await credentials.GetIdentityIdAsync();
```

# 임시 자격 증명 AWS 서비스 으로 액세스
<a name="accessing-aws-services"></a>

ID 풀을 사용한 인증이 성공적으로 완료되면 AWS 자격 증명 세트가 생성됩니다. 이러한 자격 증명을 사용하면 애플리케이션이 IAM 인증으로 보호되는 AWS 리소스를 요청할 수 있습니다. 자격 증명 풀 API 작업에 액세스하기 위해 애플리케이션에 추가할 수 있는 다양한 AWS SDKs를 사용하면 임시 자격 증명을 생성하는 인증되지 않은 API 요청을 할 수 있습니다. 그런 다음 클라이언트에 다른 SDKs AWS 서비스 를 추가하고 해당 임시 자격 증명으로 요청에 서명할 수 있습니다. 임시 자격 증명 역할에 부여된 IAM 권한은 다른 서비스에서 요청하는 작업을 허용해야 합니다.

Amazon Cognito 자격 증명 공급자를 구성하고 AWS 자격 증명을 검색한 후 AWS 서비스 클라이언트를 생성합니다. 다음은 AWS SDK 설명서의 몇 가지 예입니다.

**AWS 클라이언트 생성을 위한 SDK 리소스**
+  AWS SDK for C\$1\$1 개발자 안내서의 [AWS 클라이언트 구성](https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/client-config.html) 
+  AWS SDK for Go 개발자 안내서[의에서 AWS SDK for Go V2 사용 AWS 서비스](https://aws.github.io/aws-sdk-go-v2/docs/making-requests/) 
+  AWS SDK for Java 2.x 개발자 안내서의 [HTTP 클라이언트 구성](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/http-configuration.html) 
+  AWS SDK for JavaScript 개발자 안내서의 [서비스 객체 생성 및 호출](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/creating-and-calling-service-objects.html) 
+  AWS SDK for Python (Boto3) 설명서에서 [클라이언트 생성](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/clients.html#creating-clients) 
+  AWS SDK for Rust 개발자 안내서의 [서비스 클라이언트 생성](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/client.html) 
+  AWS SDK for Swift 개발자 안내서의 [클라이언트 사용](https://docs.aws.amazon.com/sdk-for-swift/latest/developer-guide/using-client-services.html) 

다음 조각은 Amazon DynamoDB 클라이언트를 초기화합니다.

## Android
<a name="accessing-aws-services-1.android"></a>

Android 앱에서 Amazon Cognito 자격 증명 풀을 사용하려면를 설정합니다 AWS Amplify. 자세한 내용은 *Amplify 개발자 센터*의 [인증](https://docs.amplify.aws/lib/auth/getting-started/q/platform/android/)을 참조하세요.

```
// Create a service client with the provider
AmazonDynamoDB client = new AmazonDynamoDBClient(credentialsProvider);
```

 자격 증명 공급자는 Amazon Cognito와 통신하여 인증된 사용자와 인증되지 않은 사용자의 고유 식별자와 AWS Mobile SDK에 대한 임시의 제한된 권한 AWS 자격 증명을 모두 검색합니다. 검색된 자격 증명은 한시간 동안 유효하며 만료된 경우 공급자는 자격 증명을 새로 고칩니다.

## iOS - Objective-C
<a name="accessing-aws-services-1.ios-objc"></a>

iOS 앱에서 Amazon Cognito 자격 증명 풀을 사용하려면를 설정합니다 AWS Amplify. 자세한 내용은 *Amplify 개발자 센터*의 [Swift 인증](https://docs.amplify.aws/lib/auth/getting-started/q/platform/ios/) 및 [Flutter 인증](https://docs.amplify.aws/lib/auth/getting-started/q/platform/flutter/)을 참조하세요.

```
// create a configuration that uses the provider
AWSServiceConfiguration *configuration = [AWSServiceConfiguration configurationWithRegion:AWSRegionUSEast1 provider:credentialsProvider];
// get a client with the default service configuration
AWSDynamoDB *dynamoDB = [AWSDynamoDB defaultDynamoDB];
```

 자격 증명 공급자는 Amazon Cognito와 통신하여 인증된 사용자와 인증되지 않은 사용자의 고유 식별자와 AWS Mobile SDK에 대한 임시의 제한된 권한 AWS 자격 증명을 모두 검색합니다. 검색된 자격 증명은 한시간 동안 유효하며 만료된 경우 공급자는 자격 증명을 새로 고칩니다.

## iOS - Swift
<a name="accessing-aws-services-1.ios-swift"></a>

iOS 앱에서 Amazon Cognito 자격 증명 풀을 사용하려면를 설정합니다 AWS Amplify. 자세한 내용은 *Amplify 개발자 센터*의 [Swift 인증](https://docs.amplify.aws/lib/auth/getting-started/q/platform/ios/)을 참조하세요.

```
// get a client with the default service configuration
let dynamoDB = AWSDynamoDB.default()

// get a client with a custom configuration
AWSDynamoDB.register(with: configuration!, forKey: "USWest2DynamoDB");
let dynamoDBCustom = AWSDynamoDB(forKey: "USWest2DynamoDB")
```

자격 증명 공급자는 Amazon Cognito와 통신하여 인증된 사용자와 인증되지 않은 사용자의 고유 식별자와 AWS Mobile SDK에 대한 임시의 제한된 권한 AWS 자격 증명을 모두 검색합니다. 검색된 자격 증명은 한시간 동안 유효하며 만료된 경우 공급자는 자격 증명을 새로 고칩니다.

## JavaScript
<a name="accessing-aws-services-1.javascript"></a>



```
// Create a service client with the provider
var dynamodb = new AWS.DynamoDB({region: 'us-west-2'});
```

 자격 증명 공급자는 Amazon Cognito와 통신하여 인증된 사용자와 인증되지 않은 사용자의 고유 식별자와 AWS Mobile SDK의 임시 제한 권한 AWS 자격 증명을 모두 검색합니다. 검색된 자격 증명은 한시간 동안 유효하며 만료된 경우 공급자는 자격 증명을 새로 고칩니다.

## Unity
<a name="accessing-aws-services-1.unity"></a>

[AWS  SDK for Unity](https://docs.aws.amazon.com/mobile/sdkforunity/developerguide/what-is-unity-plugin.html)는 이제 [SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/welcome.html)의 일부입니다. 에서 Amazon Cognito를 시작하려면 AWS SDK for .NET 개발자 안내서의 [Amazon Cognito 자격 증명 공급자](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-creds-provider.html)를 SDK for .NET참조하세요. 또는를 사용하여 앱을 빌드하는 옵션은 [Amplify Dev Center](https://docs.amplify.aws/)를 참조하세요 AWS Amplify.

```
// create a service client that uses credentials provided by Cognito
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials, REGION);
```

 자격 증명 공급자는 Amazon Cognito와 통신하여 인증된 사용자와 인증되지 않은 사용자의 고유 식별자와 AWS Mobile SDK의 임시 제한 권한 AWS 자격 증명을 모두 검색합니다. 검색된 자격 증명은 한시간 동안 유효하며 만료된 경우 공급자는 자격 증명을 새로 고칩니다.

## Xamarin
<a name="accessing-aws-services-1.xamarin"></a>

[AWS  SDK for Xamarin](https://docs.aws.amazon.com/mobile/sdkforxamarin/developerguide/Welcome.html)은 이제 [SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/welcome.html)의 일부입니다. 에서 Amazon Cognito를 시작하려면 AWS SDK for .NET 개발자 안내서의 [Amazon Cognito 자격 증명 공급자](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-creds-provider.html)를 SDK for .NET참조하세요. 또는를 사용하여 앱을 빌드하는 옵션은 [Amplify Dev Center](https://docs.amplify.aws/)를 참조하세요 AWS Amplify.

```
// create a service client that uses credentials provided by Cognito
var client = new AmazonDynamoDBClient(credentials, REGION)
```

 자격 증명 공급자는 Amazon Cognito와 통신하여 인증된 사용자와 인증되지 않은 사용자의 고유 식별자와 AWS Mobile SDK의 임시 제한 권한 AWS 자격 증명을 모두 검색합니다. 검색된 자격 증명은 한시간 동안 유효하며 만료된 경우 공급자는 자격 증명을 새로 고칩니다.

# ID 풀 타사 ID 제공업체
<a name="external-identity-providers"></a>

Amazon Cognito 자격 증명 풀을 사용하면 다양한 외부 자격 증명 공급자(IdPs)와 통합하여 애플리케이션의 페더레이션 인증을 통해 임시 AWS 자격 증명을 제공할 수 있습니다. 이러한 외부 IdPs와 함께 작동하도록 자격 증명 풀을 구성하면 Amazon Cognito 사용자 풀, 소셜 공급자, OIDC 공급자 또는 SAML 공급자의 인증을 통해 사용자의 백엔드 AWS 리소스에 대한 액세스를 승인할 수 있습니다. 이 섹션에서는 IdP를 설정하고 Amazon Cognito ID 풀과 통합하는 단계를 다룹니다.

`logins` 속성을 사용하여 자격 증명 공급자(IdP)에게서 받은 자격 증명을 설정할 수 있습니다. ID 풀을 여러 IdP와 연결할 수도 있습니다. 예를 들어 고유한 Amazon Cognito 자격 증명을 두 IdP 로그인 모두와 연결하도록 `logins` 속성에 Facebook 토큰과 Google 토큰을 둘 다 설정할 수 있습니다. 사용자는 어느 계정으로도 인증할 수 있지만 Amazon Cognito는 동일한 사용자 식별자를 반환합니다.

다음 지침은 Amazon Cognito 자격 증명 풀이 지원하는 IdP를 통한 인증을 안내합니다.

**Topics**
+ [

# Facebook을 ID 풀 IdP로 설정
](facebook.md)
+ [

# Amazon을 사용하여 ID 풀 IdP로 로그인 설정
](amazon.md)
+ [

# Google을 ID 풀 IdP로 설정
](google.md)
+ [

# Sign in with Apple을 ID 풀 IdP로 설정
](apple.md)
+ [

# OIDC 제공업체를 ID 풀 IdP로 설정
](open-id.md)
+ [

# SAML 제공업체를 ID 풀 IdP로 설정
](saml-identity-provider.md)

# Facebook을 ID 풀 IdP로 설정
<a name="facebook"></a>

Amazon Cognito ID 풀은 Facebook과 함께 작동하여 애플리케이션 사용자에게 페더레이션 인증을 제공합니다. 이 섹션에서는 Facebook을 IdP로 사용하여 애플리케이션을 등록하고 설정하는 방법을 설명합니다.

## Facebook 설정
<a name="set-up-facebook"></a>

Facebook 사용자 인증 및 Facebook API와의 상호 작용 이전에 Facebook을 통해 애플리케이션을 등록합니다.

[Facebook 개발자 포털](https://developers.facebook.com/)을 통해 애플리케이이션을 설정할 수 있습니다. Amazon Cognito 자격 증명 풀에 Facebook을 통합하기 전에 이 절차를 수행합니다.

**참고**  
Amazon Cognito ID 풀 페더레이션은 [Facebook Limited Login](https://developers.facebook.com/docs/facebook-login/limited-login)과 호환되지 않습니다. Limited Login에 설정된 권한을 초과하지 않고 Facebook Login for iOS를 설정하는 방법에 대한 자세한 내용은 *Meta for Developers*의 [Facebook Login for iOS - 빠른 시작](https://developers.facebook.com/docs/facebook-login/ios)을 참조하세요.

**Facebook 설정**

1. [Facebook 개발자 포털](https://developers.facebook.com/)에서 Facebook 자격 증명으로 로그인합니다.

1. **앱** 메뉴에서 **새 앱 추가**를 선택합니다.

1. 플랫폼을 선택하고 빠른 시작 프로세스를 완료합니다.

### Android
<a name="set-up-facebook-1.android"></a>

Android 앱을 Facebook 로그인과 통합하는 방법에 대한 자세한 내용은 [Facebook Getting Started Guide](https://developers.facebook.com/docs/android/getting-started)(Facebook 시작 안내서)를 참조하세요.

### iOS - Objective-C
<a name="set-up-facebook-1.ios-objc"></a>

iOS Objective-C 앱을 Facebook 로그인과 통합하는 방법에 대한 자세한 내용은 [Facebook Getting Started Guide](https://developers.facebook.com/docs/ios/getting-started/)(Facebook 시작 안내서)를 참조하세요.

### iOS - Swift
<a name="set-up-facebook-1.ios-swift"></a>

iOS Swift 앱을 Facebook 로그인과 통합하는 방법에 대한 자세한 내용은 [Facebook Getting Started Guide](https://developers.facebook.com/docs/ios/getting-started/)(Facebook 시작 안내서)를 참조하세요.

### JavaScript
<a name="set-up-facebook-1.javascript"></a>

JavaScript 웹 앱을 Facebook 로그인과 통합하는 방법에 대한 자세한 내용은 [Facebook Getting Started Guide](https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.3)(Facebook 시작 안내서)를 참조하세요.

## Amazon Cognito 자격 증명 풀 콘솔에서 ID 제공업체 구성
<a name="configure-the-external-provider-in-the-amazon-cognito-console"></a>

다음 절차를 사용하여 ID 제공업체를 구성합니다.

**Facebook ID 제공업체(idP)를 추가하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체 추가**를 선택합니다.

1. **Facebook**을 선택합니다.

1. [개발자용 Meta](https://developers.facebook.com/)에서 생성한 OAuth 프로젝트의 **앱 ID**를 입력합니다. 자세한 내용은 *개발자용 Meta 문서*의 [Facebook 로그인](https://developers.facebook.com/docs/facebook-login/)을 참조하세요.

1. Amazon Cognito가 이 공급자를 통해 인증된 사용자에게 보안 인증을 발급할 때 요청하는 역할을 설정하려면 **역할 설정**을 구성하세요.

   1. **인증된 역할**을 구성할 때 설정한 **기본 역할**을 이 IdP의 사용자에게 할당하거나 **규칙을 사용하여 역할 선택**을 선택할 수 있습니다.

     1. **규칙을 사용하여 역할 선택**을 선택한 경우 사용자 인증의 소스 **클레임**, 클레임을 비교할 **연산자**, 이 역할 선택과 일치하도록 하는 **값** 및 **역할 할당**이 일치할 때 할당할 **역할**을 입력합니다. 다른 조건에 따라 추가 규칙을 생성하려면 **다른 항목 추가**를 선택합니다.

     1. **역할 해결**을 선택합니다. 사용자의 클레임이 규칙과 일치하지 않는 경우 보안 인증을 거부하거나 **인증된 역할**의 보안 인증을 발급할 수 있습니다.

1. Amazon Cognito가 이 공급자를 통해 인증한 사용자에게 보안 인증을 발급할 때 할당하는 보안 주체 태그를 변경하려면 **액세스 제어를 위한 속성**을 구성합니다.

   1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

   1. `sub` 및 `aud` 클레임 기반 보안 주체 태그를 적용하려면 **기본 매핑 사용**을 선택합니다.

   1. 보안 주체 태그에 대한 속성의 자체 사용자 지정 스키마를 생성하려면 **사용자 지정 매핑 사용**을 선택합니다. 그런 다음 태그에 표시하려는 각 **클레임**에서 소싱하려는 **태그 키**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

## Facebook 사용
<a name="using-facebook"></a>

### Android
<a name="using-facebook-1.android"></a>

Facebook 인증을 추가하려면 먼저 [Facebook 안내서](https://developers.facebook.com/docs/android)를 따라 Facebook SDK를 애플리케이션에 통합합니다. 그런 다음 [**Facebook으로 로그인(Login with Facebook)** 버튼](https://developers.facebook.com/docs/facebook-login/android)을 Android 사용자 인터페이스에 추가합니다. Facebook SDK는 세션 객체를 사용하여 상태를 추적합니다. Amazon Cognito는이 세션 객체의 액세스 토큰을 사용하여 사용자를 인증하고, 고유 식별자를 생성하고, 필요한 경우 사용자에게 다른 AWS 리소스에 대한 액세스 권한을 부여합니다.

Facebook SDK로 사용자를 인증한 후에는 Amazon Cognito 자격 증명 공급자에 세션 토큰을 추가합니다.

Facebook SDK 4.0 이상:

```
Map<String, String> logins = new HashMap<String, String>();
logins.put("graph.facebook.com", AccessToken.getCurrentAccessToken().getToken());
credentialsProvider.setLogins(logins);
```

Facebook SDK 4.0 이전:

```
Map<String, String> logins = new HashMap<String, String>();
logins.put("graph.facebook.com", Session.getActiveSession().getAccessToken());
credentialsProvider.setLogins(logins);
```

Facebook 로그인 프로세스에서 해당 SDK의 싱글톤 세션을 초기화합니다. Facebook 세션 객체에는 Amazon Cognito가 인증된 최종 사용자의 AWS 자격 증명을 생성하는 데 사용하는 OAuth 토큰이 포함되어 있습니다. 또한 Amazon Cognito는 사용자 데이터베이스에 이 특정 Facebook 자격 증명과 일치하는 사용자가 있는지 확인하는 데에도 이 토큰을 사용합니다. 사용자가 이미 있으면 API가 기존의 식별자를 반환합니다. 그렇지 않으면 API에서 새 식별자를 반환합니다. 클라이언트 SDK가 로컬 디바이스에서 식별자를 자동으로 캐시합니다.

**참고**  
로그인 맵을 설정한 후 `refresh` 또는를 호출`get`하여 AWS 자격 증명을 검색합니다.

### iOS - Objective-C
<a name="using-facebook-1.ios-objc"></a>

Facebook 인증을 추가하려면 먼저 [Facebook 안내서](https://developers.facebook.com/docs/ios)를 따라 Facebook SDK를 애플리케이션에 통합합니다. 그런 다음 [Facebook으로 로그인 버튼](https://developers.facebook.com/docs/facebook-login/ios)을 귀하의 사용자 인터페이스에 추가합니다. Facebook SDK는 세션 객체를 사용하여 상태를 추적합니다. Amazon Cognito는 이 세션 객체의 액세스 토큰을 사용하여 사용자를 인증하고 고유한 Amazon Cognito 자격 증명 풀(페더레이션 자격 증명)에 바인딩합니다.

Amazon Cognito에 Facebook 액세스 토큰을 제공하려면 [https://github.com/aws-amplify/aws-sdk-ios](https://github.com/aws-amplify/aws-sdk-ios) 프로토콜을 구현합니다.

`logins` 메서드를 구현할 때 `AWSIdentityProviderFacebook`이 포함된 사전을 반환합니다. 다음 코드 예와 같이 이 사전은 키 역할을 하고 인증된 Facebook 사용자에게서 받은 현재 액세스 토큰은 값 역할을 합니다.

```
- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins {
    FBSDKAccessToken* fbToken = [FBSDKAccessToken currentAccessToken];
    if(fbToken){
        NSString *token = fbToken.tokenString;
        return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : token }];
    }else{
            return [AWSTask taskWithError:[NSError errorWithDomain:@"Facebook Login"
                                                          code:-1
                                                      userInfo:@{@"error":@"No current Facebook access token"}]];
    }
}
```

`AWSCognitoCredentialsProvider`를 인스턴스화할 때 생성자에서 `AWSIdentityProviderManager`의 값으로 `identityProviderManager`를 구현하는 클래스를 전달하십시오. 자세한 내용을 보려면 [AWSCognitoCredentialsProvider](https://github.com/aws-amplify/aws-sdk-ios) 참조 페이지에서 **initWithRegionType:identityPoolId:identityProviderManager**를 선택하세요.

### iOS - Swift
<a name="using-facebook-1.ios-swift"></a>

Facebook 인증을 추가하려면 먼저 [Facebook 안내서](https://developers.facebook.com/docs/ios)를 따라 Facebook SDK를 애플리케이션에 통합합니다. 그런 다음 [Facebook으로 로그인 버튼](https://developers.facebook.com/docs/facebook-login/ios)을 귀하의 사용자 인터페이스에 추가합니다. Facebook SDK는 세션 객체를 사용하여 상태를 추적합니다. Amazon Cognito는 이 세션 객체의 액세스 토큰을 사용하여 사용자를 인증하고 고유한 Amazon Cognito 자격 증명 풀(페더레이션 자격 증명)에 바인딩합니다.

**참고**  
Amazon Cognito ID 풀 페더레이션은 [Facebook Limited Login](https://developers.facebook.com/docs/facebook-login/limited-login)과 호환되지 않습니다. Limited Login에 설정된 권한을 초과하지 않고 Facebook Login for iOS를 설정하는 방법에 대한 자세한 내용은 *Meta for Developers*의 [Facebook Login for iOS - 빠른 시작](https://developers.facebook.com/docs/facebook-login/ios)을 참조하세요.

Amazon Cognito에 Facebook 액세스 토큰을 제공하려면 [https://github.com/aws-amplify/aws-sdk-ios](https://github.com/aws-amplify/aws-sdk-ios) 프로토콜을 구현합니다.

`logins` 메서드를 구현할 때 `AWSIdentityProviderFacebook`이 포함된 사전을 반환합니다. 다음 코드 예와 같이 이 사전은 키 역할을 하고 인증된 Facebook 사용자에게서 받은 현재 액세스 토큰은 값 역할을 합니다.

```
class FacebookProvider: NSObject, AWSIdentityProviderManager {
    func logins() -> AWSTask<NSDictionary> {
        if let token = AccessToken.current?.authenticationToken {
            return AWSTask(result: [AWSIdentityProviderFacebook:token])
        }
        return AWSTask(error:NSError(domain: "Facebook Login", code: -1 , userInfo: ["Facebook" : "No current Facebook access token"]))
    }
}
```

`AWSCognitoCredentialsProvider`를 인스턴스화할 때 생성자에서 `AWSIdentityProviderManager`의 값으로 `identityProviderManager`를 구현하는 클래스를 전달하십시오. 자세한 내용을 보려면 [https://github.com/aws-amplify/aws-sdk-ios](https://github.com/aws-amplify/aws-sdk-ios) 참조 페이지로 이동하고 **initWithRegionType:identityPoolId:identityProviderManager**를 선택합니다.

### JavaScript
<a name="using-facebook-1.javascript"></a>

Facebook 인증을 추가하려면 [Facebook Login for the Web](https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.3)(웹용 Facebook 로그인)에 따라 웹 사이트에 **Facebook으로 로그인(Login with Facebook)** 버튼을 추가합니다. Facebook SDK는 세션 객체를 사용하여 상태를 추적합니다. Amazon Cognito는이 세션 객체의 액세스 토큰을 사용하여 사용자를 인증하고, 고유 식별자를 생성하고, 필요한 경우 사용자에게 다른 AWS 리소스에 대한 액세스 권한을 부여합니다.

Facebook SDK로 사용자를 인증한 후에는 Amazon Cognito 자격 증명 공급자에 세션 토큰을 추가합니다.

```
FB.login(function (response) {

  // Check if the user logged in successfully.
  if (response.authResponse) {

    console.log('You are now logged in.');

    // Add the Facebook access token to the Amazon Cognito credentials login map.
    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
      IdentityPoolId: 'IDENTITY_POOL_ID',
      Logins: {
        'graph.facebook.com': response.authResponse.accessToken
      }
    });

    // Obtain AWS credentials
    AWS.config.credentials.get(function(){
        // Access AWS resources here.
    });

  } else {
    console.log('There was a problem logging you in.');
  }

});
```

Facebook SDK는 Amazon Cognito가 인증된 최종 사용자의 AWS 자격 증명을 생성하는 데 사용하는 OAuth 토큰을 가져옵니다. 또한 Amazon Cognito는 사용자 데이터베이스에 이 Facebook 자격 증명과 일치하는 사용자가 있는지 확인하는 데에도 이 토큰을 사용합니다. 사용자가 이미 있으면 API가 기존의 식별자를 반환합니다. 그렇지 않으면 새 식별자가 반환됩니다. 식별자는 로컬 디바이스에서 클라이언트 SDK에 의해 자동으로 캐시됩니다.

**참고**  
로그인 맵을 설정한 후 `refresh` 또는 `get`을 호출하여 자격 증명을 가져옵니다. 코드 예제는 [JavaScript README 파일](https://github.com/amazon-archives/amazon-cognito-identity-js/blob/master/README.md)의 "Use Case 17, Integrating User Pools with Cognito Identity"를 참조하세요.

### Unity
<a name="using-facebook-1.unity"></a>

Facebook 인증을 추가하려면 먼저 [Facebook 안내서](https://developers.facebook.com/docs/unity)를 따라 Facebook SDK를 애플리케이션에 통합합니다. Amazon Cognito는 `FB` 객체의 Facebook 액세스 토큰을 사용하여 Amazon Cognito 자격 증명에 연결된 고유한 사용자 식별자를 생성합니다.

Facebook SDK로 사용자를 인증한 후에는 Amazon Cognito 자격 증명 공급자에 세션 토큰을 추가합니다.

```
void Start()
{
    FB.Init(delegate() {
        if (FB.IsLoggedIn) { //User already logged in from a previous session
            AddFacebookTokenToCognito();
        } else {
            FB.Login ("email", FacebookLoginCallback);
        }
    });
}

void FacebookLoginCallback(FBResult result)
{
    if (FB.IsLoggedIn)
    {
        AddFacebookTokenToCognito();
    }
    else
    {
        Debug.Log("FB Login error");
    }
}

void AddFacebookTokenToCognito()
{
    credentials.AddLogin ("graph.facebook.com", AccessToken.CurrentAccessToken.TokenString);
}
```

`FB.AccessToken`을 사용하기 전에 `FB.Login()`을 호출하고 `FB.IsLoggedIn`이 true인지 확인합니다.

### Xamarin
<a name="using-facebook-1.xamarin"></a>

**Android용 Xamarin:**

```
public void InitializeFacebook() {
    FacebookSdk.SdkInitialize(this.ApplicationContext);
    callbackManager = CallbackManagerFactory.Create();
    LoginManager.Instance.RegisterCallback(callbackManager, new FacebookCallback &lt; LoginResult &gt; () {
      HandleSuccess = loginResult = &gt; {
        var accessToken = loginResult.AccessToken;
        credentials.AddLogin("graph.facebook.com", accessToken.Token);
        //open new activity
      },
      HandleCancel = () = &gt; {
        //throw error message
      },
      HandleError = loginError = &gt; {
        //throw error message
      }
    });
    LoginManager.Instance.LogInWithReadPermissions(this, new List &lt; string &gt; {
      "public_profile"
    });
  }
```

**iOS용 Xamarin:**

```
public void InitializeFacebook() {
  LoginManager login = new LoginManager();
  login.LogInWithReadPermissions(readPermissions.ToArray(), delegate(LoginManagerLoginResult result, NSError error) {
    if (error != null) {
      //throw error message
    } else if (result.IsCancelled) {
      //throw error message
    } else {
      var accessToken = loginResult.AccessToken;
      credentials.AddLogin("graph.facebook.com", accessToken.Token);
      //open new view controller
    }
  });
}
```

# Amazon을 사용하여 ID 풀 IdP로 로그인 설정
<a name="amazon"></a>

Amazon Cognito ID 풀은 Login with Amazon과 함께 작동하여 모바일 및 웹 앱 사용자에게 페더레이션 인증을 제공합니다. 이 섹션에서는 Login with Amazon을 자격 증명 공급자(IdP)로 사용하여 애플리케이션을 등록하고 설정하는 방법을 설명합니다.

[개발자 포털](https://developer.amazon.com/login-with-amazon)에서 Login with Amazon이 Amazon Cognito와 연동하도록 설정합니다. 자세한 내용은 Login with Amazon FAQ에서 [Setting Up Login with Amazon](https://developer.amazon.com/docs/login-with-amazon/faq.html#setting-up-login-with-amazon)(Login with Amazon 설정)을 참조하세요.

**참고**  
Login with Amazon을 Xamarin 애플리케이션에 통합하려면 [Xamarin Getting Started Guide](https://developer.xamarin.com/guides/cross-platform/getting_started/)(Xamarin 시작 안내서)를 따릅니다.

**참고**  
Unity 플랫폼에서는 Login with Amazon을 기본적으로 통합할 수 없습니다. 대신 웹 보기를 사용하여 브라우저 로그인 흐름을 수행합니다.

## Login with Amazon 설정
<a name="login-with-amazon-setup"></a>

**Login with Amazon 구현**

[Amazon 개발자 포털](https://developer.amazon.com/apps-and-games/login-with-amazon)에서 OAuth 애플리케이션을 자격 증명 풀과 통합하도록 설정하고, Login with Amazon 설명서를 찾고, SDK를 다운로드할 수 있습니다. **개발자 콘솔(Developer console)**을 선택한 다음 개발자 포털에서 **Login with Amazon**을 선택합니다. 애플리케이션에 대한 보안 프로필을 생성한 다음 앱에 대한 Login with Amazon 인증 메커니즘을 빌드할 수 있습니다. Login with Amazon 인증을 앱과 통합하는 방법에 대한 자세한 내용은 [자격 증명 얻기](getting-credentials.md) 섹션을 참조하세요.

Amazon에서는 새 보안 프로필에 대한 OAuth 2.0 **클라이언트 ID(client ID)**를 발급합니다. 보안 프로필 **웹 설정(Web Settings)** 탭에서 **클라이언트 ID(client ID)**를 찾을 수 있습니다. 자격 증명 풀에서 Login with Amazon IdP의 **App ID** 필드에 **보안 프로필 ID**를 입력합니다.

**참고**  
자격 증명 풀에서 Login with Amazon IdP의 **App ID** 필드에 **보안 프로필 ID**를 입력합니다. 이는 **클라이언트 ID**를 사용하는 사용자 풀과 다릅니다.

## Amazon Cognito 콘솔에서 외부 공급자 구성
<a name="login-with-amazon-configure-provider"></a>

**Login with Amazon ID 제공업체(idP)를 추가하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체 추가**를 선택합니다.

1. **Login with Amazon**을 선택합니다.

1. [Login with Amazon](https://developer.amazon.com/apps-and-games/login-with-amazon)에서 생성한 OAuth 프로젝트의 **앱 ID**를 입력합니다. 자세한 내용은 [Login with Amazon 설명서](https://developer.amazon.com/docs/login-with-amazon/documentation-overview.html)를 참조하세요.

1. Amazon Cognito가 이 공급자를 통해 인증된 사용자에게 보안 인증을 발급할 때 요청하는 역할을 설정하려면 **역할 설정**을 구성하세요.

   1. **인증된 역할**을 구성할 때 설정한 **기본 역할**을 이 IdP의 사용자에게 할당하거나 **규칙을 사용하여 역할 선택**을 선택할 수 있습니다.

     1. **규칙을 사용하여 역할 선택**을 선택한 경우 사용자 인증의 소스 **클레임**, 클레임을 비교할 **연산자**, 이 역할 선택과 일치하도록 하는 **값** 및 **역할 할당**이 일치할 때 할당할 **역할**을 입력합니다. 다른 조건에 따라 추가 규칙을 생성하려면 **다른 항목 추가**를 선택합니다.

     1. **역할 해결**을 선택합니다. 사용자의 클레임이 규칙과 일치하지 않는 경우 보안 인증을 거부하거나 **인증된 역할**의 보안 인증을 발급할 수 있습니다.

1. Amazon Cognito가 이 공급자를 통해 인증한 사용자에게 보안 인증을 발급할 때 할당하는 보안 주체 태그를 변경하려면 **액세스 제어를 위한 속성**을 구성합니다.

   1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

   1. `sub` 및 `aud` 클레임 기반 보안 주체 태그를 적용하려면 **기본 매핑 사용**을 선택합니다.

   1. 보안 주체 태그에 대한 속성의 자체 사용자 지정 스키마를 생성하려면 **사용자 지정 매핑 사용**을 선택합니다. 그런 다음 태그에 표시하려는 각 **클레임**에서 소싱하려는 **태그 키**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

## Login with Amazon 사용: Android
<a name="set-up-amazon-1.android"></a>

Amazon 로그인을 승인한 후 TokenListener 인터페이스의 onSuccess 메서드에서 Amazon Cognito 자격 증명 공급자에 토큰을 전달할 수 있습니다. 코드는 다음과 같습니다.

```
@Override
public void onSuccess(Bundle response) {
    String token = response.getString(AuthzConstants.BUNDLE_KEY.TOKEN.val);
    Map<String, String> logins = new HashMap<String, String>();
    logins.put("www.amazon.com", token);
    credentialsProvider.setLogins(logins);
}
```

## Login with Amazon 사용: iOS - Objective-C
<a name="set-up-amazon-1.ios-objc"></a>

Amazon 로그인을 승인한 후 AMZNAccessTokenDelegate의 requestDidSucceed 메서드에서 Amazon Cognito 자격 증명 공급자에 토큰을 전달할 수 있습니다.

```
- (void)requestDidSucceed:(APIResult \*)apiResult {
    if (apiResult.api == kAPIAuthorizeUser) {
        [AIMobileLib getAccessTokenForScopes:[NSArray arrayWithObject:@"profile"] withOverrideParams:nil delegate:self];
    }
    else if (apiResult.api == kAPIGetAccessToken) {
        credentialsProvider.logins = @{ @(AWSCognitoLoginProviderKeyLoginWithAmazon): apiResult.result };
    }
}}
```

## Login with Amazon 사용: iOS - Swift
<a name="set-up-amazon-1.ios-swift"></a>

Amazon 로그인을 승인한 후 `AMZNAccessTokenDelegate`의 `requestDidSucceed` 메서드에서 Amazon Cognito 자격 증명 공급자에 토큰을 전달할 수 있습니다.

```
func requestDidSucceed(apiResult: APIResult!) {
    if apiResult.api == API.AuthorizeUser {
        AIMobileLib.getAccessTokenForScopes(["profile"], withOverrideParams: nil, delegate: self)
    } else if apiResult.api == API.GetAccessToken {
        credentialsProvider.logins = [AWSCognitoLoginProviderKey.LoginWithAmazon.rawValue: apiResult.result]
    }
}
```

## Login with Amazon 사용: JavaScript
<a name="set-up-amazon-1.javascript"></a>

사용자가 Login with Amazon으로 인증하고 다시 웹 사이트로 리디렉션되면 쿼리 문자열에 Login with Amazon 액세스 토큰이 제공됩니다. 이 토큰을 자격 증명 로그인 맵에 전달하세요.

```
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
   IdentityPoolId: 'IDENTITY_POOL_ID',
   Logins: {
       'www.amazon.com': 'Amazon Access Token'
   }
});
```

# Google을 ID 풀 IdP로 설정
<a name="google"></a>

Amazon Cognito ID 풀은 Google과 함께 작동하여 모바일 애플리케이션 사용자에게 페더레이션 인증을 제공합니다. 이 섹션에서는 Google을 IdP로 사용하여 애플리케이션을 등록하고 설정하는 방법을 설명합니다.

## Android
<a name="set-up-google-1.android"></a>

**참고**  
앱이 Google을 사용하고 여러 모바일 플랫폼에서 사용 가능한 경우 앱을 [OpenID Connect 공급자](open-id.md)로 구성해야 합니다. 더 나은 통합을 위해 생성된 모든 클라이언트 ID를 추가 대상 값으로 추가합니다. Google 클라이언트 간 자격 증명 모델에 대한 자세한 내용은 [클라이언트 간 ID](https://developers.google.com/accounts/docs/CrossClientAuth)를 참조하세요.

**Google 설정**

Android용 Google 로그인을 활성화하려면 애플리케이션을 위한 Google 개발자 콘솔 프로젝트를 생성합니다.

1. [Google 개발자 콘솔](https://console.developers.google.com/)로 이동하여 새 프로젝트를 만듭니다.

1. **API 및 서비스(APIs & Services)**를 선택한 다음 **OAuth 동의 화면(OAuth consent screen)**을 선택합니다. Google에서 프로필 데이터를 앱과 공유하는 데 동의를 요청할 때 Google이 사용자에게 표시하는 정보를 사용자 지정합니다.

1. **자격 증명(Credentials)**을 선택한 다음 **자격 증명 생성(Create credentials)**을 선택합니다. **OAuth 클라이언트 ID(OAuth client ID)**를 선택합니다. **Android**를 **애플리케이션 유형(Application type)**으로 선택합니다. 앱을 개발하는 각 플랫폼에 대해 별도의 클라이언트 ID를 생성합니다.

1. **자격 증명(Credentials)**에서 **서비스 계정 관리(Manage service accounts)**를 선택합니다. **서비스 계정 생성(Create service account)**을 선택합니다. 서비스 계정 세부 정보를 입력한 다음 **생성 후 계속(Create and continue)**을 선택합니다.

1. 서비스 계정에 프로젝트에 대한 액세스 권한을 부여합니다. 앱에 필요한 대로 사용자에게 서비스 계정에 대한 액세스 권한을 부여합니다.

1. 새 서비스 계정을 선택하고 **키(Keys)** 탭을 선택하고 **키 추가(Add key)**를 선택합니다. 새 JSON 키를 생성하고 다운로드합니다.

Google 개발자 콘솔을 사용하는 방법에 대한 자세한 내용은 Google 클라우드 설명서에서 [프로젝트 만들기 및 관리](https://cloud.google.com/resource-manager/docs/creating-managing-projects)를 참조하세요.

Google을 Android 앱에 통합하는 방법에 대한 자세한 내용은 Google ID 설명서에서 [Sign in with Google을 사용하여 사용자 인증](https://developer.android.com/identity/sign-in/credential-manager-siwg)을 참조하세요.

**Google ID 제공업체(idP)를 추가하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체 추가**를 선택합니다.

1. **Google**을 선택합니다.

1. [Google Cloud Platform](https://console.cloud.google.com/)에서 생성한 OAuth 프로젝트의 **클라이언트 ID**를 입력합니다. 자세한 내용은 *Google Cloud Platform Console 도움말*의 [OAuth 2.0 설정](https://support.google.com/cloud/answer/6158849)을 참조하세요.

1. Amazon Cognito가 이 공급자를 통해 인증된 사용자에게 보안 인증을 발급할 때 요청하는 역할을 설정하려면 **역할 설정**을 구성하세요.

   1. **인증된 역할**을 구성할 때 설정한 **기본 역할**을 이 IdP의 사용자에게 할당하거나 **규칙을 사용하여 역할 선택**을 선택할 수 있습니다.

     1. **규칙을 사용하여 역할 선택**을 선택한 경우 사용자 인증의 소스 **클레임**, 클레임을 비교할 **연산자**, 이 역할 선택과 일치하도록 하는 **값** 및 **역할 할당**이 일치할 때 할당할 **역할**을 입력합니다. 다른 조건에 따라 추가 규칙을 생성하려면 **다른 항목 추가**를 선택합니다.

     1. **역할 해결**을 선택합니다. 사용자의 클레임이 규칙과 일치하지 않는 경우 보안 인증을 거부하거나 **인증된 역할**의 보안 인증을 발급할 수 있습니다.

1. Amazon Cognito가 이 공급자를 통해 인증한 사용자에게 보안 인증을 발급할 때 할당하는 보안 주체 태그를 변경하려면 **액세스 제어를 위한 속성**을 구성합니다.

   1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

   1. `sub` 및 `aud` 클레임 기반 보안 주체 태그를 적용하려면 **기본 매핑 사용**을 선택합니다.

   1. 보안 주체 태그에 대한 속성의 자체 사용자 지정 스키마를 생성하려면 **사용자 지정 매핑 사용**을 선택합니다. 그런 다음 태그에 표시하려는 각 **클레임**에서 소싱하려는 **태그 키**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

**Google 사용**

애플리케이션에서 Google로 로그인하도록 허용하려면 [Android용 Google 설명서](https://developers.google.com/identity/sign-in/android/start)의 지침을 따르세요. 사용자가 로그인하면 Google에서 OpenID Connect 인증 토큰을 요청합니다. 그런 다음 Amazon Cognito에서 토큰을 사용하여 사용자를 인증하고 고유한 식별자를 생성합니다.

다음 코드 예는 Google Play 서비스에서 인증 토큰을 가져오는 방법을 보여줍니다.

```
GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
String token = GoogleAuthUtil.getToken(getApplicationContext(), accounts[0].name,
        "audience:server:client_id:YOUR_GOOGLE_CLIENT_ID");
Map<String, String> logins = new HashMap<String, String>();
logins.put("accounts.google.com", token);
credentialsProvider.setLogins(logins);
```

## iOS - Objective-C
<a name="set-up-google-1.ios-objc"></a>

**참고**  
앱이 Google을 사용하고 여러 모바일 플랫폼에서 사용 가능한 경우 Google을 [OpenID Connect 공급자](open-id.md)로 구성합니다. 더 나은 통합을 위해 생성된 모든 클라이언트 ID를 추가 대상 값으로 추가합니다. Google 클라이언트 간 자격 증명 모델에 대한 자세한 내용은 [클라이언트 간 ID](https://developers.google.com/accounts/docs/CrossClientAuth)를 참조하세요.

**Google 설정**

iOS용 Google 로그인을 사용하려면 애플리케이션을 위한 Google 개발자 콘솔 프로젝트를 생성합니다.

1. [Google 개발자 콘솔](https://console.developers.google.com/)로 이동하여 새 프로젝트를 만듭니다.

1. **API 및 서비스(APIs & Services)**를 선택한 다음 **OAuth 동의 화면(OAuth consent screen)**을 선택합니다. Google에서 프로필 데이터를 앱과 공유하는 데 동의를 요청할 때 Google이 사용자에게 표시하는 정보를 사용자 지정합니다.

1. **자격 증명(Credentials)**을 선택한 다음 **자격 증명 생성(Create credentials)**을 선택합니다. **OAuth 클라이언트 ID(OAuth client ID)**를 선택합니다. **iOS**를 **애플리케이션 유형(Application type)**으로 선택합니다. 앱을 개발하는 각 플랫폼에 대해 별도의 클라이언트 ID를 생성합니다.

1. **자격 증명(Credentials)**에서 **서비스 계정 관리(Manage service accounts)**를 선택합니다. **서비스 계정 생성(Create service account)**을 선택합니다. 서비스 계정 세부 정보를 입력한 다음 **생성 후 계속(Create and continue)**을 선택합니다.

1. 서비스 계정에 프로젝트에 대한 액세스 권한을 부여합니다. 앱에 필요한 대로 사용자에게 서비스 계정에 대한 액세스 권한을 부여합니다.

1. 새 서비스 계정을 선택합니다. **키(Keys)** 탭을 선택한 다음 **키 추가(Add key)**를 선택합니다. 새 JSON 키를 생성하고 다운로드합니다.

Google 개발자 콘솔을 사용하는 방법에 대한 자세한 내용은 Google 클라우드 설명서에서 [프로젝트 만들기 및 관리](https://cloud.google.com/resource-manager/docs/creating-managing-projects)를 참조하세요.

Google을 iOS 앱에 통합하는 방법에 대한 자세한 내용은 Google 자격 증명 설명서에서 [Google Sign-In for iOS](https://developers.google.com/identity/sign-in/ios/start-integrating)를 참조하세요.

**Google ID 제공업체(idP)를 추가하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체 추가**를 선택합니다.

1. **Google**을 선택합니다.

1. [Google Cloud Platform](https://console.cloud.google.com/)에서 생성한 OAuth 프로젝트의 **클라이언트 ID**를 입력합니다. 자세한 내용은 *Google Cloud Platform Console 도움말*의 [OAuth 2.0 설정](https://support.google.com/cloud/answer/6158849)을 참조하세요.

1. Amazon Cognito가 이 공급자를 통해 인증된 사용자에게 보안 인증을 발급할 때 요청하는 역할을 설정하려면 **역할 설정**을 구성하세요.

   1. **인증된 역할**을 구성할 때 설정한 **기본 역할**을 이 IdP의 사용자에게 할당하거나 **규칙을 사용하여 역할 선택**을 선택할 수 있습니다.

     1. **규칙을 사용하여 역할 선택**을 선택한 경우 사용자 인증의 소스 **클레임**, 클레임을 비교할 **연산자**, 이 역할 선택과 일치하도록 하는 **값** 및 **역할 할당**이 일치할 때 할당할 **역할**을 입력합니다. 다른 조건에 따라 추가 규칙을 생성하려면 **다른 항목 추가**를 선택합니다.

     1. **역할 해결**을 선택합니다. 사용자의 클레임이 규칙과 일치하지 않는 경우 보안 인증을 거부하거나 **인증된 역할**의 보안 인증을 발급할 수 있습니다.

1. Amazon Cognito가 이 공급자를 통해 인증한 사용자에게 보안 인증을 발급할 때 할당하는 보안 주체 태그를 변경하려면 **액세스 제어를 위한 속성**을 구성합니다.

   1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

   1. `sub` 및 `aud` 클레임 기반 보안 주체 태그를 적용하려면 **기본 매핑 사용**을 선택합니다.

   1. 보안 주체 태그에 대한 속성의 자체 사용자 지정 스키마를 생성하려면 **사용자 지정 매핑 사용**을 선택합니다. 그런 다음 태그에 표시하려는 각 **클레임**에서 소싱하려는 **태그 키**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

**Google 사용**

애플리케이션에서 Google로 로그인하도록 허용하려면 [iOS용 Google 설명서](https://developers.google.com/identity/sign-in/ios/start/)를 따르세요. 인증에 성공하면 OpenID Connect 인증 토큰을 가져오고 Amazon Cognito에서 이를 사용하여 사용자를 인증하고 고유 식별자를 생성합니다.

인증에 성공하면 `id_token`이 포함된 `GTMOAuth2Authentication` 객체를 가져오고 Amazon Cognito에서 이를 사용하여 사용자를 인증하고 고유 식별자를 생성합니다.

```
- (void)finishedWithAuth: (GTMOAuth2Authentication *)auth error: (NSError *) error {
        NSString *idToken = [auth.parameters objectForKey:@"id_token"];
        credentialsProvider.logins = @{ @(AWSCognitoLoginProviderKeyGoogle): idToken };
    }
```

## iOS - Swift
<a name="set-up-google-1.ios-swift"></a>

**참고**  
앱이 Google을 사용하고 여러 모바일 플랫폼에서 사용 가능한 경우 Google을 [OpenID Connect 공급자](open-id.md)로 구성합니다. 더 나은 통합을 위해 생성된 모든 클라이언트 ID를 추가 대상 값으로 추가합니다. Google 클라이언트 간 자격 증명 모델에 대한 자세한 내용은 [클라이언트 간 ID](https://developers.google.com/accounts/docs/CrossClientAuth)를 참조하세요.

**Google 설정**

iOS용 Google 로그인을 사용하려면 애플리케이션을 위한 Google 개발자 콘솔 프로젝트를 생성합니다.

1. [Google 개발자 콘솔](https://console.developers.google.com/)로 이동하여 새 프로젝트를 만듭니다.

1. **API 및 서비스(APIs & Services)**를 선택한 다음 **OAuth 동의 화면(OAuth consent screen)**을 선택합니다. Google에서 프로필 데이터를 앱과 공유하는 데 동의를 요청할 때 Google이 사용자에게 표시하는 정보를 사용자 지정합니다.

1. **자격 증명(Credentials)**을 선택한 다음 **자격 증명 생성(Create credentials)**을 선택합니다. **OAuth 클라이언트 ID(OAuth client ID)**를 선택합니다. **iOS**를 **애플리케이션 유형(Application type)**으로 선택합니다. 앱을 개발하는 각 플랫폼에 대해 별도의 클라이언트 ID를 생성합니다.

1. **자격 증명(Credentials)**에서 **서비스 계정 관리(Manage service accounts)**를 선택합니다. **서비스 계정 생성(Create service account)**을 선택합니다. 서비스 계정 세부 정보를 입력한 다음 **생성 후 계속(Create and continue)**을 선택합니다.

1. 서비스 계정에 프로젝트에 대한 액세스 권한을 부여합니다. 앱에 필요한 대로 사용자에게 서비스 계정에 대한 액세스 권한을 부여합니다.

1. 새 서비스 계정을 선택하고 **키(Keys)** 탭을 선택하고 **키 추가(Add key)**를 선택합니다. 새 JSON 키를 생성하고 다운로드합니다.

Google 개발자 콘솔을 사용하는 방법에 대한 자세한 내용은 Google 클라우드 설명서에서 [프로젝트 만들기 및 관리](https://cloud.google.com/resource-manager/docs/creating-managing-projects)를 참조하세요.

Google을 iOS 앱에 통합하는 방법에 대한 자세한 내용은 Google 자격 증명 설명서에서 [Google Sign-In for iOS](https://developers.google.com/identity/sign-in/ios/start-integrating)를 참조하세요.

[Amazon Cognito 콘솔 홈 페이지](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀 관리(Manage Identity Pools)**를 선택합니다.

**Amazon Cognito 콘솔에서 외부 공급자 구성**

1. Google을 외부 공급자로 사용할 자격 증명 풀의 이름을 선택합니다. 자격 증명 풀에 대한 **대시보드** 페이지가 표시됩니다.

1. **대시보드** 페이지의 우측 상단 모서리에서 **자격 증명 풀 편집**을 선택합니다. 자격 증명 풀 편집(Edit identity pool) 페이지가 표시됩니다.

1. 아래로 스크롤하고 **인증 공급자(Authentication providers)**를 선택하여 섹션을 확장합니다.

1. **Google** 탭을 선택합니다.

1. **잠금 해제**를 선택합니다.

1. Google에서 가져온 Google 클라이언트 ID를 입력하고 **변경 사항 저장(Save Changes)**을 선택합니다.

**Google 사용**

애플리케이션에서 Google로 로그인하도록 허용하려면 [iOS용 Google 설명서](https://developers.google.com/identity/sign-in/ios/start/)를 따르세요. 인증에 성공하면 OpenID Connect 인증 토큰이 생성됩니다. Amazon Cognito에서는 이 토큰을 사용하여 사용자를 인증하고 고유한 식별자를 생성합니다.

인증에 성공하면 `GTMOAuth2Authentication`를 포함하는 `id_token` 객체가 생성됩니다. Amazon Cognito에서는 이 토큰을 사용하여 사용자를 인증하고 고유한 식별자를 생성합니다.

```
func finishedWithAuth(auth: GTMOAuth2Authentication!, error: NSError!) {
    if error != nil {
      print(error.localizedDescription)
    }
    else {
      let idToken = auth.parameters.objectForKey("id_token")
      credentialsProvider.logins = [AWSCognitoLoginProviderKey.Google.rawValue: idToken!]
    }
}
```

## JavaScript
<a name="set-up-google-1.javascript"></a>

**참고**  
앱이 Google을 사용하고 여러 모바일 플랫폼에서 사용 가능한 경우 Google을 [OpenID Connect 공급자](open-id.md)로 구성해야 합니다. 더 나은 통합을 위해 생성된 모든 클라이언트 ID를 추가 대상 값으로 추가합니다. Google 클라이언트 간 자격 증명 모델에 대한 자세한 내용은 [클라이언트 간 ID](https://developers.google.com/accounts/docs/CrossClientAuth)를 참조하세요.

**Google 설정**

JavaScript 웹 앱용 Google 로그인을 사용하려면 애플리케이션을 위한 Google 개발자 콘솔 프로젝트를 생성합니다.

1. [Google 개발자 콘솔](https://console.developers.google.com/)로 이동하여 새 프로젝트를 만듭니다.

1. **API 및 서비스(APIs & Services)**를 선택한 다음 **OAuth 동의 화면(OAuth consent screen)**을 선택합니다. Google에서 프로필 데이터를 앱과 공유하는 데 동의를 요청할 때 Google이 사용자에게 표시하는 정보를 사용자 지정합니다.

1. **자격 증명(Credentials)**을 선택한 다음 **자격 증명 생성(Create credentials)**을 선택합니다. **OAuth 클라이언트 ID(OAuth client ID)**를 선택합니다. **웹 애플리케이션(Web application)**을 **애플리케이션 유형(Application type)**으로 선택합니다. 앱을 개발하는 각 플랫폼에 대해 별도의 클라이언트 ID를 생성합니다.

1. **자격 증명(Credentials)**에서 **서비스 계정 관리(Manage service accounts)**를 선택합니다. **서비스 계정 생성(Create service account)**을 선택합니다. 서비스 계정 세부 정보를 입력한 다음 **생성 후 계속(Create and continue)**을 선택합니다.

1. 서비스 계정에 프로젝트에 대한 액세스 권한을 부여합니다. 앱에 필요한 대로 사용자에게 서비스 계정에 대한 액세스 권한을 부여합니다.

1. 새 서비스 계정을 선택하고 **키(Keys)** 탭을 선택하고 **키 추가(Add key)**를 선택합니다. 새 JSON 키를 생성하고 다운로드합니다.

Google 개발자 콘솔을 사용하는 방법에 대한 자세한 내용은 Google 클라우드 설명서에서 [프로젝트 만들기 및 관리](https://cloud.google.com/resource-manager/docs/creating-managing-projects)를 참조하세요.

Google을 웹 앱에 통합하는 방법에 대한 자세한 내용은 Google 자격 증명 설명서에서 [Sign in With Google](https://developers.google.com/identity/gsi/web/guides/overview)을 참조하세요.

**Amazon Cognito 콘솔에서 외부 공급자 구성**

**Google ID 제공업체(idP)를 추가하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체 추가**를 선택합니다.

1. **Google**을 선택합니다.

1. [Google Cloud Platform](https://console.cloud.google.com/)에서 생성한 OAuth 프로젝트의 **클라이언트 ID**를 입력합니다. 자세한 내용은 *Google Cloud Platform Console 도움말*의 [OAuth 2.0 설정](https://support.google.com/cloud/answer/6158849)을 참조하세요.

1. Amazon Cognito가 이 공급자를 통해 인증된 사용자에게 보안 인증을 발급할 때 요청하는 역할을 설정하려면 **역할 설정**을 구성하세요.

   1. **인증된 역할**을 구성할 때 설정한 **기본 역할**을 이 IdP의 사용자에게 할당하거나 **규칙을 사용하여 역할 선택**을 선택할 수 있습니다.

     1. **규칙을 사용하여 역할 선택**을 선택한 경우 사용자 인증의 소스 **클레임**, 클레임을 비교할 **연산자**, 이 역할 선택과 일치하도록 하는 **값** 및 **역할 할당**이 일치할 때 할당할 **역할**을 입력합니다. 다른 조건에 따라 추가 규칙을 생성하려면 **다른 항목 추가**를 선택합니다.

     1. **역할 해결**을 선택합니다. 사용자의 클레임이 규칙과 일치하지 않는 경우 보안 인증을 거부하거나 **인증된 역할**의 보안 인증을 발급할 수 있습니다.

1. Amazon Cognito가 이 공급자를 통해 인증한 사용자에게 보안 인증을 발급할 때 할당하는 보안 주체 태그를 변경하려면 **액세스 제어를 위한 속성**을 구성합니다.

   1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

   1. `sub` 및 `aud` 클레임 기반 보안 주체 태그를 적용하려면 **기본 매핑 사용**을 선택합니다.

   1. 보안 주체 태그에 대한 속성의 자체 사용자 지정 스키마를 생성하려면 **사용자 지정 매핑 사용**을 선택합니다. 그런 다음 태그에 표시하려는 각 **클레임**에서 소싱하려는 **태그 키**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

**Google 사용**

애플리케이션에서 Google로 로그인하도록 허용하려면 [웹용 Google 설명서](https://developers.google.com/identity/gsi/web/guides/overview)를 따르세요.

인증에 성공하면 `id_token`이 포함된 응답 객체가 생성됩니다 Amazon Cognito에서는 이 객체를 사용하여 사용자를 인증하고 고유한 식별자를 생성합니다.

```
function signinCallback(authResult) {
  if (authResult['status']['signed_in']) {

     // Add the Google access token to the Amazon Cognito credentials login map.
     AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'IDENTITY_POOL_ID',
        Logins: {
           'accounts.google.com': authResult['id_token']
        }
     });

     // Obtain AWS credentials
     AWS.config.credentials.get(function(){
        // Access AWS resources here.
     });
  }
}
```

# Sign in with Apple을 ID 풀 IdP로 설정
<a name="apple"></a>

Amazon Cognito ID 풀은 Sign in with Apple과 함께 작동하여 모바일 애플리케이션 및 웹 애플리케이션 사용자에게 페더레이션 인증을 제공합니다. 이 섹션에서는 Apple로 로그인을 자격 증명 공급자(IdP)로 사용하여 애플리케이션을 등록하고 설정하는 방법을 설명합니다.

Apple로 로그인을 인증 공급자로 자격 증명 풀에 추가하려면 두 단계를 진행해야 합니다. 먼저 애플리케이션에서 Apple로 로그인을 통합한 후 자격 증명 풀에서 Sign in with Apple을 구성합니다. Apple로 로그인 설정에 대한 최신 정보는 Apple 개발자 설명서의 [Apple로 로그인용 환경 구성](https://developer.apple.com/documentation/signinwithapple/configuring-your-environment-for-sign-in-with-apple)을 참조하세요.

## Sign in with Apple 설정
<a name="login-with-apple-setup"></a>

Apple로 로그인을 IdP로 구성하려면 애플리케이션을 Apple에 등록하여 클라이언트 ID를 받습니다.

1. [Apple에서 개발자 계정](https://developer.apple.com/programs/enroll/)을 생성합니다.

1. Apple 자격 증명으로 [로그인](https://developer.apple.com/account/#/welcome)합니다.

1. 왼쪽 탐색 창에서 **Certificates, IDs & Profiles(인증서, ID 및 프로필)**를 선택합니다.

1. 왼쪽 탐색 창에서 **Identifiers(식별자)**를 선택합니다.

1. **식별자(Identifiers)** 페이지에서 **\$1**아이콘을 선택합니다.

1. **새 식별자 등록(Register a New Identifier)** 페이지에서 **앱 ID(App IDs)**를 선택한 다음 **계속(Continue)**을 선택합니다.

1. **앱 ID 등록(Register an App ID)** 페이지에서 다음을 수행합니다.

   1. **설명**에 설명을 입력합니다.

   1. **Bundle ID(번들 ID)**에서 식별자를 입력합니다. 이 **번들 ID(Bundle ID)**를 적어 둡니다. Apple을 자격 증명 풀의 공급자로 구성하려면 이 값이 필요합니다.

   1. **기능(Capabilities)**에서 **Apple로 로그인(Sign In with Apple)**을 선택한 다음 **편집(Edit)**을 선택합니다.

   1. **Sign in with Apple: 앱 ID 구성** 페이지에서 앱에 적절한 설정을 선택합니다. 그런 다음 **저장**을 선택합니다.

   1. **계속**을 선택합니다.

1. **앱 ID 확인(Confirm your App ID)** 페이지에서 **등록(Register)**을 선택합니다.

1. Sign In with Apple을 네이티브 iOS 애플리케이션과 통합하려면 10단계로 이동합니다. 11단계는 Sign in with Apple JS와 통합하려는 애플리케이션을 위한 것입니다.

1. **식별자(Identifiers)** 페이지에서 **앱 ID(App IDs)** 메뉴를 선택한 다음 **서비스 ID(Services IDs)**를 선택합니다. **\$1** 아이콘을 선택합니다.

1. **새 식별자 등록(Register a New Identifier)** 페이지에서 **서비스 ID(Services IDs)**를 선택한 다음 **계속(Continue)**을 선택합니다.

1. **서비스 ID 등록(Register a Services ID)** 페이지에서 다음을 수행합니다.

   1. **설명**에 설명을 입력합니다.

   1. **Identifier(식별자)**에 식별자를 입력합니다. 서비스 ID를 적어 둡니다. Apple을 자격 증명 풀의 공급자로 구성하려면 이 값이 필요합니다.

   1. **Sign In with Apple**을 선택한 다음 **구성**을 선택합니다.

   1. **웹 인증 구성(Web Authentication Configuration)** 페이지에서 **기본 앱 ID(Primary App ID)**를 선택합니다. **웹 사이트 URL(Website URLs)**에서 **\$1** 아이콘을 선택합니다. **Domains and Subdomains(도메인 및 하위 도메인)**에 앱의 도메인 이름을 입력합니다. **반환 URL(Return URLs)**에 Apple로 로그인을 통해 사용자를 인증한 후 권한 부여가 사용자를 리디렉션하는 콜백 URL을 입력합니다.

   1. **다음**을 선택합니다.

   1. **계속(Continue)**, **등록(Register)**을 차례로 선택합니다.

1. 왼쪽 탐색 창에서 **키**를 선택합니다.

1. **키(Keys)** 페이지에 **\$1** 아이콘을 선택합니다.

1. **새 키 등록(Register a New Key)** 페이지에서 다음을 수행합니다.

   1. **키 이름**에서 키 이름을 입력합니다.

   1. **Apple로 로그인(Sign In with Apple)**을 선택한 다음 **구성(Configure)**을 선택합니다.

   1. **Configure Key(키 구성)** 페이지에서 **Primary App ID(기본 앱 ID)**를 선택하고 **저장**을 선택합니다.

   1. **계속(Continue)**, **등록(Register)**을 차례로 선택합니다.

**참고**  
Apple로 로그인을 네이티브 iOS 애플리케이션과 통합하려면 [Implementing User Authentication with Sign in with Apple](https://developer.apple.com/documentation/authenticationservices/implementing-user-authentication-with-sign-in-with-apple)(Apple로 로그인으로 사용자 인증 구현)을 참조하세요.  
Apple로 로그인을 네이티브 iOS 이외의 플랫폼에서 통합하려면 [Sign in with Apple JS](https://developer.apple.com/documentation/signinwithapplejs/)(Apple JS로 로그인)를 참조하세요.

## Amazon Cognito 페더레이션 자격 증명 콘솔에서 외부 공급자 구성
<a name="login-with-apple-configure-provider"></a>

다음 절차를 사용하여 외부 공급자를 구성합니다.

**Sign in with Apple ID 제공업체(idP)를 추가하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체 추가**를 선택합니다.

1. **Sign in with Apple**을 선택합니다.

1. [Apple 개발자](https://developer.apple.com)와 함께 생성한 OAuth 프로젝트의 **서비스 ID**를 입력합니다. 자세한 내용은 *Sign in with Apple 설명서*의 [Sign in with Apple로 사용자 인증](https://developer.apple.com/documentation/signinwithapple/authenticating-users-with-sign-in-with-apple)을 참조하세요.

1. Amazon Cognito가 이 공급자를 통해 인증된 사용자에게 보안 인증을 발급할 때 요청하는 역할을 설정하려면 **역할 설정**을 구성하세요.

   1. **인증된 역할**을 구성할 때 설정한 **기본 역할**을 이 IdP의 사용자에게 할당하거나 **규칙을 사용하여 역할 선택**을 선택할 수 있습니다.

     1. **규칙을 사용하여 역할 선택**을 선택한 경우 사용자 인증의 소스 **클레임**, 클레임을 비교할 **연산자**, 이 역할 선택과 일치하도록 하는 **값** 및 **역할 할당**이 일치할 때 할당할 **역할**을 입력합니다. 다른 조건에 따라 추가 규칙을 생성하려면 **다른 항목 추가**를 선택합니다.

     1. **역할 해결**을 선택합니다. 사용자의 클레임이 규칙과 일치하지 않는 경우 보안 인증을 거부하거나 **인증된 역할**의 보안 인증을 발급할 수 있습니다.

1. Amazon Cognito가 이 공급자를 통해 인증한 사용자에게 보안 인증을 발급할 때 할당하는 보안 주체 태그를 변경하려면 **액세스 제어를 위한 속성**을 구성합니다.

   1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

   1. `sub` 및 `aud` 클레임 기반 보안 주체 태그를 적용하려면 **기본 매핑 사용**을 선택합니다.

   1. 보안 주체 태그에 대한 속성의 자체 사용자 지정 스키마를 생성하려면 **사용자 지정 매핑 사용**을 선택합니다. 그런 다음 태그에 표시하려는 각 **클레임**에서 소싱하려는 **태그 키**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

## Amazon Cognito 페더레이션 자격 증명 CLI에서 Apple을 공급자로 사용하여 로그인 예제
<a name="sign-in-with-apple-cli-examples"></a>

이 예에서는 Apple로 로그인을 IdP로 사용하여 `MyIdentityPool`이라는 자격 증명 풀을 생성합니다.

`aws cognito-identity create-identity-pool --identity-pool-name MyIdentityPool --supported-login-providers appleid.apple.com="sameple.apple.clientid"`

 자세한 내용은 [자격 증명 풀 생성](https://docs.aws.amazon.com/cli/latest/reference/cognito-identity/create-identity-pool.html) 섹션을 참조하세요.

**Amazon Cognito 자격 증명 ID 생성**  
 이 예에서는 Amazon Cognito ID를 생성(또는 검색)합니다. 이는 퍼블릭 API이므로 이 API를 호출하는 데 자격 증명이 필요하지 않습니다.

`aws cognito-identity get-id --identity-pool-id SampleIdentityPoolId --logins appleid.apple.com="SignInWithAppleIdToken"`

자세한 내용은 [get-id](https://docs.aws.amazon.com/cli/latest/reference/cognito-identity/get-id.html) 섹션을 참조하세요.

**Amazon Cognito 자격 증명 ID의 자격 증명 가져오기**  
이 예제에서는 제공된 자격 증명 ID 및 Sign in with Apple 로그인의 자격 증명을 반환합니다. 이는 퍼블릭 API이므로 이 API를 호출하는 데 자격 증명이 필요하지 않습니다.

`aws cognito-identity get-credentials-for-identity --identity-id SampleIdentityId --logins appleid.apple.com="SignInWithAppleIdToken" `

자세한 내용은 [get-credentials-for-identity](https://docs.aws.amazon.com/cli/latest/reference/cognito-identity/get-credentials-for-identity.html) 섹션을 참조하세요.

## Sign in with Apple 사용: Android
<a name="set-up-apple-1.android"></a>

Apple은 Android용 Sign in with Apple을 지원하는 SDK를 제공하지 않습니다. 대신 웹 보기에서 웹 흐름을 사용할 수 있습니다.
+ 애플리케이션에서 Apple로 로그인을 구성하려면 Apple 설명서에서 [Configuring Your Web page for Sign In with Apple](https://developer.apple.com/documentation/signinwithapple/configuring-your-webpage-for-sign-in-with-apple)(Apple로 로그인용 웹 페이지 구성)을 따르세요.
+ **Sign in with Apple** 버튼을 Android 사용자 인터페이스에 추가하려면 Apple 설명서의 [웹에 Sign in with Apple 버튼 표시](https://developer.apple.com/documentation/signinwithapple/displaying-sign-in-with-apple-buttons-on-the-web)를 수행합니다.
+ Apple로 로그인을 사용하여 사용자를 안전하게 인증하려면 Apple 설명서에서 [Authenticating Users with Sign in with Apple](https://developer.apple.com/documentation/signinwithapple/authenticating-users-with-sign-in-with-apple)(Apple로 로그인으로 사용자 인증)을 따르세요.

세션 객체를 사용하여 Apple로 로그인하여 상태를 추적합니다. Amazon Cognito는이 세션 객체의 ID 토큰을 사용하여 사용자를 인증하고, 고유 식별자를 생성하고, 필요한 경우 사용자에게 다른 AWS 리소스에 대한 액세스 권한을 부여합니다.

```
@Override
public void onSuccess(Bundle response) {
    String token = response.getString("id_token");
    Map<String, String> logins = new HashMap<String, String>();
    logins.put("appleid.apple.com", token);
    credentialsProvider.setLogins(logins);
}
```

## Sign in with Apple 사용: iOS - Objective-C
<a name="set-up-apple-1.ios-objc"></a>

Apple은 네이티브 iOS 애플리케이션에서 Sign in with Apple에 대한 SDK 지원을 제공했습니다. 네이티브 iOS 디바이스에서 Apple로 로그인으로 사용자 인증을 구현하려면 Apple 설명서에서 [Implementing User Authentication with Sign in with Apple](https://developer.apple.com/documentation/authenticationservices/implementing-user-authentication-with-sign-in-with-apple)(Apple로 로그인으로 사용자 인증 구현)을 따르세요.

Amazon Cognito는 ID 토큰을 사용하여 사용자를 인증하고, 고유 식별자를 생성하고, 필요한 경우 사용자에게 다른 AWS 리소스에 대한 액세스 권한을 부여합니다.

```
(void)finishedWithAuth: (ASAuthorizationAppleIDCredential *)auth error: (NSError *) error {
        NSString *idToken = [ASAuthorizationAppleIDCredential objectForKey:@"identityToken"];
        credentialsProvider.logins = @{ "appleid.apple.com": idToken };
    }
```

## Sign in with Apple 사용: iOS - Swift
<a name="set-up-apple-1.ios-swift"></a>

Apple은 네이티브 iOS 애플리케이션에서 Sign in with Apple에 대한 SDK 지원을 제공했습니다. 네이티브 iOS 디바이스에서 Apple로 로그인으로 사용자 인증을 구현하려면 Apple 설명서에서 [Implementing User Authentication with Sign in with Apple](https://developer.apple.com/documentation/authenticationservices/implementing-user-authentication-with-sign-in-with-apple)(Apple로 로그인으로 사용자 인증 구현)을 따르세요.

Amazon Cognito는 ID 토큰을 사용하여 사용자를 인증하고, 고유 식별자를 생성하고, 필요한 경우 사용자에게 다른 AWS 리소스에 대한 액세스 권한을 부여합니다.

iOS에서 Apple로 로그인 설정에 대한 자세한 내용은 [Set up Sign in with Apple](https://docs.amplify.aws/sdk/auth/federated-identities/q/platform/ios#set-up-sign-in-with-apple)(Apple로 로그인 설정)을 참조하세요.

```
func finishedWithAuth(auth: ASAuthorizationAppleIDCredential!, error: NSError!) {
    if error != nil {
      print(error.localizedDescription)
    }
    else {
      let idToken = auth.identityToken,
      credentialsProvider.logins = ["appleid.apple.com": idToken!]
    }
}
```

## Sign in with Apple 사용: JavaScript
<a name="set-up-apple-1.javascript"></a>

Apple은 JavaScript용 Sign in with Apple을 지원하는 SDK를 제공하지 않습니다. 대신 웹 보기에서 웹 흐름을 사용할 수 있습니다.
+ 애플리케이션에서 Apple로 로그인을 구성하려면 Apple 설명서에서 [Configuring Your Web page for Sign In with Apple](https://developer.apple.com/documentation/signinwithapple/configuring-your-webpage-for-sign-in-with-apple)(Apple로 로그인용 웹 페이지 구성)을 따르세요.
+ **Sign in with Apple** 버튼을 JavaScript 사용자 인터페이스에 추가하려면 Apple 설명서의 [웹에 Sign in with Apple 버튼 표시](https://developer.apple.com/documentation/signinwithapple/displaying-sign-in-with-apple-buttons-on-the-web)를 수행합니다.
+ Apple로 로그인을 사용하여 사용자를 안전하게 인증하려면 Apple 설명서에서 [Authenticating Users with Sign in with Apple](https://developer.apple.com/documentation/signinwithapple/authenticating-users-with-sign-in-with-apple)(Apple로 로그인으로 사용자 인증)을 따르세요.

세션 객체를 사용하여 Apple로 로그인하여 상태를 추적합니다. Amazon Cognito는이 세션 객체의 ID 토큰을 사용하여 사용자를 인증하고, 고유 식별자를 생성하고, 필요한 경우 사용자에게 다른 AWS 리소스에 대한 액세스 권한을 부여합니다.

```
function signinCallback(authResult) {
     // Add the apple's id token to the Amazon Cognito credentials login map.
     AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'IDENTITY_POOL_ID',
        Logins: {
           'appleid.apple.com': authResult['id_token']
        }
     });

     // Obtain AWS credentials
     AWS.config.credentials.get(function(){
        // Access AWS resources here.
     });
}
```

# OIDC 제공업체를 ID 풀 IdP로 설정
<a name="open-id"></a>

[OpenID Connect](http://openid.net/connect/)는 여러 로그인 공급자가 지원하는 인증에 대한 개방형 표준입니다. Amazon Cognito를 사용하면 [AWS Identity and Access Management](https://aws.amazon.com/iam/)를 통해 구성하는 OpenID Connect 제공업체와 자격 증명을 연결할 수 있습니다.

**OpenID Connect 공급자 추가**

*OpenID Connect 공급자를 생성하는 방법에 대한 자세한 내용은 AWS Identity and Access Management  사용 설명서*의 [OIDC(OpenID Connect) ID 제공업체 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/identity-providers-oidc.html)을 참조하세요.

**Amazon Cognito와 공급자 연결**

**OIDC ID 제공업체(idP)를 생성하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체 추가**를 선택합니다.

1. **OpenId Connect(OIDC)**를 선택합니다.

1.  AWS 계정의 IAM IdP에서 **OIDC ID 제공업체**를 선택합니다. 새 SAML 공급자를 추가하려면 **새 공급자 생성**을 선택하여 IAM 콘솔로 이동합니다.

1. Amazon Cognito가 이 공급자를 통해 인증된 사용자에게 보안 인증을 발급할 때 요청하는 역할을 설정하려면 **역할 설정**을 구성하세요.

   1. **인증된 역할**을 구성할 때 설정한 **기본 역할**을 이 IdP의 사용자에게 할당하거나 **규칙을 사용하여 역할 선택**을 선택할 수 있습니다.

     1. **규칙을 사용하여 역할 선택**을 선택한 경우 사용자 인증의 소스 **클레임**, 클레임을 비교할 **연산자**, 이 역할 선택과 일치하도록 하는 **값** 및 **역할 할당**이 일치할 때 할당할 **역할**을 입력합니다. 다른 조건에 따라 추가 규칙을 생성하려면 **다른 항목 추가**를 선택합니다.

     1. **역할 해결**을 선택합니다. 사용자의 클레임이 규칙과 일치하지 않는 경우 보안 인증을 거부하거나 **인증된 역할**의 보안 인증을 발급할 수 있습니다.

1. Amazon Cognito가 이 공급자를 통해 인증한 사용자에게 보안 인증을 발급할 때 할당하는 보안 주체 태그를 변경하려면 **액세스 제어를 위한 속성**을 구성합니다.

   1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

   1. `sub` 및 `aud` 클레임 기반 보안 주체 태그를 적용하려면 **기본 매핑 사용**을 선택합니다.

   1. 보안 주체 태그에 대한 속성의 자체 사용자 지정 스키마를 생성하려면 **사용자 지정 매핑 사용**을 선택합니다. 그런 다음 태그에 표시하려는 각 **클레임**에서 소싱하려는 **태그 키**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

여러 OpenID Connect 공급자를 단일 자격 증명 풀에 연결할 수 있습니다.

**OpenID Connect 사용**

로그인하고 ID 토큰을 받는 방법은 공급자 설명서를 참조하세요.

토큰을 받은 후에는 토큰을 로그인 맵에 추가합니다. 공급자의 URI를 키로 사용합니다.

**OpenID Connect 토큰 검증**

Amazon Cognito와 처음 통합할 때 `InvalidToken` 예외가 발생할 수 있습니다. Amazon Cognito가 OpenID Connect(OIDC) 토큰을 검증하는 방법을 이해해야 합니다.

**참고**  
여기([https://tools.ietf.org/html/rfc7523](https://tools.ietf.org/html/rfc7523))에 명시된 바와 같이 Amazon Cognito는 시스템 간의 클럭 스큐를 처리하는 5분의 유예 기간을 제공합니다.

1. `iss` 파라미터가 로그인 맵에 사용된 키(예: login.provider.com)와 일치해야 합니다.

1. 서명이 유효해야 합니다. RSA 퍼블릭 키를 통해 서명을 확인할 수 있어야 합니다.
**참고**  
ID 풀은 짧은 기간 동안 OIDC IdP 서명 키의 캐시를 유지합니다. 제공업체가 서명 키를 변경하면 Amazon Cognito는 이 캐시가 새로 고칠 때까지 `NoKeyFound` 오류를 반환할 수 있습니다. 이 오류가 발생하면 ID 풀이 서명 키를 새로 고칠 때까지 약 10분 정도 기다립니다.

1. 인증서 퍼블릭 키의 지문은 OIDC 공급자를 생성할 때 IAM에서 설정한 지문과 일치합니다.

1. `azp` 파라미터가 있으면 이 값을 OIDC 공급자에서 나열된 클라이언트 ID와 비교하여 확인합니다.

1. `azp` 파라미터가 없으면 `aud` 파라미터를 OpenId Connect 공급자에서 나열된 클라이언트 ID와 비교하여 확인합니다.

[jwt.io](http://jwt.io/) 웹 사이트는 토큰을 디코딩하고 이러한 값을 확인하는 데 사용할 수 있는 중요한 리소스입니다.

## Android
<a name="set-up-open-id-1.android"></a>

```
Map<String, String> logins = new HashMap<String, String>();
logins.put("login.provider.com", token);
credentialsProvider.setLogins(logins);
```

## iOS - Objective-C
<a name="set-up-open-id-1.ios-objc"></a>

```
credentialsProvider.logins = @{ "login.provider.com": token }
```

## JavaScript
<a name="set-up-open-id-1.javascript"></a>

```
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
 IdentityPoolId: 'IDENTITY_POOL_ID',
 Logins: {
    'login.provider.com': token
 }
});
```

# SAML 제공업체를 ID 풀 IdP로 설정
<a name="saml-identity-provider"></a>

Amazon Cognito ID 풀을 사용하면 SAML 2.0을 통해 ID 제공업체(IdPs)로 사용자를 인증할 수 있습니다. Amazon Cognito에서 SAML을 지원하는 IdP를 사용하여 사용자를 위한 간단한 온보딩 흐름을 제공할 수 있습니다. SAML을 지원하는 IdP는 사용자가 수임할 수 있는 IAM 역할을 지정합니다. 이렇게 하면 사용자마다 서로 다른 권한 집합을 받을 수 있습니다.

## SAML IdP에 맞게 자격 증명 풀 구성
<a name="configure-identity-pool-saml-provider"></a>

다음 단계에서는 자격 증명 풀에서 SAML 기반 IdP를 사용하도록 구성하는 방법을 설명합니다.

**참고**  
자격 증명 풀에서 SAML 공급자를 지원하도록 구성하기 전에 먼저 [IAM 콘솔](https://console.aws.amazon.com/iam)에서 SAML IdP를 구성합니다. 자세한 내용은 *IAM 사용 설명서*에서 [AWS와 서드 파티 SAML 솔루션 공급자 통합](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml_3rd-party.html)을 참조하세요.

**SAML ID 제공업체(idP)를 추가하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체 추가**를 선택합니다.

1. **SAML**을 선택합니다.

1.  AWS 계정의 IAM IdP에서 **SAML ID 제공업체**를 선택합니다. 새 SAML 공급자를 추가하려면 **새 공급자 생성**을 선택하여 IAM 콘솔로 이동합니다.

1. Amazon Cognito가 이 공급자를 통해 인증된 사용자에게 보안 인증을 발급할 때 요청하는 역할을 설정하려면 **역할 설정**을 구성하세요.

   1. **인증된 역할**을 구성할 때 설정한 **기본 역할**을 이 IdP의 사용자에게 할당하거나 **규칙을 사용하여 역할 선택**을 선택할 수 있습니다.

     1. **규칙을 사용하여 역할 선택**을 선택한 경우 사용자 인증의 소스 **클레임**, 클레임을 비교할 **연산자**, 이 역할 선택과 일치하도록 하는 **값** 및 **역할 할당**이 일치할 때 할당할 **역할**을 입력합니다. 다른 조건에 따라 추가 규칙을 생성하려면 **다른 항목 추가**를 선택합니다.

     1. **역할 해결**을 선택합니다. 사용자의 클레임이 규칙과 일치하지 않는 경우 보안 인증을 거부하거나 **인증된 역할**의 보안 인증을 발급할 수 있습니다.

1. Amazon Cognito가 이 공급자를 통해 인증한 사용자에게 보안 인증을 발급할 때 할당하는 보안 주체 태그를 변경하려면 **액세스 제어를 위한 속성**을 구성합니다.

   1. 보안 주체 태그를 적용하지 않으려면 **비활성**을 선택합니다.

   1. `sub` 및 `aud` 클레임 기반 보안 주체 태그를 적용하려면 **기본 매핑 사용**을 선택합니다.

   1. 보안 주체 태그에 대한 속성의 자체 사용자 지정 스키마를 생성하려면 **사용자 지정 매핑 사용**을 선택합니다. 그런 다음 태그에 표시하려는 각 **클레임**에서 소싱하려는 **태그 키**를 입력합니다.

1. **변경 사항 저장**을 선택합니다.

## SAML IdP 구성
<a name="configure-your-saml-identity-provider"></a>

SAML 공급자를 생성한 후에 SAML IdP에서 IdP와 AWS간에 신뢰 당사자 신뢰를 추가하도록 구성합니다. 많은 IdP에서 IdP가 XML 문서에서 신뢰 당사자 정보 및 인증서를 읽는 데 사용할 수 있는 URL을 지정할 수 있습니다. 의 AWS경우 [https://signin.aws.amazon.com/static/saml-metadata.xml](https://signin.aws.amazon.com/static/saml-metadata.xml) 사용할 수 있습니다. 다음 단계는 IdP의 SAML 어설션 응답을 구성하여에 AWS 필요한 클레임을 채우는 것입니다. 클레임 구성에 대한 자세한 내용은 [인증 응답을 위한 SAML 어설션 구성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_assertions.html)을 참조하세요.

SAML IdP가 SAML 메타데이터에 서명 인증서를 두 개 이상 포함하는 경우, 로그인 시 ID 풀은 SAML 어설션이 SAML 메타데이터에 있는 인증서와 일치할 경우 유효하다고 판단합니다.

## SAML로 사용자 역할 사용자 정의
<a name="role-customization-saml"></a>

Amazon Cognito Identity와 함께 SAML을 사용하면 최종 사용자에 맞게 역할을 사용자 지정할 수 있습니다. Amazon Cognito는 [향상된 흐름](authentication-flow.md)을 SAML 기반 IdP를 통해서만 지원합니다. 자격 증명 풀에서 SAML 기반 IdP를 사용할 수 있도록 인증된 역할 또는 인증되지 않은 역할을 지정할 필요는 없습니다. `https://aws.amazon.com/SAML/Attributes/Role` 클레임 속성은 쉼표로 구분된 하나 이상의 역할 및 공급자 ARN 쌍을 지정합니다. 이는 사용자가 수임할 수 있는 역할입니다. SAML IdP가 IdP에서 얻을 수 있는 사용자 속성 정보를 기반으로 역할 속성을 채우도록 구성할 수 있습니다. SAML 어설션에서 여러 역할을 받으면 `getCredentialsForIdentity`를 호출하는 동안 선택적 `customRoleArn` 파라미터를 채웁니다. 역할이 SAML 어설션의 클레임에 있는 역할과 일치하는 경우 사용자가 이 `customRoleArn`을 수임합니다.

## SAML IdP를 사용하여 사용자 인증
<a name="authenticate-user-with-saml"></a>

SAML 기반 IdP와 페더레이션하려면 사용자가 login. AWS federation에서 IdP 시작 로그인을 사용하는 URL을 결정합니다. AD FS 2.0에서 URL 형식은 `https://<fqdn>/adfs/ls/IdpInitiatedSignOn.aspx?loginToRp=urn:amazon:webservices`입니다.

Amazon Cognito에서 SAML IdP에 대한 지원을 추가하려면 먼저 iOS나 Android 애플리케이션에서 SAML 자격 증명 공급자로 사용자를 인증합니다. SAML IdP와 통합하고 인증하는 데 사용하는 코드는 SAML 공급자에 따라 다릅니다. 사용자가 인증된 후에 Amazon Cognito API를 사용하여 Amazon Cognito Identity에 결과 SAML 어설션을 제공할 수 있습니다.

자격 증명 풀 API 요청의`Logins` 맵에서 SAML 어설션을 반복하거나 *재생*할 수 없습니다. 재생된 SAML 어설션에는 이전 API 요청의 ID와 중복되는 어설션 ID가 있습니다. `Logins` 맵에서 SAML 어설션을 수락할 수 있는 API 작업에는 [GetID](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html), [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html), [GetOpenIdToken](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html), 및 [GetOpenIDTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html)이 포함됩니다. 자격 증명 풀 인증 흐름에서 API 요청당 SAML 어설션 ID를 한 번 재생할 수 있습니다. 예를 들어 `GetId` 요청과 후속 `GetCredentialsForIdentity` 요청에는 동일한 SAML 어설션을 제공할 수 있지만 두 번째 `GetId` 요청에서는 제공할 수 없습니다.

# 개발자 인증 자격 증명
<a name="developer-authenticated-identities"></a>

Amazon Cognito는 [Facebook을 ID 풀 IdP로 설정](facebook.md), [Google을 ID 풀 IdP로 설정](google.md), [Amazon을 사용하여 ID 풀 IdP로 로그인 설정](amazon.md), [Sign in with Apple을 ID 풀 IdP로 설정](apple.md)을 통한 웹 아이덴티티 페더레이션 외에 개발자 인증 자격 증명을 지원합니다. 개발자 인증 자격 증명을 사용하면 Amazon Cognito를 사용하여 사용자 데이터를 동기화하고 AWS 리소스에 액세스하는 동시에 기존 인증 프로세스를 통해 사용자를 등록하고 인증할 수 있습니다. 개발자 인증 자격 증명을 사용하려면 최종 사용자 디바이스, 인증을 위한 백엔드, Amazon Cognito 간의 상호 작용이 필요합니다. 자세한 내용은 AWS 블로그의 [ Amazon Cognito 인증 파트 2: 개발자 인증 자격 증명 이해를](https://aws.amazon.com/blogs/mobile/understanding-amazon-cognito-authentication-part-2-developer-authenticated-identities/) 참조하세요.

## 인증 흐름 이해
<a name="understanding-the-authentication-flow"></a>

[GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html) API 작업은 향상된 인증과 기본 인증 모두에 대한 개발자 인증을 시작할 수 있습니다. 이 API는 관리 자격 증명으로 요청을 인증합니다. `Logins` 맵은 사용자 지정 식별자와 쌍을 이루는 `login.mydevprovider`와 같은 ID 풀 개발자 공급자 이름입니다.

예제:

```
"Logins": {
        "login.mydevprovider": "my developer identifier"
    }
```

**향상된 인증**

이름이 `cognito-identity.amazonaws.com`이고 `GetOpenIdTokenForDeveloperIdentity`의 토큰 값이 있는 `Logins` 맵을 사용하여 [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html) API 작업을 호출합니다.

예제:

```
"Logins": {
        "cognito-identity.amazonaws.com": "eyJra12345EXAMPLE"
    }
```

개발자 인증 ID가 있는 `GetCredentialsForIdentity`는 ID 풀의 기본 인증 역할에 대한 임시 자격 증명을 반환합니다.

**기본 인증**

[AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 작업을 호출하고 적절한 [신뢰 관계가 정의된](iam-roles.md#role-trust-and-permissions) IAM 역할의 `RoleArn`을 요청합니다. `WebIdentityToken`의 값을 `GetOpenIdTokenForDeveloperIdentity`에서 가져온 토큰으로 설정합니다.

개발자 인증 ID 인증 흐름 및 외부 공급자 ID와 어떻게 다른지에 대한 자세한 내용은 [자격 증명 풀 인증 흐름](authentication-flow.md) 섹션을 참조하세요.

## 개발자 공급자 이름 정의 및 자격 증명 풀에 연결
<a name="associate-developer-provider"></a>

개발자 인증 자격 증명을 사용하려면 개발자 공급자에 연결된 자격 증명 풀이 필요합니다. 이렇게 하려면 다음 단계를 따릅니다.

**사용자 지정 개발자 공급자를 추가하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에서 **자격 증명 풀**을 선택합니다. 자격 증명 풀을 선택합니다.

1. **사용자 액세스** 탭을 선택합니다.

1. **ID 제공업체 추가**를 선택합니다.

1. **사용자 지정 개발자 공급자**를 선택합니다.

1. **개발자 공급자 이름**을 입력합니다. 개발자 공급자는 추가 후에는 변경 또는 제거할 수 없습니다.

1. **변경 사항 저장**을 선택합니다.

참고: 공급자 이름을 설정하면 해당 이름을 변경할 수 없습니다.

## 자격 증명 공급자 구현
<a name="implement-an-identity-provider"></a>

### Android
<a name="implement-id-provider-1.android"></a>

개발자 인증 자격 증명을 사용하려면 `AWSAbstractCognitoIdentityProvider`를 확장하는 고유한 ID 제공업체 클래스를 구현합니다. 자격 증명 공급자 클래스는 토큰이 속성으로 포함된 응답 객체를 반환해야 합니다.

다음은 ID 제공업체의 기본 예입니다.

```
public class DeveloperAuthenticationProvider extends AWSAbstractCognitoDeveloperIdentityProvider {

  private static final String developerProvider = "<Developer_provider_name>";

  public DeveloperAuthenticationProvider(String accountId, String identityPoolId, Regions region) {
    super(accountId, identityPoolId, region);
    // Initialize any other objects needed here.
  }

  // Return the developer provider name which you choose while setting up the
  // identity pool in the &COG; Console

  @Override
  public String getProviderName() {
    return developerProvider;
  }

  // Use the refresh method to communicate with your backend to get an
  // identityId and token.

  @Override
  public String refresh() {

    // Override the existing token
    setToken(null);

    // Get the identityId and token by making a call to your backend
    // (Call to your backend)

    // Call the update method with updated identityId and token to make sure
    // these are ready to be used from Credentials Provider.

    update(identityId, token);
    return token;

  }

  // If the app has a valid identityId return it, otherwise get a valid
  // identityId from your backend.

  @Override
  public String getIdentityId() {

    // Load the identityId from the cache
    identityId = cachedIdentityId;

    if (identityId == null) {
       // Call to your backend
    } else {
       return identityId;
    }

  }
}
```

이 자격 증명 공급자를 사용하려면 해당 공급자를 `CognitoCachingCredentialsProvider`에 전달해야 합니다. 다음은 그 예입니다.

```
DeveloperAuthenticationProvider developerProvider = new DeveloperAuthenticationProvider( null, "IDENTITYPOOLID", context, Regions.USEAST1);
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider( context, developerProvider, Regions.USEAST1);
```

### iOS - Objective-C
<a name="implement-id-provider-1.ios-objc"></a>

개발자 인증 자격 증명을 사용하려면 [AWSCognitoCredentialsProviderHelper](https://github.com/aws-amplify/aws-sdk-ios)를 확장하는 자체 ID 제공업체 클래스를 구현합니다. 자격 증명 공급자 클래스는 토큰이 속성으로 포함된 응답 객체를 반환해야 합니다.

```
@implementation DeveloperAuthenticatedIdentityProvider
/*
 * Use the token method to communicate with your backend to get an
 * identityId and token.
 */

- (AWSTask <NSString*> *) token {
    //Write code to call your backend:
    //Pass username/password to backend or some sort of token to authenticate user
    //If successful, from backend call getOpenIdTokenForDeveloperIdentity with logins map 
    //containing "your.provider.name":"enduser.username"
    //Return the identity id and token to client
    //You can use AWSTaskCompletionSource to do this asynchronously

    // Set the identity id and return the token
    self.identityId = response.identityId;
    return [AWSTask taskWithResult:response.token];
}

@end
```

이 자격 증명 공급자를 사용하려면 다음 예에 표시된 대로 해당 공급자를 `AWSCognitoCredentialsProvider`에 전달합니다.

```
DeveloperAuthenticatedIdentityProvider * devAuth = [[DeveloperAuthenticatedIdentityProvider alloc] initWithRegionType:AWSRegionYOUR_IDENTITY_POOL_REGION 
                                         identityPoolId:@"YOUR_IDENTITY_POOL_ID"
                                        useEnhancedFlow:YES
                                identityProviderManager:nil];
AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc]
                                                          initWithRegionType:AWSRegionYOUR_IDENTITY_POOL_REGION
                                                          identityProvider:devAuth];
```

미인증 자격 증명과 개발자 인증 자격 증명을 모두 지원하려면 `AWSCognitoCredentialsProviderHelper` 구현에서 `logins` 메서드를 무시합니다.

```
- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins {
    if(/*logic to determine if user is unauthenticated*/) {
        return [AWSTask taskWithResult:nil];
    }else{
        return [super logins];
    }
}
```

개발자 인증 자격 증명 및 소셜 공급자를 지원하려면 `AWSCognitoCredentialsProviderHelper`의 `logins` 구현에서 현재 공급자가 누구인지 관리해야 합니다.

```
- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins {
    if(/*logic to determine if user is unauthenticated*/) {
        return [AWSTask taskWithResult:nil];
    }else if (/*logic to determine if user is Facebook*/){
        return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : [FBSDKAccessToken currentAccessToken] }];
    }else {
        return [super logins];
    }
}
```

### iOS - Swift
<a name="implement-id-provider-1.ios-swift"></a>

개발자 인증 자격 증명을 사용하려면 [AWSCognitoCredentialsProviderHelper](https://github.com/aws-amplify/aws-sdk-ios)를 확장하는 자체 ID 제공업체 클래스를 구현합니다. 자격 증명 공급자 클래스는 토큰이 속성으로 포함된 응답 객체를 반환해야 합니다.

```
import AWSCore
/*
 * Use the token method to communicate with your backend to get an
 * identityId and token.
 */
class DeveloperAuthenticatedIdentityProvider : AWSCognitoCredentialsProviderHelper {
    override func token() -> AWSTask<NSString> {
    //Write code to call your backend:
    //pass username/password to backend or some sort of token to authenticate user, if successful, 
    //from backend call getOpenIdTokenForDeveloperIdentity with logins map containing "your.provider.name":"enduser.username"
    //return the identity id and token to client
    //You can use AWSTaskCompletionSource to do this asynchronously

    // Set the identity id and return the token
    self.identityId = resultFromAbove.identityId
    return AWSTask(result: resultFromAbove.token)
}
```

이 자격 증명 공급자를 사용하려면 다음 예에 표시된 대로 해당 공급자를 `AWSCognitoCredentialsProvider`에 전달합니다.

```
let devAuth = DeveloperAuthenticatedIdentityProvider(regionType: .YOUR_IDENTITY_POOL_REGION, identityPoolId: "YOUR_IDENTITY_POOL_ID", useEnhancedFlow: true, identityProviderManager:nil)
let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .YOUR_IDENTITY_POOL_REGION, identityProvider:devAuth)
let configuration = AWSServiceConfiguration(region: .YOUR_IDENTITY_POOL_REGION, credentialsProvider:credentialsProvider)
AWSServiceManager.default().defaultServiceConfiguration = configuration
```

미인증 자격 증명과 개발자 인증 자격 증명을 모두 지원하려면 `AWSCognitoCredentialsProviderHelper` 구현에서 `logins` 메서드를 무시합니다.

```
override func logins () -> AWSTask<NSDictionary> {
    if(/*logic to determine if user is unauthenticated*/) {
        return AWSTask(result:nil)
    }else {
        return super.logins()
    }
}
```

개발자 인증 자격 증명 및 소셜 공급자를 지원하려면 `AWSCognitoCredentialsProviderHelper`의 `logins` 구현에서 현재 공급자가 누구인지 관리해야 합니다.

```
override func logins () -> AWSTask<NSDictionary> {
    if(/*logic to determine if user is unauthenticated*/) {
        return AWSTask(result:nil)
    }else if (/*logic to determine if user is Facebook*/){
        if let token = AccessToken.current?.authenticationToken {
            return AWSTask(result: [AWSIdentityProviderFacebook:token])
        }
        return AWSTask(error:NSError(domain: "Facebook Login", code: -1 , userInfo: ["Facebook" : "No current Facebook access token"]))
    }else {
        return super.logins()
    }
}
```

### JavaScript
<a name="implement-id-provider-1.javascript"></a>

백엔드에서 자격 증명 ID 및 세션 토큰을 가져온 경우 이를 `AWS.CognitoIdentityCredentials` 공급자에 전달합니다. 다음은 그 예입니다.

```
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
   IdentityPoolId: 'IDENTITY_POOL_ID',
   IdentityId: 'IDENTITY_ID_RETURNED_FROM_YOUR_PROVIDER',
   Logins: {
      'cognito-identity.amazonaws.com': 'TOKEN_RETURNED_FROM_YOUR_PROVIDER'
   }
});
```

### Unity
<a name="implement-id-provider-1.unity"></a>

개발자 인증 자격 증명을 사용하려면 `CognitoAWSCredentials`를 확장하고 `RefreshIdentity` 메서드를 무시하여 백엔드에서 사용자 자격 증명 ID와 토큰을 검색하고 이를 반환해야 합니다. 다음은 'example.com'의 가상 백엔드에 접촉하는 ID 제공업체의 간단한 예입니다.

```
using UnityEngine;
using System.Collections;
using Amazon.CognitoIdentity;
using System.Collections.Generic;
using ThirdParty.Json.LitJson;
using System;
using System.Threading;

public class DeveloperAuthenticatedCredentials : CognitoAWSCredentials
{
    const string PROVIDER_NAME = "example.com";
    const string IDENTITY_POOL = "IDENTITY_POOL_ID";
    static readonly RegionEndpoint REGION = RegionEndpoint.USEast1;

    private string login = null;

    public DeveloperAuthenticatedCredentials(string loginAlias)
        : base(IDENTITY_POOL, REGION)
    {
        login = loginAlias;
    }

    protected override IdentityState RefreshIdentity()
    {
        IdentityState state = null;
        ManualResetEvent waitLock = new ManualResetEvent(false);
        MainThreadDispatcher.ExecuteCoroutineOnMainThread(ContactProvider((s) =>
        {
            state = s;
            waitLock.Set();
        }));
        waitLock.WaitOne();
        return state;
    }

    IEnumerator ContactProvider(Action<IdentityState> callback)
    {
        WWW www = new WWW("http://example.com/?username="+login);
        yield return www;
        string response = www.text;

        JsonData json = JsonMapper.ToObject(response);

        //The backend has to send us back an Identity and a OpenID token
        string identityId = json["IdentityId"].ToString();
        string token = json["Token"].ToString();

        IdentityState state = new IdentityState(identityId, PROVIDER_NAME, token, false);
        callback(state);
    }
}
```

위의 코드는 스레드 디스패처 객체를 사용하여 코루틴을 호출합니다. 프로젝트에서 이 작업을 수행할 방법이 없는 경우 장면에서 다음 스크립트를 사용할 수 있습니다.

```
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class MainThreadDispatcher : MonoBehaviour
{
    static Queue<IEnumerator> _coroutineQueue = new Queue<IEnumerator>();
    static object _lock = new object();

    public void Update()
    {
        while (_coroutineQueue.Count > 0)
        {
            StartCoroutine(_coroutineQueue.Dequeue());
        }
    }

    public static void ExecuteCoroutineOnMainThread(IEnumerator coroutine)
    {
        lock (_lock) {
            _coroutineQueue.Enqueue(coroutine);
        }
    }
}
```

### Xamarin
<a name="implement-id-provider-1.xamarin"></a>

개발자 인증 자격 증명을 사용하려면 `CognitoAWSCredentials`를 확장하고 `RefreshIdentity` 메서드를 무시하여 백엔드에서 사용자 자격 증명 ID와 토큰을 검색하고 이를 반환해야 합니다. 다음은 'example.com'의 가상 백엔드에 접촉하는 ID 제공업체의 기본 예입니다.

```
public class DeveloperAuthenticatedCredentials : CognitoAWSCredentials
{
    const string PROVIDER_NAME = "example.com";
    const string IDENTITY_POOL = "IDENTITY_POOL_ID";
    static readonly RegionEndpoint REGION = RegionEndpoint.USEast1;
    private string login = null;

    public DeveloperAuthenticatedCredentials(string loginAlias)
        : base(IDENTITY_POOL, REGION)
    {
        login = loginAlias;
    }

    protected override async Task<IdentityState> RefreshIdentityAsync()
    {
        IdentityState state = null;
        //get your identity and set the state
        return state;
    }
}
```

## 로그인 맵 업데이트(Android 및 iOS 전용)
<a name="updating-the-logins-map"></a>

### Android
<a name="updating-logins-map-1.android"></a>

인증 시스템을 통해 사용자를 성공적으로 인증한 후 개발자 공급자 이름 및 개발자 사용자 식별자로 로그인 맵을 업데이트합니다. 이것은 인증 시스템에서 사용자를 고유하게 식별하는 영숫자 문자열입니다. `refresh`가 변경되었을 수 있으므로 로그인 맵을 업데이트한 후 `identityId` 메서드를 호출해야 합니다.

```
HashMap<String, String> loginsMap = new HashMap<String, String>();
loginsMap.put(developerAuthenticationProvider.getProviderName(), developerUserIdentifier);

credentialsProvider.setLogins(loginsMap);
credentialsProvider.refresh();
```

### iOS - Objective-C
<a name="updating-logins-map-1.ios-objc"></a>

iOS SDK는 자격 증명이 없거나 만료된 경우 `logins` 메서드만 호출하여 최신 로그인 맵을 가져옵니다. SDK에서 새 자격 증명을 얻도록 강제하려면(예를 들어 최종 사용자가 미인증 상태에서 인증 상태로 변경되었으며 인증된 사용자에 대한 자격 증명을 원하는 경우) `credentialsProvider`에 대해 `clearCredentials`를 호출하세요.

```
[credentialsProvider clearCredentials];
```

### iOS - Swift
<a name="updating-logins-map-1.ios-swift"></a>

iOS SDK는 자격 증명이 없거나 만료된 경우 `logins` 메서드만 호출하여 최신 로그인 맵을 가져옵니다. SDK에서 새 자격 증명을 얻도록 강제하려면(예: 최종 사용자가 미인증 상태에서 인증 상태로 변경되었으며 인증된 사용자에 대한 자격 증명을 원하는 경우) `clearCredentials`에 대해 `credentialsProvider`를 호출하세요.

```
credentialsProvider.clearCredentials()
```

## 토큰 가져오기(서버 측)
<a name="getting-a-token-server-side"></a>

[GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html)를 호출하여 토큰을 받습니다. 이 API는 AWS 개발자 자격 증명을 사용하여 백엔드에서 호출해야 합니다. 클라이언트 SDK에서 호출해서는 안 됩니다. API는 Cognito 자격 증명 풀 ID, ID 제공업체 이름이 키로, 식별자가 값으로 포함된 로그인 맵 및 필요할 경우 Cognito 자격 증명 ID를 받습니다(예를 들어 미인증 사용자를 인증된 사용자로 변경하는 경우). 식별자는 사용자의 사용자 이름, 이메일 주소 또는 숫자 값일 수 있습니다. API는 사용자에 대한 고유한 Cognito ID와 최종 사용자에 대한 OpenID Connect 토큰을 사용하여 호출에 응답합니다.

`GetOpenIdTokenForDeveloperIdentity`에 의해 반환된 토큰에 대해 유의해야 할 몇 가지 사항은 다음과 같습니다.
+ 캐시할 수 있도록 토큰에 대한 사용자 지정 만료 시간을 지정할 수 있습니다. 사용자 지정 만료 시간을 제공하지 않으면 토큰은 15분 동안 유효합니다.
+ 설정할 수 있는 최대 토큰 지속 시간은 24시간입니다.
+ 토큰 지속 시간의 증가에 따른 보안 영향을 주의하세요. 공격자는이 토큰을 획득하면 토큰 기간 동안 최종 사용자의 AWS 자격 증명으로 교환할 수 있습니다.

다음 Java 조각은 Amazon Cognito 클라이언트를 초기화하고 개발자 인증 자격 증명의 토큰을 검색하는 방법을 보여 줍니다.

```
// authenticate your end user as appropriate
// ....

// if authenticated, initialize a cognito client with your AWS developer credentials
AmazonCognitoIdentity identityClient = new AmazonCognitoIdentityClient(
  new BasicAWSCredentials("access_key_id", "secret_access_key")
);

// create a new request to retrieve the token for your end user
GetOpenIdTokenForDeveloperIdentityRequest request =
  new GetOpenIdTokenForDeveloperIdentityRequest();
request.setIdentityPoolId("YOUR_COGNITO_IDENTITY_POOL_ID");

request.setIdentityId("YOUR_COGNITO_IDENTITY_ID"); //optional, set this if your client has an
                                                   //identity ID that you want to link to this 
                                                   //developer account

// set up your logins map with the username of your end user
HashMap<String,String> logins = new HashMap<>();
logins.put("YOUR_IDENTITY_PROVIDER_NAME","YOUR_END_USER_IDENTIFIER");
request.setLogins(logins);

// optionally set token duration (in seconds)
request.setTokenDuration(60 * 15l);
GetOpenIdTokenForDeveloperIdentityResult response =
  identityClient.getOpenIdTokenForDeveloperIdentity(request);

// obtain identity id and token to return to your client
String identityId = response.getIdentityId();
String token = response.getToken();

//code to return identity id and token to client
//...
```

앞의 단계에 따라 앱에 개발자 인증 자격 증명을 통합할 수 있어야 합니다. 문제나 질문이 있는 경우 자유롭게 [포럼](https://forums.aws.amazon.com/forum.jspa?forumID=173)에 게시해 주세요.

## 기존 소셜 자격 증명에 연결
<a name="connect-to-an-existing-social-identity"></a>

개발자 인증 자격 증명을 사용할 때 백엔드에서 모든 공급자 연결이 수행되어야 합니다. 사용자의 소셜 자격 증명(Login with Amazon, Apple, Facebook 또는 Google로 로그인)에 사용자 지정 자격 증명을 연결하려면 [GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html)를 호출할 때 로그인 맵에 자격 증명 공급자 토큰을 추가하세요. 이렇게 하려면 클라이언트 SDK에서 백엔드를 호출하여 최종 사용자를 인증할 때 최종 사용자의 소셜 공급자 토큰을 추가로 전달하세요.

예를 들어, 사용자 지정 자격 증명을 Facebook에 연결하려고 시도할 경우 `GetOpenIdTokenForDeveloperIdentity`를 호출할 때 로그인 맵에 자격 증명 공급자 식별자 이외에 Facebook 토큰도 추가합니다.

```
logins.put("YOUR_IDENTITY_PROVIDER_NAME","YOUR_END_USER_IDENTIFIER");
logins.put("graph.facebook.com","END_USERS_FACEBOOK_ACCESSTOKEN");
```

## 공급자 간 전환 지원
<a name="supporting-transition-between-providers"></a>

### Android
<a name="support-transition-between-providers-1.android"></a>

애플리케이션에는 개발자 인증 자격 증명과 함께 퍼블릭 공급자(Login with Amazon, Sign in with Apple, Facebook 또는 Google)를 사용한 미인증 자격 증명 또는 인증 자격 증명 지원이 필요할 수 있습니다. 개발자 인증 자격 증명과 다른 자격 증명(퍼블릭 공급자를 사용하는 미인증 자격 증명 및 인증 자격 증명) 간의 본질적인 차이점은 identityId 및 토큰을 얻는 방식입니다. 다른 자격 증명의 경우 모바일 애플리케이션은 인증 시스템과 접촉하는 대신 Amazon Cognito와 직접 상호 작용합니다. 따라서 모바일 애플리케이션은 앱 사용자가 선택한 사항에 따라 두 개의 고유 흐름을 지원할 수 있어야 합니다. 이를 위해 사용자 지정 ID 제공업체를 일부 변경해야 합니다.

`refresh` 메서드는 로그인 맵을 확인합니다. 맵이 비어 있지 않고 개발자 공급자 이름이 포함된 키가 있는 경우, 백엔드를 호출합니다. 그렇지 않으면 getIdentityId 메서드를 호출하고 null을 반환합니다.

```
public String refresh() {

   setToken(null);

   // If the logins map is not empty make a call to your backend
   // to get the token and identityId
   if (getProviderName() != null &&
      !this.loginsMap.isEmpty() &&
      this.loginsMap.containsKey(getProviderName())) {

      /**
       * This is where you would call your backend
       **/

      // now set the returned identity id and token in the provider
      update(identityId, token);
      return token;

   } else {
      // Call getIdentityId method and return null
      this.getIdentityId();
      return null;
   }
}
```

마찬가지로 `getIdentityId` 메서드에도 로그인 맵의 내용에 따라 두 개의 흐름이 있습니다.

```
public String getIdentityId() {

   // Load the identityId from the cache
   identityId = cachedIdentityId;

   if (identityId == null) {

      // If the logins map is not empty make a call to your backend
      // to get the token and identityId

      if (getProviderName() != null && !this.loginsMap.isEmpty()
         && this.loginsMap.containsKey(getProviderName())) {

         /**
           * This is where you would call your backend
          **/

         // now set the returned identity id and token in the provider
         update(identityId, token);
         return token;

      } else {
         // Otherwise call &COG; using getIdentityId of super class
         return super.getIdentityId();
      }

   } else {
      return identityId;
   }

}
```

### iOS - Objective-C
<a name="support-transition-between-providers-1.ios-objc"></a>

애플리케이션에는 개발자 인증 자격 증명과 함께 퍼블릭 공급자(Login with Amazon, Sign in with Apple, Facebook 또는 Google)를 사용한 미인증 자격 증명 또는 인증 자격 증명 지원이 필요할 수 있습니다. 이렇게 하려면 현재 자격 증명 공급자에 따라 정확한 로그인 맵을 반환할 수 있도록 [AWSCognitoCredentialsProviderHelper](https://github.com/aws-amplify/aws-sdk-ios) `logins` 메서드를 무시하세요. 이 예는 미인증, Facebook, 개발자 인증 간 피벗할 수 있는 방법을 보여 줍니다.

```
- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins {
    if(/*logic to determine if user is unauthenticated*/) {
        return [AWSTask taskWithResult:nil];
    }else if (/*logic to determine if user is Facebook*/){
        return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : [FBSDKAccessToken currentAccessToken] }];
    }else {
        return [super logins];
    }
}
```

미인증 상태에서 인증 상태로 전환하면 `[credentialsProvider clearCredentials];`를 호출하여 SDK에서 새 인증 자격 증명을 얻도록 강제해야 합니다. 두 인증 공급자 간에 전환하고 두 공급자를 연결하려고 하지 않는 경우(예를 들어 로그인 딕셔너리에서 여러 공급자에 대한 토큰을 제공하지 않는 경우) `[credentialsProvider clearKeychain];`을 호출해야 합니다. 이렇게 하면 자격 증명이 모두 지워지고 SDK가 새 자격 증명을 얻도록 강제하게 됩니다.

### iOS - Swift
<a name="support-transition-between-providers-1.ios-swift"></a>

애플리케이션에는 개발자 인증 자격 증명과 함께 퍼블릭 공급자(Login with Amazon, Sign in with Apple, Facebook 또는 Google)를 사용한 미인증 자격 증명 또는 인증 자격 증명 지원이 필요할 수 있습니다. 이렇게 하려면 현재 자격 증명 공급자에 따라 정확한 로그인 맵을 반환할 수 있도록 [AWSCognitoCredentialsProviderHelper](https://github.com/aws-amplify/aws-sdk-ios) `logins` 메서드를 무시하세요. 이 예는 미인증, Facebook, 개발자 인증 간 피벗할 수 있는 방법을 보여 줍니다.

```
override func logins () -> AWSTask<NSDictionary> {
    if(/*logic to determine if user is unauthenticated*/) {
        return AWSTask(result:nil)
    }else if (/*logic to determine if user is Facebook*/){
        if let token = AccessToken.current?.authenticationToken {
            return AWSTask(result: [AWSIdentityProviderFacebook:token])
        }
        return AWSTask(error:NSError(domain: "Facebook Login", code: -1 , userInfo: ["Facebook" : "No current Facebook access token"]))
    }else {
        return super.logins()
    }
}
```

미인증 상태에서 인증 상태로 전환하면 `credentialsProvider.clearCredentials()`를 호출하여 SDK에서 새 인증 자격 증명을 얻도록 강제해야 합니다. 두 인증 공급자 간에 전환하고 두 공급자를 연결하려고 하지 않는 경우(즉, 로그인 딕셔너리에서 여러 공급자에 대한 토큰을 제공하지 않는 경우) `credentialsProvider.clearKeychain()`을 호출해야 합니다. 이렇게 하면 자격 증명이 모두 지워지고 SDK가 새 자격 증명을 얻도록 강제하게 됩니다.

### Unity
<a name="support-transition-between-providers-1.unity"></a>

애플리케이션에는 개발자 인증 자격 증명과 함께 퍼블릭 공급자(Login with Amazon, Sign in with Apple, Facebook 또는 Google)를 사용한 미인증 자격 증명 또는 인증 자격 증명 지원이 필요할 수 있습니다. 개발자 인증 자격 증명과 다른 자격 증명(퍼블릭 공급자를 사용하는 미인증 자격 증명 및 인증 자격 증명) 간의 본질적인 차이점은 identityId 및 토큰을 얻는 방식입니다. 다른 자격 증명의 경우 모바일 애플리케이션은 인증 시스템과 접촉하는 대신 Amazon Cognito와 직접 상호 작용합니다. 모바일 애플리케이션은 앱 사용자가 선택한 사항에 따라 두 개의 고유 흐름을 지원할 수 있어야 합니다. 이를 위해 사용자 지정 자격 증명 공급자를 일부 변경해야 합니다.

Unity에서 이를 수행하기 위한 권장 방법은 AbstractCognitoIdentityProvider 대신 AmazonCognitoEnhancedIdentityProvide에서 자격 증명 공급자를 확장하고, 사용자가 고유한 백엔드로 인증되지 않은 경우 고유한 메서드 대신 상위 RefreshAsync 메서드를 호출하는 것입니다. 사용자가 인증 상태이면 이전에 설명한 것과 동일한 흐름을 사용할 수 있습니다.

### Xamarin
<a name="support-transition-between-providers-1.xamarin"></a>

애플리케이션에는 개발자 인증 자격 증명과 함께 퍼블릭 공급자(Login with Amazon, Sign in with Apple, Facebook 또는 Google)를 사용한 미인증 자격 증명 또는 인증 자격 증명 지원이 필요할 수 있습니다. 개발자 인증 자격 증명과 다른 자격 증명(퍼블릭 공급자를 사용하는 미인증 자격 증명 및 인증 자격 증명) 간의 본질적인 차이점은 identityId 및 토큰을 얻는 방식입니다. 다른 자격 증명의 경우 모바일 애플리케이션은 인증 시스템과 접촉하는 대신 Amazon Cognito와 직접 상호 작용합니다. 모바일 애플리케이션은 앱 사용자가 선택한 사항에 따라 두 개의 고유 흐름을 지원할 수 있어야 합니다. 이를 위해 사용자 지정 ID 제공업체를 일부 변경해야 합니다.

# 인증되지 않은 사용자를 인증된 사용자로 전환
<a name="switching-identities"></a>

Amazon Cognito 자격 증명 풀은 인증된 사용자와 인증되지 않은 사용자를 모두 지원합니다. 인증되지 않은 사용자는 자격 증명 공급자(IdPs로 로그인하지 않은 경우에도 AWS 리소스에 액세스할 수 있습니다. 이 액세스 권한 등급은 사용자가 로그인하기 전에 사용자에게 콘텐츠를 표시하는 데 유용합니다. 인증되지 않은 각 사용자는 개별적으로 로그인되지 않았으며 인증되지 않은 경우에도 자격 증명 풀에 고유한 자격 증명이 있습니다.

이 섹션에서는 사용자가 인증되지 않은 자격 증명으로 로그인하는 것에서 인증된 자격 증명을 사용하는 것으로 전환하도록 선택하는 경우에 대해 설명합니다.

## Android
<a name="switching-identities-1.android"></a>

사용자는 인증되지 않은 게스트로 애플리케이션에 로그인할 수 있습니다. 결국 지원되는 IdP 중 하나를 사용하여 로그인하기로 결정할 수 있습니다. Amazon Cognito는 이전 자격 증명이 새 자격 증명과 동일한 고유 식별자를 유지하고, 프로파일 데이터가 자동으로 병합되도록 합니다.

`IdentityChangedListener` 인터페이스의 프로파일 병합을 통해 애플리케이션에 알립니다. 인터페이스에 `identityChanged` 메서드를 구현하여 이러한 메시지를 수신할 수 있습니다.

```
@override
public void identityChanged(String oldIdentityId, String newIdentityId) {
    // handle the change
}
```

## iOS - Objective-C
<a name="switching-identities-1.ios-objc"></a>

사용자는 인증되지 않은 게스트로 애플리케이션에 로그인할 수 있습니다. 결국 지원되는 IdP 중 하나를 사용하여 로그인하기로 결정할 수 있습니다. Amazon Cognito는 이전 자격 증명이 새 자격 증명과 동일한 고유 식별자를 유지하고, 프로파일 데이터가 자동으로 병합되도록 합니다.

`NSNotificationCenter`는 애플리케이션에 프로파일 병합을 알립니다.

```
[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(identityIdDidChange:)
                                      name:AWSCognitoIdentityIdChangedNotification
                                      object:nil];

-(void)identityDidChange:(NSNotification*)notification {
    NSDictionary *userInfo = notification.userInfo;
    NSLog(@"identity changed from %@ to %@",
        [userInfo objectForKey:AWSCognitoNotificationPreviousId],
        [userInfo objectForKey:AWSCognitoNotificationNewId]);
}
```

## iOS - Swift
<a name="switching-identities-1.ios-swift"></a>

사용자는 인증되지 않은 게스트로 애플리케이션에 로그인할 수 있습니다. 결국 지원되는 IdP 중 하나를 사용하여 로그인하기로 결정할 수 있습니다. Amazon Cognito는 이전 자격 증명이 새 자격 증명과 동일한 고유 식별자를 유지하고, 프로파일 데이터가 자동으로 병합되도록 합니다.

`NSNotificationCenter`는 애플리케이션에 프로파일 병합을 알립니다.

```
[NSNotificationCenter.defaultCenter().addObserver(observer: self
   selector:"identityDidChange"
   name:AWSCognitoIdentityIdChangedNotification
   object:nil)

func identityDidChange(notification: NSNotification!) {
  if let userInfo = notification.userInfo as? [String: AnyObject] {
    print("identity changed from: \(userInfo[AWSCognitoNotificationPreviousId])
    to: \(userInfo[AWSCognitoNotificationNewId])")
  }
}
```

## JavaScript
<a name="switching-identities-1.javascript"></a>

### 처음에 인증되지 않은 사용자
<a name="switching-identities-1.javascript-unauth"></a>

사용자는 일반적으로 인증되지 않은 역할로 시작합니다. 이 역할의 경우 로그인 속성 없이 구성 객체의 인증 자격 증명 속성을 설정합니다. 이 경우, 기본 구성은 다음과 같을 수 있습니다.

```
// set the default config object
var creds = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'us-east-1:1699ebc0-7900-4099-b910-2df94f52a030'
});
AWS.config.credentials = creds;
```

### 인증된 사용자로 전환
<a name="switching-identities-1.javascript-auth"></a>

인증되지 않은 사용자가 IdP에 로그인한 상태에서 현재 사용자가 토큰을 갖고 있다면, 인증 자격 증명 객체를 업데이트하고 Logins 토큰을 추가하는 사용자 지정 함수를 호출하여 인증되지 않은 사용자를 인증된 사용자로 전환할 수 있습니다.

```
// Called when an identity provider has a token for a logged in user
function userLoggedIn(providerName, token) {
    creds.params.Logins = creds.params.Logins || {};
    creds.params.Logins[providerName] = token;

    // Expire credentials to refresh them on the next request
    creds.expired = true;
}
```

또한 `CognitoIdentityCredentials` 객체를 생성할 수 있습니다. 이 경우 업데이트된 인증 자격 증명 구성 정보를 반영하도록 기존 서비스 객체의 인증 자격 증명 속성을 재설정해야 합니다. [전역 구성 객체 사용](https://docs.aws.amazon.com/sdk-for-javascript/latest/developer-guide/global-config-object.html)을 참조하세요.

`CognitoIdentityCredentials` 객체에 대한 자세한 내용은 AWS SDK for JavaScript API 참조의 [AWS.CognitoIdentityCredentials](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html)를 참조하세요.

## Unity
<a name="switching-identities-1.unity"></a>

사용자는 인증되지 않은 게스트로 애플리케이션에 로그인할 수 있습니다. 결국 지원되는 IdP 중 하나를 사용하여 로그인하기로 결정할 수 있습니다. Amazon Cognito는 이전 자격 증명이 새 자격 증명과 동일한 고유 식별자를 유지하고, 프로파일 데이터가 자동으로 병합되도록 합니다.

`IdentityChangedEvent`를 구독하여 프로파일 병합에 대한 알림을 받을 수 있습니다.

```
credentialsProvider.IdentityChangedEvent += delegate(object sender, CognitoAWSCredentials.IdentityChangedArgs e)
{
    // handle the change
    Debug.log("Identity changed from " + e.OldIdentityId + " to " + e.NewIdentityId);
};
```

## Xamarin
<a name="switching-identities-1.xamarin"></a>

사용자는 인증되지 않은 게스트로 애플리케이션에 로그인할 수 있습니다. 결국 지원되는 IdP 중 하나를 사용하여 로그인하기로 결정할 수 있습니다. Amazon Cognito는 이전 자격 증명이 새 자격 증명과 동일한 고유 식별자를 유지하고, 프로파일 데이터가 자동으로 병합되도록 합니다.

```
credentialsProvider.IdentityChangedEvent += delegate(object sender, CognitoAWSCredentials.IdentityChangedArgs e){
    // handle the change
    Console.WriteLine("Identity changed from " + e.OldIdentityId + " to " + e.NewIdentityId);
};
```