

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

# 웹 및 모바일 앱과 Amazon Cognito 인증 및 권한 부여 통합
<a name="cognito-integrate-apps"></a>

Amazon Cognito 구현은 AWS Management Console 또는 AWS SDK 관리 도구와 애플리케이션의 SDK 라이브러리를 혼합한 것입니다. Amazon Cognito 콘솔은 Amazon Cognito 사용자 풀과 자격 증명 풀을 설정하고 관리하기 위한 시각적 인터페이스입니다.

Amazon Cognito 사용자 풀을 사용하여 생성할 수 있는 가장 낮은 노력의 통합은 [관리형 로그인](cognito-terms.md#terms-managedlogin)을 사용하는 것입니다. 관리형 로그인은 Amazon Cognito 사용자 풀의 빠른 테스트 및 배포를 위해 바로 사용할 수 있는 웹 기반 로그인 애플리케이션입니다. 관리형 로그인을 사용한 사용자 풀 인증에는 사용자를 호스팅된 로그인 페이지로 안내하는 OpenID Connect(OIDC) 라이브러리가 필요합니다. 이 사용자 상호 작용 및 리디렉션 웹 엔드포인트 시리즈에서 Amazon Cognito는 타사 로그인, 다중 인증(MFA) 및 인증 흐름 선택을 포함한 인증 흐름을 처리합니다. 애플리케이션은 Amazon Cognito가 응답에서 반환하는 인증 결과만 처리하면 됩니다.

또한 애플리케이션에 AWS SDK를 추가하고, 사용자 지정 빌드 인증 인터페이스를 추가하고, 사용자의 인증 및 권한 부여를 위한 API 작업을 호출할 수 있습니다. [AWS Amplify](https://docs.amplify.aws/)는 백엔드에서 Amazon Cognito 인증을 사용하여 풀 스택 애플리케이션을 빌드하기 AWS 서비스 위한 입니다.

예를 들어 앱은 사용자 로그인을 위해 관리형 로그인을 간접적으로 호출한 다음 앱 코드에서 토큰 엔드포인트를 직접적으로 호출하여 사용자의 인증 코드를 토큰으로 교환할 수 있습니다. 그런 다음 앱은 사용자 토큰을 해석 및 저장하고 인증 및 권한 부여를 위해 적절한 컨텍스트에서 토큰을 제시해야 합니다. Amplify는 이러한 프로세스를 위한 내장 함수가 포함된 안내 통합 도구를 추가합니다.

또한 Amazon Cognito 리소스를 완전히 코드로 구축할 수도 있습니다. 자격 증명 풀에는 사용자 풀과 동일한 관리형 인증 옵션이 없습니다. 애플리케이션의 AWS 자격 증명에 액세스하려면 가져온 SDK 모듈에서 자격 증명 풀 작업을 구현합니다. 맞춤형 애플리케이션 코드를 시작하려면 [AWS  SDK](https://aws.amazon.com/developer/tools/)용 Amazon Cognito [코드 예제](https://docs.aws.amazon.com/cognito/latest/developerguide/service_code_examples.html)를 참조하세요. OpenID Connect 자격 증명 공급자로서 Amazon Cognito와 통합하려면 [OpenID Connect 개발자 도구](https://openid.net/certified-open-id-developer-tools/)를 사용합니다.

Amazon Cognito 인증 및 권한 부여를 사용하기 전에 앱 플랫폼을 선택하고 서비스와 통합할 코드를 준비합니다. AWS SDKs[AWS SDKs 사용한 인증](#amazon-cognito-authentication-with-sdks). AWS CLI 는 Amazon Cognito 및 기타용 명령줄 SDK AWS 서비스이며 Amazon Cognito API 작업 및 해당 구문을 익히기 위한 유용한 곳입니다.

**참고**  
Amazon Cognito의 일부 구성 요소는 API만을 사용하여 구성할 수 있습니다. 예를 들어 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 또는 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) API 요청에서 [UserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserPoolType.html) 클래스의 `LambdaConfig` 속성을 업데이트하는 요청으로만 사용자 풀 [사용자 지정 SMS 또는 이메일 발신자](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-sender-triggers.html) Lambda 트리거를 설정할 수 있습니다.

Amazon Cognito 사용자 풀 API는 여러 API 작업 클래스와 네임스페이스를 공유합니다. 한 클래스는 사용자 풀과 해당 프로세스, 자격 증명 공급자 및 사용자를 구성합니다. 또 다른 클래스에는 퍼블릭 클라이언트의 사용자가 로그인, 로그아웃 및 프로필 관리를 수행할 수 있는 인증되지 않은 작업이 포함됩니다. API 작업의 최종 클래스는 기밀 서버 측 클라이언트에서 자체 AWS 자격 증명으로 권한을 부여하는 사용자 작업을 수행합니다. 앱 코드 구현을 시작하기 전에 의도한 앱 아키텍처를 알아야 합니다. 자세한 내용은 [API, OIDC 및 관리형 로그인 페이지 인증 이해](authentication-flows-public-server-side.md#user-pools-API-operations) 단원을 참조하십시오.

**Topics**
+ [

## 를 사용한 인증 AWS Amplify
](#cognito-integrate-apps-amplify)
+ [

## AWS SDKs 사용한 인증
](#amazon-cognito-authentication-with-sdks)
+ [

# Amazon Cognito에서 인증이 작동하는 방식
](cognito-how-to-authenticate.md)
+ [

# AWS SDK에서이 서비스 사용
](sdk-general-information-section.md)
+ [

# Amazon Verified Permissions를 통한 권한 부여
](amazon-cognito-authorization-with-avp.md)

## 를 사용한 인증 AWS Amplify
<a name="cognito-integrate-apps-amplify"></a>

AWS Amplify 는 웹 및 모바일 애플리케이션을 빌드하기 위한 완벽한 솔루션입니다. Amplify를 통해 Amplify 라이브러리를 사용하여 기존 리소스에 연결하거나 Amplify 명령줄 인터페이스(CLI)를 사용하여 새 리소스를 생성 및 구성할 수 있습니다. Amplify에는 앱에서 로그인 및 가입 경험을 설정하고 사용자 지정할 수 있는 [Authenticator](https://ui.docs.amplify.aws/react/connected-components/authenticator)와 같은 연결된 UI 구성 요소도 있습니다.

프런트 엔드 앱에서 Amplify 인증 기능을 사용하려면 플랫폼별 다음 설명서를 참조하세요.
+ [React에 대한 Amplify 인증](https://docs.amplify.aws/react/start/)
+ [React Native에 대한 Amplify 인증](https://docs.amplify.aws/react-native/start/)
+ [Swift(iOS)에 대한 Amplify 인증](https://docs.amplify.aws/swift/start/)
+ [Android에 대한 Amplify 인증](https://docs.amplify.aws/android/start/)
+ [Flutter에 대한 Amplify 인증](https://docs.amplify.aws/flutter/start/)

Amplify 라이브러리는 오픈 소스이며 [GitHub](https://github.com/aws-amplify)에서 사용할 수 있습니다. Amplify Auth가 Amazon Cognito 인증을 구현하는 방법에 대해 자세히 알아보려면 다음 라이브러리를 방문하세요.
+ [amplify-js](https://github.com/aws-amplify/amplify-js/tree/main/packages/auth)
+ [amplify-swift](https://github.com/aws-amplify/amplify-swift/tree/main/Amplify/Categories/Auth)
+ [amplify-flutter](https://github.com/aws-amplify/amplify-flutter/tree/main/packages/auth)
+ [amplify-android](https://github.com/aws-amplify/amplify-android/tree/main/aws-auth-cognito)

### Amplify로 사용자 인터페이스(UI) 생성
<a name="cognito-integrate-apps-amplify-ui"></a>

[사용자 풀 관리형 로그인](cognito-user-pools-managed-login.md)는 웹 또는 모바일 앱에 대한 인증 프런트 엔드의 필수 요구 사항을 충족할 수 있습니다. 관리형 로그인이 수용하는 파라미터를 넘어 사용자 인터페이스(UI)를 사용자 지정하려면 애플리케이션을 사용자 지정하여 빌드하세요. [Amplify UI](https://ui.docs.amplify.aws/)는 다양한 언어로 된 사용자 지정 가능한 프런트 엔드 구성 요소 모음입니다.

![\[Amplify Authenticator 애플리케이션의 예시 스크린샷.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/amplify-authenticator-ui.png)


사용자 지정 인증 구성 요소를 시작하려면 해당 Authenticator 구성 요소에 대한 다음 설명서를 참조하세요.
+ [Android용 Authenticator](https://ui.docs.amplify.aws/android/connected-components/authenticator)
+ [Angular용 Authenticator](https://ui.docs.amplify.aws/angular/connected-components/authenticator)
+ [Flutter용 Authenticator](https://ui.docs.amplify.aws/flutter/connected-components/authenticator)
+ [React용 Authenticator](https://ui.docs.amplify.aws/react/connected-components/authenticator)
+ [React Native용 Authenticator](https://ui.docs.amplify.aws/react-native/connected-components/authenticator)
+ [Swift용 Authenticator](https://ui.docs.amplify.aws/swift/connected-components/authenticator)
+ [Vue용 Authenticator](https://ui.docs.amplify.aws/vue/connected-components/authenticator)

## AWS SDKs 사용한 인증
<a name="amazon-cognito-authentication-with-sdks"></a>

보안 백엔드를 사용하여 Amazon Cognito와 상호 작용하는 자체 자격 증명 마이크로서비스를 구축하려면 원하는 언어로 된 AWS SDK를 사용하여 Amazon Cognito 사용자 풀 및 Amazon Cognito 자격 증명 풀 API에 연결합니다.

각 API 작업에 대한 자세한 내용은 [Amazon Cognito 사용자 풀 API 참조](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_Operations.html) 및 [Amazon Cognito API 참조](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/Welcome.html)를 참조하세요. 이 문서에는 지원되는 플랫폼에서 다양한 SDK를 사용하기 위한 리소스가 포함된 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#API_InitiateAuth_SeeAlso](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#API_InitiateAuth_SeeAlso) 섹션도 포함되어 있습니다.
+ [AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/index.html#cli-aws-cognito-idp)
+ [AWS SDK for .NET](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CognitoIdentityProvider/TCognitoIdentityProviderClient.html)
+ [AWS SDK for C\$1\$1](https://sdk.amazonaws.com/cpp/api/LATEST/aws-cpp-sdk-cognito-idp/html/class_aws_1_1_cognito_identity_provider_1_1_cognito_identity_provider_client.html)
+ [AWS SDK for Go](https://docs.aws.amazon.com/sdk-for-go/api/service/cognitoidentityprovider/#CognitoIdentityProvider)
+ [AWS Java V2용 SDK](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/cognitoidentityprovider/CognitoIdentityProviderClient.html)
+ [AWS SDK for JavaScript](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html)
+ [AWS PHP V3용 SDK](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.CognitoIdentityProvider.CognitoIdentityProviderClient.html)
+ [AWS Python용 SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cognito-idp.html)
+ [AWS SDK for Ruby V3](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/CognitoIdentityProvider/Client.html)

# Amazon Cognito에서 인증이 작동하는 방식
<a name="cognito-how-to-authenticate"></a>

고객이 Amazon Cognito 사용자 풀에 로그인하면 애플리케이션은 JSON 웹 토큰(JWT)을 수신합니다.

고객이 사용자 풀 토큰 또는 다른 공급자를 사용하여 자격 증명 풀에 로그인하면 애플리케이션이 임시 AWS 자격 증명을 받습니다.

사용자 풀 로그인을 사용하면 AWS SDK로 인증 및 권한 부여를 완전히 구현할 수 있습니다. 자체 사용자 인터페이스(UI) 구성 요소를 빌드하지 않으려면 미리 빌드된 웹 UI(관리형 로그인) 또는 타사 ID 제공업체(idP)의 로그인 페이지를 호출할 수 있습니다.

이 주제는 애플리케이션이 Amazon Cognito와 상호 작용하여 ID 토큰으로 인증하고, 액세스 토큰으로 권한을 부여하고, 자격 증명 풀 자격 증명을 사용하여 액세스할 수 AWS 서비스 있는 몇 가지 방법에 대한 개요입니다.

**Topics**
+ [

## 관리형 로그인을 사용한 사용자 풀 인증
](#cognito-authentication-concepts-managed-login)
+ [

## AWS SDK를 사용한 사용자 풀 API 인증 및 권한 부여
](#cognito-authentication-concepts-apiauth)
+ [

## 타사 ID 제공업체를 통한 사용자 풀 인증
](#cognito-authentication-concepts-thirdparty)
+ [

## ID 풀 인증
](#cognito-authentication-concepts-identitypools)

## 관리형 로그인을 사용한 사용자 풀 인증
<a name="cognito-authentication-concepts-managed-login"></a>

[관리형 로그인](cognito-user-pools-managed-login.md)은 사용자 풀 및 앱 클라이언트에 연결된 웹 사이트입니다. 사용자의 로그인, 가입 및 비밀번호 재설정 작업을 수행할 수 있습니다. 인증을 위해 관리형 로그인 구성 요소가 있는 애플리케이션은 구현하는 데 개발자의 노력이 덜 필요할 수 있습니다. 애플리케이션은 인증을 위해 UI 구성 요소를 건너뛰고 사용자 브라우저에서 관리형 로그인을 호출할 수 있습니다.

애플리케이션은 웹 또는 앱 리디렉션 위치를 사용하여 사용자의 JWT를 수집합니다. 관리형 로그인을 구현하는 애플리케이션은 OIDC(OpenID Connect) IdP인 것처럼 인증을 위해 사용자 풀에 연결할 수 있습니다.

관리형 로그인은 애플리케이션에 OIDC 인증 서버의 인증 서비스가 필요하지만 사용자 지정 인증, ID 풀 통합 또는 사용자 속성 셀프 서비스와 같은 기능이 즉시 필요하지 않은 모델에 적합합니다. 이러한 고급 옵션 중 일부를 사용하려는 경우 SDK의 사용자 풀 구성 요소를 사용하여 구현할 수 있습니다.

OIDC 구현에 주로 의존하는 관리형 로그인 및 타사 IdP 인증 모델은 OAuth 2.0 범위가 있는 고급 권한 부여 모델에 가장 적합합니다.

다음 다이어그램은 관리형 로그인 인증을 위한 일반적인 로그인 세션을 보여줍니다.

![\[사용자에게 입력을 요청하고 관리형 로그인을 사용하여 로그인하는 애플리케이션을 보여 주는 순서도입니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/authentication-managed-login.png)


**관리형 로그인 인증 흐름**

1. 사용자가 애플리케이션에 액세스합니다.

1. “로그인” 링크를 선택합니다.

1. 애플리케이션은 사용자를 사용자 풀 도메인의 관리형 로그인 페이지에 있는 로그인 프롬프트로 안내합니다.

1. 사용자 이름과 비밀번호를 입력합니다.

1. 사용자 풀은 사용자의 자격 증명을 검증하고 사용자가 다중 인증(MFA)을 활성화했는지 확인합니다.

1. 관리형 로그인 페이지는 사용자에게 MFA 코드를 입력하라는 메시지를 표시합니다.

1. 사용자가 MFA 코드를 입력합니다.

1. 사용자 풀은 사용자를 애플리케이션 URL로 리디렉션합니다.

1. 애플리케이션은 관리형 로그인이 [콜백 URL](cognito-terms.md#term-callbackurl)에 추가한 URL 요청 파라미터에서 권한 부여 코드를 수집합니다.

1. 애플리케이션은 권한 부여 코드가 있는 토큰을 요청합니다.

1. 토큰 엔드포인트는 애플리케이션에 JWT를 반환합니다.

1. 애플리케이션은 사용자의 JWT를 디코딩, 유효성 검사 및 저장하거나 캐싱합니다.

1. 애플리케이션에 요청된 액세스 제어 구성 요소가 표시됩니다.

1. 사용자가 콘텐츠를 봅니다.

1. 나중에 사용자의 액세스 토큰이 만료되어 액세스 제어된 구성 요소를 보도록 요청합니다.

1. 애플리케이션에서 사용자의 세션이 지속되어야 한다고 판단합니다. 새로 고침 토큰을 사용하여 토큰 엔드포인트에서 새 토큰을 요청합니다.

**변형 및 사용자 지정**  
전체 사용자 풀의 [브랜딩 편집기](managed-login-brandingeditor.md)를 사용하거나 [앱 클라이언트](cognito-terms.md#term-appclient) 수준에서 관리형 로그인 페이지의 디자인과 느낌을 사용자 지정할 수 있습니다. 자체 ID 제공업체, 범위, 사용자 속성에 대한 액세스 및 고급 보안 구성으로 [앱 클라이언트를 구성](user-pool-settings-client-apps.md)할 수도 있습니다.

**관련 리소스**
+ [사용자 풀 관리형 로그인](cognito-user-pools-managed-login.md)
+ [범위, M2M 및 리소스 서버](cognito-user-pools-define-resource-servers.md)
+ [사용자 풀 엔드포인트 및 관리형 로그인 참조](cognito-userpools-server-contract-reference.md)

## AWS SDK를 사용한 사용자 풀 API 인증 및 권한 부여
<a name="cognito-authentication-concepts-apiauth"></a>

AWS 는 다양한 개발자 프레임워크에서 Amazon Cognito 사용자 풀 또는 *Amazon Cognito 자격 증명 공급자*를 위한 구성 요소를 개발했습니다. [AWS SDKs 사용한 인증](cognito-integrate-apps.md#amazon-cognito-authentication-with-sdks) 이러한 SDK를 [Amazon Cognito 사용자 풀 API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html)라고 합니다. 동일한 사용자 풀 API 네임스페이스에는 사용자 풀 구성 및 사용자 인증 작업이 있습니다. 보다 자세한 개요는 [API, OIDC 및 관리형 로그인 페이지 인증 이해](authentication-flows-public-server-side.md#user-pools-API-operations) 섹션을 참조하세요.

API 인증은 애플리케이션에 기존 UI 구성 요소가 있고 주로 사용자 풀을 사용자 디렉터리로 사용하는 모델에 적합합니다. 이 설계는 Amazon Cognito를 더 큰 애플리케이션 내의 구성 요소로 추가합니다. 복잡한 챌린지 및 응답 체인을 처리하려면 프로그래밍 로직이 필요합니다.

이 애플리케이션은 전체 OIDC(OpenID Connect) 신뢰 당사자 구현을 구현할 필요가 없습니다. 대신 JWT를 디코딩하고 사용할 수 있습니다. [로컬 사용자](cognito-terms.md#terms-localuser)를 위한 전체 사용자 풀 기능 세트에 액세스하려면 개발 환경에서 Amazon Cognito SDK로 인증을 빌드하세요.

사용자 지정 OAuth 범위를 사용한 API 인증은 외부 API 권한 부여에 대한 방향성이 떨어집니다. API 인증에서 액세스 토큰에 사용자 지정 범위를 추가하려면 런타임 시 [사전 토큰 생성 Lambda 트리거](user-pool-lambda-pre-token-generation.md)을 사용하여 토큰을 수정합니다.

다음 다이어그램은 API 인증을 위한 일반적인 로그인 세션을 보여줍니다.

![\[사용자에게 입력을 요청하고 AWS SDK로 로그인하는 애플리케이션을 보여주는 흐름도입니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/authentication-api.png)


**API 인증 흐름**

1. 사용자가 애플리케이션에 액세스합니다.

1. “로그인” 링크를 선택합니다.

1. 사용자 이름과 비밀번호를 입력합니다.

1. 애플리케이션은 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API 요청을 수행하는 메서드를 간접적으로 호출합니다. 요청은 사용자의 자격 증명을 사용자 풀에 전달합니다.

1. 사용자 풀은 사용자의 자격 증명을 검증하고 사용자가 다중 인증(MFA)을 활성화했는지 확인합니다.

1. 사용자 풀은 MFA 코드를 요청하는 챌린지로 응답합니다.

1. 애플리케이션에서 사용자로부터 MFA 코드를 수집하는 프롬프트를 생성합니다.

1. 애플리케이션은 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) API 요청을 수행하는 메서드를 호출합니다. 요청이 사용자의 MFA 코드를 전달합니다.

1. 사용자 풀은 사용자의 MFA 코드를 검증합니다.

1. 사용자 풀은 사용자의 JWT로 응답합니다.

1. 애플리케이션은 사용자의 JWT를 디코딩, 유효성 검사 및 저장하거나 캐싱합니다.

1. 애플리케이션에 요청된 액세스 제어 구성 요소가 표시됩니다.

1. 사용자가 콘텐츠를 봅니다.

1. 나중에 사용자의 액세스 토큰이 만료되어 액세스 제어된 구성 요소를 보도록 요청합니다.

1. 애플리케이션에서 사용자의 세션이 지속되어야 한다고 판단합니다. 새로 고침 토큰을 사용하여 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 메서드를 다시 호출하고 새 토큰을 검색합니다.

**변형 및 사용자 지정**  
사용자 지정 인증 챌린지와 같은 추가 챌린지를 통해 이 흐름을 강화할 수 있습니다. 암호가 손상되었거나 예기치 않은 로그인 특성이 악의적인 로그인 시도를 나타낼 수 있는 사용자의 액세스를 자동으로 제한할 수 있습니다. 이 흐름은 가입, 사용자 속성 업데이트, 비밀번호 재설정 작업에서도 거의 동일하게 나타납니다. 이러한 흐름의 대부분은 퍼블릭(클라이언트 측) 및 기밀(서버 측) API 작업이 중복됩니다.

**관련 리소스**
+ [Amazon Cognito 사용자 풀 API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html)
+ [사용자 풀 시작하기](getting-started-user-pools.md)
+ [웹 및 모바일 앱과 Amazon Cognito 인증 및 권한 부여 통합](cognito-integrate-apps.md)
+ [API, OIDC 및 관리형 로그인 페이지 인증 이해](authentication-flows-public-server-side.md#user-pools-API-operations)

## 타사 ID 제공업체를 통한 사용자 풀 인증
<a name="cognito-authentication-concepts-thirdparty"></a>

외부 ID 제공업체(idP) 또는 *페더레이션 인증*을 사용한 로그인은 [관리형 로그인](#cognito-authentication-concepts-managed-login)과 유사한 모델입니다. 애플리케이션은 사용자 풀의 OIDC 신뢰 당사자인 반면 사용자 풀은 IdP에 대한 패스스루 역할을 합니다. IdP는 Facebook 또는 Google과 같은 소비자 사용자 디렉터리이거나 Azure와 같은 SAML 2.0 또는 OIDC 엔터프라이즈 디렉터리일 수 있습니다.

사용자의 브라우저에서 관리형 로그인 대신 애플리케이션은 사용자 풀 [권한 부여 서버](cognito-terms.md#term-authzserver)에서 리디렉션 엔드포인트를 호출합니다. 사용자의 보기에서 애플리케이션에서 로그인 버튼을 선택합니다. 그런 다음 IdP에 로그인하라는 메시지가 표시됩니다. 관리형 로그인 인증과 마찬가지로 애플리케이션은 앱의 리디렉션 위치에서 JWT를 수집합니다.

타사 IdP를 사용한 인증은 사용자가 애플리케이션에 가입할 때 새 비밀번호를 생성하지 않으려는 모델에 적합합니다. 관리형 로그인 인증을 구현한 애플리케이션에는 적은 노력으로 타사 인증을 추가할 수 있습니다. 실제로 관리형 로그인과 타사 IdP는 사용자 브라우저에서 호출하는 항목에 약간의 차이가 있어도 일관된 인증 결과를 생성합니다.

관리형 로그인 인증과 마찬가지로 페더레이션 인증은 OAuth 2.0 범위가 있는 고급 권한 부여 모델에 가장 적합합니다.

다음 다이어그램은 페더레이션 인증을 위한 일반적인 로그인 세션을 보여줍니다.

![\[사용자에게 입력을 요청하고 타사 IdP로 로그인하는 애플리케이션을 보여주는 흐름도입니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/authentication-federated.png)


**페더레이션 인증 흐름**

1. 사용자가 애플리케이션에 액세스합니다.

1. “로그인” 링크를 선택합니다.

1. 애플리케이션은 IdP를 사용하여 사용자를 로그인 프롬프트로 안내합니다.

1. 사용자 이름과 비밀번호를 입력합니다.

1. IdP는 사용자의 자격 증명을 검증하고 사용자가 다중 인증(MFA)을 활성화했는지 확인합니다.

1. IdP는 사용자에게 MFA 코드를 입력하라는 메시지를 표시합니다.

1. 사용자가 MFA 코드를 입력합니다.

1. IdP는 SAML 응답 또는 권한 부여 코드를 사용하여 사용자를 사용자 풀로 리디렉션합니다.

1. 사용자가 권한 부여 코드를 통과하면 사용자 풀은 코드를 IdP 토큰으로 자동 교환합니다. 사용자 풀은 IdP 토큰을 검증하고 새 권한 부여 코드를 사용하여 사용자를 애플리케이션으로 리디렉션합니다.

1. 애플리케이션은 사용자 풀이 [콜백 URL](cognito-terms.md#term-callbackurl)에 추가한 URL 요청 파라미터에서 권한 부여 코드를 수집합니다.

1. 애플리케이션은 권한 부여 코드가 있는 토큰을 요청합니다.

1. 토큰 엔드포인트는 애플리케이션에 JWT를 반환합니다.

1. 애플리케이션은 사용자의 JWT를 디코딩, 유효성 검사 및 저장하거나 캐싱합니다.

1. 애플리케이션에 요청된 액세스 제어 구성 요소가 표시됩니다.

1. 사용자가 콘텐츠를 봅니다.

1. 나중에 사용자의 액세스 토큰이 만료되어 액세스 제어된 구성 요소를 보도록 요청합니다.

1. 애플리케이션에서 사용자의 세션이 지속되어야 한다고 판단합니다. 새로 고침 토큰을 사용하여 토큰 엔드포인트에서 새 토큰을 요청합니다.

**변형 및 사용자 지정**  
[관리형 로그인](#cognito-authentication-concepts-managed-login)에서 페더레이션 인증을 시작할 수 있으며 사용자는 [앱 클라이언트](cognito-terms.md#term-appclient)에 할당된 IdP 목록에서 선택할 수 있습니다. 관리형 로그인은 이메일 주소를 입력하라는 메시지를 표시하고 해당 SAML IdP로 [사용자의 요청을 자동으로 라우팅](cognito-user-pools-managing-saml-idp-naming.md)할 수도 있습니다. 타사 ID 제공업체를 사용한 인증에는 관리형 로그인과의 사용자 상호 작용이 *필요하지* 않습니다. 애플리케이션은 사용자의 [권한 부여 서버 요청](cognito-terms.md#term-authorizationserver)에 요청 파라미터를 추가하고 사용자가 자동으로 IdP 로그인 페이지로 리디렉션하도록 할 수 있습니다.

**관련 리소스**
+ [타사 ID 제공업체를 통한 사용자 풀 로그인](cognito-user-pools-identity-federation.md)
+ [범위, M2M 및 리소스 서버](cognito-user-pools-define-resource-servers.md)
+ [사용자 풀 엔드포인트 및 관리형 로그인 참조](cognito-userpools-server-contract-reference.md)

## ID 풀 인증
<a name="cognito-authentication-concepts-identitypools"></a>

ID 풀은 함수, API 네임스페이스 및 SDK 모델의 사용자 풀과 구별되는 애플리케이션의 구성 요소입니다. 사용자 풀이 토큰 기반 인증 및 권한 부여를 제공하는 경우 자격 증명 풀은 AWS Identity and Access Management (IAM)에 대한 권한 부여를 제공합니다.

ID 풀에 IdP 세트를 할당하고 이를 사용하여 사용자를 로그인할 수 있습니다. 사용자 풀은 ID 풀 IdP로 긴밀하게 통합되며 ID 풀에 액세스 제어를 위한 가장 많은 옵션을 제공합니다. 동시에 ID 풀에 대한 다양한 인증 옵션이 있습니다. 사용자 풀은 SAML, OIDC, 소셜, 개발자 및 게스트 자격 증명 소스를 자격 증명 풀에서 임시 AWS 자격 증명으로 가는 경로로 조인합니다.

ID 풀을 사용한 인증은 외부 인증입니다. 이전에 설명한 사용자 풀 흐름 중 하나 또는 다른 IdP를 사용하여 독립적으로 개발하는 흐름을 따릅니다. 애플리케이션이 초기 인증을 수행한 후 ID 풀에 증거를 전달하고 그 대가로 임시 세션을 수신합니다.

자격 증명 풀을 사용한 인증은 IAM 권한 부여를 AWS 서비스 통해의 애플리케이션 자산 및 데이터에 대한 액세스 제어를 적용하는 모델에 적합합니다. [사용자 풀의 API 인증](#cognito-authentication-concepts-apiauth)과 마찬가지로 성공적인 애플리케이션에는 사용자의 이익을 위해 액세스하려는 각 서비스에 대한 AWS SDKs가 포함됩니다. AWS SDKs 자격 증명 풀 인증의 자격 증명을 API 요청에 서명으로 적용합니다.

다음 다이어그램은 IdP를 사용한 ID 풀 인증을 위한 일반적인 로그인 세션을 보여줍니다.

![\[사용자에게 입력을 요청하고 타사 IdP로 로그인하는 애플리케이션을 보여주는 흐름도입니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/authentication-identity-pool.png)


**ID 풀 인증 흐름**

1. 사용자가 애플리케이션에 액세스합니다.

1. “로그인” 링크를 선택합니다.

1. 애플리케이션은 IdP를 사용하여 사용자를 로그인 프롬프트로 안내합니다.

1. 사용자 이름과 비밀번호를 입력합니다.

1. IdP는 사용자의 자격 증명을 검증합니다.

1. IdP는 SAML 응답 또는 권한 부여 코드를 사용하여 사용자를 애플리케이션으로 리디렉션합니다.

1. 사용자가 권한 부여 코드를 전달하면 애플리케이션은 코드를 IdP 토큰으로 교환합니다.

1. 애플리케이션은 사용자의 JWT 또는 어설션을 디코딩, 유효성 검사 및 저장하거나 캐싱합니다.

1. 애플리케이션은 [GetId](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html) API 요청을 수행하는 메서드를 호출합니다. 사용자의 토큰 또는 어설션을 전달하고 자격 증명 ID를 요청합니다.

1. ID 풀은 구성된 ID 제공업체에 대해 토큰 또는 어설션을 검증합니다.

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

1. 애플리케이션은 [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html) API 요청을 수행하는 메서드를 호출합니다. 사용자의 토큰 또는 어설션을 전달하고 IAM 역할을 요청합니다.

1. ID 풀은 새 JWT를 생성합니다. 새 JWT에는 IAM 역할을 요청하는 클레임이 포함되어 있습니다. ID 풀은 사용자의 요청과 IdP 에 대한 ID 풀 구성의 역할 선택 기준을 기반으로 역할을 결정합니다.

1. AWS Security Token Service (AWS STS)는 자격 증명 풀의 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 요청에 응답합니다. 응답에는 IAM 역할이 있는 임시 세션의 API 자격 증명이 포함되어 있습니다.

1. 애플리케이션은 세션 자격 증명을 저장합니다.

1. 사용자가 앱에서 AWS의 액세스 보호 리소스가 필요한 작업을 수행합니다.

1. 애플리케이션은 임시 자격 증명을 필수에 대한 API 요청에 [서명](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html)으로 적용합니다 AWS 서비스.

1. IAM은 자격 증명의 역할에 연결된 정책을 평가합니다. 이를 요청과 비교합니다.

1. 는 요청된 데이터를 AWS 서비스 반환합니다.

1. 애플리케이션은 사용자 인터페이스에서 데이터를 렌더링합니다.

1. 사용자가 데이터를 봅니다.

**변형 및 사용자 지정**  
사용자 풀을 사용한 인증을 시각화하려면 **문제 토큰/어설션** 단계 뒤에 이전 사용자 풀 개요 중 하나를 삽입합니다. 개발자 인증은 **ID 요청** 이전의 모든 단계를 [개발자 자격 증명](cognito-terms.md#term-developercredentials)으로 서명된 요청으로 바꿉니다. 또한 게스트 인증은 **ID 요청**으로 바로 건너뛰고, 인증을 검증하지 않으며, [액세스가 제한된](iam-roles.md#access-policies-scope-down-services) IAM 역할에 대한 자격 증명을 반환합니다.

**관련 리소스**
+ [Amazon Cognito 자격 증명 풀](cognito-identity.md)
+ [사용자 IAM 역할](identity-pools.md#user-iam-roles)
+ [자격 증명 풀 인증 흐름](authentication-flow.md)

# AWS SDK에서이 서비스 사용
<a name="sdk-general-information-section"></a>

AWS 소프트웨어 개발 키트(SDKs)는 널리 사용되는 많은 프로그래밍 언어에 사용할 수 있습니다. 각 SDK는 개발자가 선호하는 언어로 애플리케이션을 쉽게 구축할 수 있도록 하는 API, 코드 예제 및 설명서를 제공합니다.


| SDK 설명서 | 코드 예제 | 
| --- | --- | 
| [AWS SDK for C\$1\$1](https://docs.aws.amazon.com/sdk-for-cpp) | [AWS SDK for C\$1\$1 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp) | 
| [AWS CLI](https://docs.aws.amazon.com/cli) | [AWS CLI 코드 예제](https://docs.aws.amazon.com/code-library/latest/ug/cli_2_code_examples.html) | 
| [AWS SDK for Go](https://docs.aws.amazon.com/sdk-for-go) | [AWS SDK for Go 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/gov2) | 
| [AWS SDK for Java](https://docs.aws.amazon.com/sdk-for-java) | [AWS SDK for Java 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2) | 
| [AWS SDK for JavaScript](https://docs.aws.amazon.com/sdk-for-javascript) | [AWS SDK for JavaScript 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3) | 
| [AWS SDK for Kotlin](https://docs.aws.amazon.com/sdk-for-kotlin) | [AWS SDK for Kotlin 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin) | 
| [AWS SDK for .NET](https://docs.aws.amazon.com/sdk-for-net) | [AWS SDK for .NET 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3) | 
| [AWS SDK for PHP](https://docs.aws.amazon.com/sdk-for-php) | [AWS SDK for PHP 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php) | 
| [AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell) | [AWS Tools for PowerShell 코드 예제](https://docs.aws.amazon.com/code-library/latest/ug/powershell_5_code_examples.html) | 
| [AWS SDK for Python (Boto3)](https://docs.aws.amazon.com/pythonsdk) | [AWS SDK for Python (Boto3) 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python) | 
| [AWS SDK for Ruby](https://docs.aws.amazon.com/sdk-for-ruby) | [AWS SDK for Ruby 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/ruby) | 
| [AWS SDK for Rust](https://docs.aws.amazon.com/sdk-for-rust) | [AWS SDK for Rust 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1) | 
| [AWS SDK for SAP ABAP](https://docs.aws.amazon.com/sdk-for-sapabap) | [AWS SDK for SAP ABAP 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap) | 
| [AWS SDK for Swift](https://docs.aws.amazon.com/sdk-for-swift) | [AWS SDK for Swift 코드 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/swift) | 

**예제 사용 가능 여부**  
필요한 예제를 찾을 수 없습니까? 이 페이지 하단의 **피드백 제공** 링크를 사용하여 코드 예제를 요청합니다.

# Amazon Verified Permissions를 통한 권한 부여
<a name="amazon-cognito-authorization-with-avp"></a>

[Amazon Verified Permissions](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/what-is-avp.html)는 사용자가 구축하는 애플리케이션에 대한 권한 부여 서비스입니다. Amazon Cognito 사용자 풀을 자격 증명 소스로 추가하면 앱에서 허용 또는 거부 결정을 위해 사용자 풀 액세스 또는 자격 증명(ID) 토큰을 Verified Permissions에 전달할 수 있습니다. Verified Permissions는 [Cedar 정책 언어](https://docs.cedarpolicy.com/)로 작성한 정책을 기반으로 사용자의 속성과 요청 컨텍스트를 고려합니다. 요청 컨텍스트에는 요청한 문서, 이미지 또는 기타 리소스의 식별자와 사용자가 리소스에 대해 수행하려는 작업이 포함될 수 있습니다.

앱에서 사용자의 신원 또는 액세스 토큰을 [IsAuthorizedWithToken](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorizedWithToken.html) 또는 [BatchIsAuthorizedWithToken](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_BatchIsAuthorizedWithToken.html) API 요청의 확인된 권한에 제공할 수 있습니다. 이러한 API 작업은 사용자를 `Principal`로 수락하고 사용자가 액세스하려는 `Resource`의 `Action`에 대한 권한 부여 결정을 내립니다. 추가 사용자 지정 `Context`는 세부적인 액세스 결정에 기여할 수 있습니다.

앱이 `IsAuthorizedWithToken` API 요청에 토큰을 제시하면 Verified Permissions는 다음과 같은 검증을 수행합니다.

1. 사용자 풀이 요청된 정책 스토어에 대해 구성된 Verified Permissions [자격 증명 소스](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/identity-providers.html)입니다.

1. 액세스 또는 자격 증명 토큰의 `client_id` 또는 `aud` 클레임이 각각 Verified Permissions에 제공한 사용자 풀 앱 클라이언트 ID와 일치합니다. 이 클레임을 확인하려면 Verified Permissions 자격 증명 소스에서 [클라이언트 ID 검증 구성](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/cognito-validation.html) 작업을 수행해야 합니다.

1. 토큰이 만료되지 않았습니다.

1. 토큰의 `token_use` 클레임 값이 `IsAuthorizedWithToken`에 전달한 파라미터와 일치합니다. `token_use` 클레임은 `accessToken` 파라미터에 전달한 경우 `access`여야 하며, `identityToken` 파라미터에 전달한 경우 `id`여야 합니다.

1. 토큰의 서명이 사용자 풀의 게시된 JSON 웹 키(JWK)에서 가져온 것입니다. `https://cognito-idp.Region.amazonaws.com/your user pool ID/.well-known/jwks.json`에서 JWK를 볼 수 있습니다.

**취소된 토큰 및 삭제된 사용자**  
Verified Permissions는 자격 증명 소스와 사용자 토큰의 만료 시간을 통해 알고 있는 정보만 검증합니다. Verified Permissions는 토큰 취소 또는 사용자 존재 여부를 확인하지 않습니다. 사용자 토큰을 취소했거나 사용자 풀에서 사용자 프로필을 삭제한 경우에도 Verified Permissions는 토큰이 만료될 때까지 토큰을 유효한 것으로 간주합니다.

**정책 평가**  
사용자 풀을 [정책 스토어](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/terminology.html#term-policy-store)의 [자격 증명 소스](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/identity-providers.html)로 구성합니다. 요청에서 사용자의 토큰을 Verified Permissions에 제출하도록 앱을 구성합니다. 각 요청에 대해 Verified Permissions는 토큰의 클레임을 정책과 비교합니다. Verified Permissions 정책은  AWS의 IAM 정책과 마찬가지로 *보안 주체*, *리소스* 및 *작업*을 선언합니다. Verified Permissions는 요청에 대해 허용된 작업과 일치하고 명시적 `Deny` 작업과 일치하지 않으면 `Allow`로 응답하고, 그렇지 않으면 `Deny`로 응답합니다. 자세한 내용은 *Amazon Verified Permissions 사용 설명서*의 [Amazon Verified Permissions 정책](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policies.html)을 참조하세요.

**토큰 사용자 지정**  
Verified Permissions에 제시하려는 사용자 클레임을 변경, 추가 및 제거하려면 [사전 토큰 생성 Lambda 트리거](user-pool-lambda-pre-token-generation.md)를 사용하여 액세스 및 ID 토큰의 콘텐츠를 사용자 지정합니다. 사전 토큰 생성 트리거를 사용하여 토큰에 클레임을 추가하고 수정할 수 있습니다. 예를 들어 데이터베이스에서 추가 사용자 속성을 쿼리하고 ID 토큰으로 인코딩할 수 있습니다.

**참고**  
Verified Permissions가 클레임을 처리하는 방식 때문에 `cognito`, `dev` 또는 `custom`이라는 이름의 클레임을 사전 토큰 생성 함수에 추가하지 마세요. 이러한 예약된 클레임 접두사를 `cognito:username`과 같이 콜론으로 구분된 형식이 아닌 전체 클레임 이름으로 제시하면 권한 부여 요청이 실패합니다.

**추가 리소스**
+ [Amazon Cognito 토큰 Verified Permissions 스키마 매핑](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/identity-sources_map-token-to-schema.html)
+ [Amazon Verified Permissions 및 Amazon Cognito를 사용하여 API Gateway API 권한 부여](https://aws.amazon.com/blogs/security/authorize-api-gateway-apis-using-amazon-verified-permissions-and-amazon-cognito/)
+ [워크숍: Amazon Cognito 및 Verified Permissions를 사용한 인증 및 권한 부여](https://catalog.workshops.aws/app-auth)

## Verified Permissions를 사용한 API 권한 부여
<a name="amazon-cognito-authorization-with-avp-api-authorization"></a>

ID 또는 액세스 토큰은 Verified Permissions를 사용하여 Amazon API Gateway REST APIs 백엔드에 대한 요청을 승인할 수 있습니다. 사용자 풀 및 API에 대한 즉각적인 링크가 포함된 [정책 저장소](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores.html)를 생성할 수 있습니다. [API Gateway 및 ID 소스를 사용하여 설정](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores_create.html) 시작 옵션을 사용하면 Verified Permissions가 정책 저장소에 사용자 풀 ID 소스를 추가하고 API에 Lambda 권한 부여자를 추가합니다. 애플리케이션이 사용자 풀 보유자 토큰을 API에 전달하면 Lambda 권한 부여자가 Verified Permissions를 호출합니다. 권한 부여자는 토큰을 보안 주체로, 요청 경로 및 메서드를 작업으로 전달합니다.

다음 다이어그램은 확인된 권한이 있는 API Gateway API의 권한 부여 흐름을 보여줍니다. 자세한 내용은 Amazon Verified Permissions 사용 설명서의 [API 링크 정책 저장소](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores_api-userpool.html)를 참조하세요.

![\[Amazon Verified Permissions를 사용한 API 권한 부여 흐름을 보여주는 다이어그램입니다. 애플리케이션이 Amazon API Gateway API를 요청합니다. API는 Lambda 권한 부여자를 호출합니다. 권한 부여자는 Verified Permissions에 API 요청을 합니다. Verified Permissions는 토큰 유효성을 확인하고 권한 부여 결정을 반환합니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/amazon-cognito-avp-use-case.png)


Verified Permissions는 [사용자 풀 그룹](cognito-user-pools-user-groups.md)에 대한 API 권한 부여를 구성합니다. ID 및 액세스 토큰 모두에 `cognito:groups` 클레임이 포함되어 있으므로 정책 저장소는 다양한 애플리케이션 컨텍스트에서 API에 대한 역할 기반 액세스 제어(RBAC)를 관리할 수 있습니다.

### 정책 저장소 설정 선택
<a name="amazon-cognito-authorization-with-avp-api-authorization-token-type"></a>

정책 저장소에서 ID 소스를 구성할 때 액세스 또는 ID 토큰을 처리할지 여부를 선택해야 합니다. 이 결정은 정책 엔진이 작동하는 방식에 중요합니다. ID 토큰에는 사용자 속성이 포함됩니다. 액세스 토큰에는 사용자 액세스 제어 정보인 [OAuth 범위](cognito-user-pools-define-resource-servers.md)가 포함되어 있습니다. 두 토큰 유형 모두 그룹 멤버쉽 정보가 있지만 일반적으로 Verified Permissions 정책 저장소가 있는 RBAC용 액세스 토큰을 사용하는 것이 좋습니다. 액세스 토큰은 권한 부여 결정에 기여할 수 있는 범위를 가진 그룹 멤버십에 추가됩니다. 액세스 토큰의 클레임은 권한 부여 요청의 [컨텍스트](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/context.html)가 됩니다.

사용자 풀을 ID 소스로 구성할 때 사용자 및 그룹 엔터티 유형도 구성해야 합니다. 엔터티 유형은 Verified Permissions 정책에서 참조할 수 있는 보안 주체, 작업 및 리소스 식별자입니다. 정책 저장소의 엔터티는 *멤버십* 관계를 가질 수 있으며, 여기서 한 엔터티는 *상위* 엔터티의 멤버일 수 있습니다. 멤버십을 사용하면 보안 주체 그룹, 작업 그룹 및 리소스 그룹을 참조할 수 있습니다. 사용자 풀 그룹의 경우 지정한 사용자 엔터티 유형은 그룹 엔터티 유형의 멤버여야 합니다. [API 링크 정책 저장소](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores_api-userpool.html)를 설정하거나 Verified Permissions 콘솔의 **안내형 설정**을 수행하면 정책 저장소는 자동으로 이 상위-멤버 관계를 갖습니다.

ID 토큰은 RBAC를 속성 기반 액세스 제어(ABAC)와 결합할 수 있습니다. [API 링크 정책 저장소](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores_api-userpool.html)를 생성한 후 [사용자 속성](#amazon-cognito-authorization-with-avp-example-policy) *및* 그룹 멤버십으로 정책을 개선할 수 있습니다. ID 토큰의 속성 클레임은 권한 부여 요청의 [보안 주체 속성](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policies_examples-abac.html)이 됩니다. 정책은 보안 주체 속성을 기반으로 권한 부여 결정을 내릴 수 있습니다.

제공하는 허용 가능한 앱 클라이언트 목록과 일치하는 `aud` 또는 `client_id` 클레임이 있는 토큰을 수락하도록 정책 저장소를 구성할 수도 있습니다.

### 역할 기반 API 권한 부여에 대한 정책 예시
<a name="amazon-cognito-authorization-with-avp-api-authorization-example"></a>

다음 예시 정책은 [PetStore](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-from-example.html) 예시 REST API에 대한 Verified Permissions 정책 저장소를 설정하여 생성되었습니다.

```
permit(
  principal in PetStore::UserGroup::"us-east-1_EXAMPLE|MyGroup",
  action in [ PetStore::Action::"get /pets", PetStore::Action::"get /pets/{petId}" ],
  resource
  );
```

Verified Permissions는 다음과 같은 경우 애플리케이션의 권한 요청에 대해 `Allow` 결정을 반환합니다.

1. 애플리케이션이 `Authorization` 헤더의 ID 또는 액세스 토큰을 보유자 토큰으로 전달한 경우.

1. 애플리케이션에서 문자열 `MyGroup`가 포함된 `cognito:groups` 클레임이 있는 토큰을 전달한 경우.

1. 애플리케이션이 `https://myapi.example.com/pets` 또는 `https://myapi.example.com/pets/scrappy` 등에 `HTTP GET` 요청을 한 경우.

## Amazon Cognito 사용자에 대한 정책 예시
<a name="amazon-cognito-authorization-with-avp-example-policy"></a>

사용자 풀은 API 요청 이외의 조건에서 Verified Permissions에 대한 권한 부여 요청을 생성할 수도 있습니다. 애플리케이션의 모든 액세스 제어 결정을 정책 저장소에 제출할 수 있습니다. 예를 들어 요청을 통해 네트워크를 전송하기 전에 속성 기반 액세스 제어를 사용하여 Amazon DynamoDB 또는 Amazon S3 보안을 보완하여 할당량 사용을 줄일 수 있습니다.

다음 예에서는 [Cedar 정책 언어](https://docs.cedarpolicy.com/)를 사용하여 하나의 사용자 풀 앱 클라이언트로 인증하는 Finance 사용자가 `example_image.png`를 읽고 쓸 수 있도록 허용합니다. 앱의 사용자인 John은 앱 클라이언트로부터 ID 토큰을 받아 GET 요청에서 권한 부여가 필요한 URL `https://example.com/images/example_image.png`에 전달합니다. John의 ID 토큰에는 사용자 풀 앱 클라이언트 ID `1234567890example`에 대한 `aud` 클레임이 있습니다. 또한 사전 토큰 생성 Lambda 함수가 John에 대한 값 `Finance1234`를 가진 새 클레임 `costCenter`를 삽입했습니다.

```
permit (
   principal,
   actions in [ExampleCorp::Action::"readFile", "writeFile"],
   resource == ExampleCorp::Photo::"example_image.png"
)
when {
   principal.aud == "1234567890example" &&
   principal.custom.costCenter like "Finance*"
};
```

다음 요청 본문은 `Allow` 응답을 생성합니다.

```
{
   "accesstoken": "[John's ID token]",
   "action": {
      "actionId": "readFile",
      "actionType": "Action"
   },
   "resource": {
      "entityId": "example_image.png",
      "entityType": "Photo"
   }
}
```

Verified Permissions 정책에 보안 주체를 지정하려면 다음과 같은 형식을 사용합니다.

```
permit (
   principal == [Namespace]::[Entity]::"[user pool ID]|[user sub]",
   action,
   resource
);
```

다음은 ID가 `us-east-1_Example`이고 sub 또는 사용자 ID가 `973db890-092c-49e4-a9d0-912a4c0a20c7`인 사용자 풀의 사용자에 대한 보안 주체의 예입니다.

```
principal == ExampleCorp::User::"us-east-1_Example|973db890-092c-49e4-a9d0-912a4c0a20c7",
```

Verified Permissions 정책에서 사용자 그룹을 지정하려면 다음 형식을 사용하세요.

```
permit (
   principal in [Namespace]::[Group Entity]::"[Group name]",
   action,
   resource
);
```

**속성 기반 액세스 제어**  
앱에 대한 Verified Permissions 권한 부여와 AWS 자격 증명을 위한 Amazon Cognito 자격 증명 풀의 [액세스 제어 기능에 대한 속성](https://docs.aws.amazon.com/cognito/latest/developerguide/attributes-for-access-control.html)은 모두 속성 기반 액세스 제어(ABAC)의 형태입니다. 다음은 Verified Permissions와 Amazon Cognito ABAC의 기능을 비교한 것입니다. ABAC에서 시스템은 엔터티의 속성을 검사하고 사용자가 정의한 조건에 따라 권한 부여 결정을 내립니다.


| 서비스 | 프로세스 | 결과 | 
| --- |--- |--- |
| Amazon Verified Permissions | Returns an 허용 or 거부 decision from analysis of a user pool JWT. | Access to application resources succeeds or fails based on Cedar policy evaluation. | 
| Amazon Cognito identity pools (attributes for access control) | Assigns [세션 태그](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) to your user based on their attributes. IAM policy conditions can check tags 허용 or 거부 user access to AWS 서비스. | A tagged session with temporary AWS credentials for an IAM role. | 