

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

# Amazon Cognito 사용자 풀로 인증
<a name="authentication"></a>

Amazon Cognito에서는 다양한 방법으로 사용자를 인증할 수 있습니다. 사용자는 암호와 WebAuthn 패스키로 로그인할 수 있습니다. Amazon Cognito는 이메일 또는 SMS 메시지로 일회용 암호를 보낼 수 있습니다. 자체 문제 및 응답 시퀀스를 오케스트레이션하는 Lambda 함수를 구현할 수 있습니다. 다음은 *인증 흐름*입니다. 인증 흐름에서 사용자는 보안 암호를 제공하고 Amazon Cognito는 보안 암호를 확인한 다음 애플리케이션이 OIDC 라이브러리로 처리할 수 있도록 JSON 웹 토큰(JWT)을 발급합니다. 이 장에서는 다양한 애플리케이션 환경에서 다양한 인증 흐름에 맞게 사용자 풀 및 앱 클라이언트를 구성하는 방법에 대해 설명합니다. 관리형 로그인의 호스팅 로그인 페이지를 사용하고 AWS SDK에서 자체 로직 및 프런트 엔드를 빌드하는 옵션에 대해 알아봅니다.

도메인 유무에 관계없이 모든 사용자 풀은 사용자 풀 API에서 사용자를 인증할 수 있습니다. 사용자 풀에 도메인을 추가하면 [사용자 풀 엔드포인트](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)를 사용할 수 있습니다. 사용자 풀 API는 다양한 권한 부여 모델 및 API 요청의 요청 흐름을 지원합니다.

Amazon Cognito는 사용자의 ID를 확인하기 위해 이메일, SMS 메시지, 일회용 암호 및 패스키와 같은 암호 외에도 여러 유형의 문제를 통합하는 인증 흐름을 지원합니다.

**Topics**
+ [인증 흐름 구현](#authentication-implement)
+ [사용자 풀을 사용한 인증에 대해 알아야 할 사항](#authentication-flow-things-to-know)
+ [인증 세션의 예](#amazon-cognito-user-pools-authentication-flow)
+ [관리형 로그인을 위한 인증 방법 구성](authentication-flows-selection-managedlogin.md)
+ [AWS SDKs에서 인증 방법 관리](authentication-flows-selection-sdk.md)
+ [인증 흐름](amazon-cognito-user-pools-authentication-flow-methods.md)
+ [API 및 SDK 인증을 위한 권한 부여 모델](authentication-flows-public-server-side.md)

## 인증 흐름 구현
<a name="authentication-implement"></a>

인증용 AWS SDK를 사용하여 [관리형 로그인](authentication-flows-selection-managedlogin.md)을 구현하든 사용자 [지정 애플리케이션 프런트 엔드](authentication-flows-selection-sdk.md)를 구현하든 관계없이 구현하려는 인증 유형에 맞게 앱 클라이언트를 구성해야 합니다. 다음 정보는 [앱 클라이언트](user-pool-settings-client-apps.md) 및 애플리케이션의 인증 흐름 설정을 설명합니다.

------
#### [ App client supported flows ]

Amazon Cognito 콘솔 또는 AWS SDK의 API를 사용하여 앱 클라이언트에 지원되는 흐름을 구성할 수 있습니다. 이러한 흐름을 지원하도록 앱 클라이언트를 구성한 후 애플리케이션에 배포할 수 있습니다.

다음 절차에서는 Amazon Cognito 콘솔을 사용하여 앱 클라이언트에 사용할 수 있는 인증 흐름을 구성합니다.

**인증 흐름에 맞게 앱 클라이언트를 구성하는 방법(콘솔)**

1. 에 로그인 AWS 하고 [Amazon Cognito 사용자 풀 콘솔](https://console.aws.amazon.com/cognito/v2/idp)로 이동합니다. 사용자 풀을 선택하거나 새로운 사용자 풀을 생성합니다.

1. 사용자 풀 구성에서 **앱 클라이언트** 메뉴를 선택합니다. 앱 클라이언트를 선택하거나 새 앱 클라이언트를 생성합니다.

1. **앱 클라이언트 정보**에서 **편집**을 선택합니다.

1. **앱 클라이언트 흐름**에서 지원하려는 인증 흐름을 선택합니다.

**인증 흐름에 대한 앱 클라이언트를 구성하는 방법(API/SDK)**  
Amazon Cognito API를 사용하여 앱 클라이언트에 사용할 수 있는 인증 흐름을 구성하려면 [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html#CognitoUserPools-CreateUserPoolClient-request-ExplicitAuthFlows) 또는 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html#CognitoUserPools-UpdateUserPoolClient-request-ExplicitAuthFlows) 요청에서 `ExplicitAuthFlows` 값을 설정합니다. 다음은 클라이언트에 보안 원격 암호(SRP) 및 선택 기반 인증을 프로비저닝하는 예입니다.

```
"ExplicitAuthFlows": [ 
   "ALLOW_USER_AUTH",
   "ALLOW_USER_SRP_AUTH
]
```

앱 클라이언트 지원 흐름을 구성할 때 다음 옵션과 API 값을 지정할 수 있습니다.


**앱 클라이언트 흐름 지원**  

| 인증 흐름 | 호환성 | 콘솔 | API  | 
| --- | --- | --- | --- | 
| [선택 기반 인증](authentication-flows-selection-sdk.md#authentication-flows-selection-choice) | 서버 측, 클라이언트 측 | 로그인 시 인증 유형 선택 | ALLOW\_USER\_AUTH | 
| [영구 암호로 로그인](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password) | 클라이언트 측 | 사용자 이름과 암호로 로그인 | ALLOW\_USER\_PASSWORD\_AUTH | 
| [영구 암호 및 보안 페이로드로 로그인](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp) | 서버 측, 클라이언트 측 | 보안 원격 암호(SRP)로 로그인 | ALLOW\_USER\_SRP\_AUTH | 
| [토큰 새로 고침](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-refresh) | 서버 측, 클라이언트 측 | 기존의 인증된 세션에서 새 사용자 토큰 가져오기 | ALLOW\_REFRESH\_TOKEN\_AUTH | 
| [서버 측 인증](authentication-flows-public-server-side.md#amazon-cognito-user-pools-server-side-authentication-flow) | 서버 측 | 서버 측 관리 자격 증명으로 로그인 | ALLOW\_ADMIN\_USER\_PASSWORD\_AUTH | 
| [사용자 지정 인증](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-custom) | 서버 측과 클라이언트 측 맞춤형 애플리케이션. 관리형 로그인과 호환되지 않습니다. | Lambda 트리거의 사용자 지정 인증 흐름으로 로그인 | ALLOW\_CUSTOM\_AUTH | 

------
#### [ Implement flows in your application ]

관리형 로그인을 사용하면 구성된 인증 옵션을 로그인 페이지에서 자동으로 사용할 수 있습니다. 사용자 지정 빌드 애플리케이션에서 초기 흐름 선언으로 인증을 시작합니다.
+ 사용자의 흐름 옵션 목록에서 선택하려면 `USER_AUTH` 흐름으로 [선택 기반 인증](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)을 선언합니다. 이 흐름에는 [패스키](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey) 및 [암호 없는](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless) 인증과 같이 클라이언트 기반 인증 흐름에서 사용할 수 없는 사용 가능한 인증 방법이 있습니다.
+ 인증 흐름을 미리 선택하려면 앱 클라이언트에서 사용할 수 있는 다른 흐름으로 [클라이언트 기반 인증](authentication-flows-selection-sdk.md#authentication-flows-selection-client)을 선언합니다.

사용자를 로그인할 때 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthFlow) 또는 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-AuthFlow) 요청 본문에 `AuthFlow` 파라미터가 포함되어야 합니다.

선택 기반 인증:

```
"AuthFlow": "USER_AUTH"
```

SRP를 사용한 클라이언트 기반 인증:

```
"AuthFlow": "USER_SRP_AUTH"
```

------

## 사용자 풀을 사용한 인증에 대해 알아야 할 사항
<a name="authentication-flow-things-to-know"></a>

Amazon Cognito 사용자 풀을 사용한 인증 모델 설계에서 다음 정보를 고려하세요.

**관리형 로그인 및 호스팅 UI의 인증 흐름**  
[관리형 로그인](cognito-user-pools-managed-login.md)에는 클래식 호스팅 UI보다 더 많은 인증 옵션이 있습니다. 예를 들어 사용자는 관리형 로그인에서만 암호 없는 패스키 인증을 수행할 수 있습니다.

** AWS SDK 인증에서만 사용 가능한 사용자 지정 인증 흐름**  
관리형 로그인 또는 클래식 호스팅 UI로는 *사용자 지정 인증 흐름* 또는 [Lambda 트리거를 사용한 사용자 지정 인증](user-pool-lambda-challenge.md)을 수행할 수 없습니다. [AWS SDK를 사용한 인증](authentication-flows-selection-sdk.md)에서 사용자 지정 인증을 사용할 수 있습니다.

**외부 ID 제공업체(IdP) 로그인을 위한 관리형 로그인**  
[AWS SDKs를 사용한 인증](authentication-flows-selection-sdk.md)에서는 [타사 IdPs](cognito-user-pools-identity-federation.md) 통해 사용자를 로그인할 수 없습니다. 관리형 로그인 또는 클래식 호스팅 UI를 구현하고 IdP로 리디렉션한 다음 애플리케이션에서 OIDC 라이브러리를 사용하여 결과 인증 객체를 처리해야 합니다. 관리형 로그인에 대한 자세한 정보는 [사용자 풀 관리형 로그인](cognito-user-pools-managed-login.md) 섹션을 참조하세요.

**다른 사용자 기능에 대한 암호 없는 인증 효과**  
사용자 풀 및 앱 클라이언트에서 [일회용 암호](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless) 또는 [패스키](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey)를 사용하여 암호 없는 로그인을 활성화하면 사용자 생성 및 마이그레이션에 영향을 미칩니다. 암호 없는 로그인이 활성화된 경우:  

1. 관리자는 암호 없이 사용자를 생성할 수 있습니다. 기본 초대 메시지 템플릿이 `{###}` 암호 자리 표시자를 더 이상 포함하지 않도록 변경됩니다. 자세한 내용은 [관리자로 사용자 계정 생성](how-to-create-user-accounts.md) 단원을 참조하십시오.

1. SDK 기반 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) 작업의 경우 사용자가 가입할 때 암호를 제공할 필요가 없습니다. 관리형 로그인 및 호스팅 UI는 암호 없는 인증이 허용되는 경우에도 가입 페이지에 암호가 필요합니다. 자세한 내용은 [사용자 계정 가입 및 확인](signing-up-users-in-your-app.md) 단원을 참조하십시오.

1. CSV 파일에서 가져온 사용자는 속성에 사용 가능한 암호 없는 로그인 옵션에 대한 이메일 주소 또는 전화번호가 포함된 경우 암호 재설정 없이 암호 없는 옵션으로 즉시 로그인할 수 있습니다. 자세한 내용은 [CSV 파일에서 사용자 풀로 사용자 가져오기](cognito-user-pools-using-import-tool.md) 단원을 참조하십시오.

1. 암호 없는 인증은 [사용자 마이그레이션 Lambda 트리거](user-pool-lambda-migrate-user.md)를 호출하지 않습니다.

1. 일회용 암호(OTP) 첫 번째 팩터로 로그인하는 사용자는 세션에 [멀티 팩터 인증(MFA)](user-pool-settings-mfa.md) 팩터를 추가할 수 없습니다. 사용자 확인이 포함된 패스키는 로 구성된 경우 MFA 요구 사항을 충족할 수 있습니다`MULTI_FACTOR_WITH_USER_VERIFICATION`.

**패스키 신뢰 당사자 URL은 공개 접미사 목록에 있을 수 없습니다.**  
`www.example.com`과 같이 소유한 도메인 이름을 패스키 구성에서 신뢰 당사자(RP) ID로 사용할 수 있습니다. 이 구성은 소유한 도메인에서 실행되는 사용자 지정 빌드 애플리케이션을 지원하기 위한 것입니다. [퍼블릭 접미사 목록](https://publicsuffix.org/) 또는 PSL에는 보호된 상위 수준 도메인이 포함되어 있습니다. Amazon Cognito는 RP URL을 PSL의 도메인으로 설정하려고 할 때 오류를 반환합니다.

**Topics**
+ [인증 세션 흐름 기간](#authentication-flow-session-duration)
+ [로그인 시도 실패에 대한 잠금 동작](#authentication-flow-lockout-behavior)

### 인증 세션 흐름 기간
<a name="authentication-flow-session-duration"></a>

사용자 풀의 기능에 따라 앱이 Amazon Cognito에서 토큰을 검색하기 전에 `InitiateAuth` 및 `RespondToAuthChallenge`에 대한 몇 가지 문제에 응답할 수 있습니다. Amazon Cognito는 각 요청에 대한 응답에 세션 문자열을 포함합니다. API 요청을 인증 흐름에 결합하려면 이전 요청에 대한 응답의 세션 문자열을 각 후속 요청에 포함합니다. 기본적으로 사용자는 세션 문자열이 만료되기 전에 3분 동안 각 챌린지를 완료해야 합니다. 이 기간을 조정하려면 앱 클라이언트 **Authentication flow session duration**(인증 흐름 세션 기간)을 변경합니다. 다음 절차에서는 앱 클라이언트 구성에서 이 설정을 변경하는 방법을 설명합니다.

**참고**  
**인증 흐름 세션 기간** 설정은 Amazon Cognito 사용자 풀 API를 사용한 인증에 적용됩니다. 관리형 로그인은 세션 기간을 멀티 팩터 인증의 경우 3분, 암호 재설정 코드의 경우 8분으로 설정합니다.

------
#### [ Amazon Cognito console ]

**앱 클라이언트 인증 흐름 세션 기간을 구성하는 방법(AWS Management Console)**

1. 사용자 풀의 **App integration**(앱 통합) 탭에서 **App clients and analytics**(앱 클라이언트 및 분석) 컨테이너의 앱 클라이언트 이름을 선택합니다.

1. **앱 클라이언트 정보** 컨테이너에서 **편집**을 선택합니다.

1. **인증 흐름 세션 기간** 값을 SMS 및 이메일 MFA 코드에 대해 원하는 유효 기간(분)으로 변경합니다. 이렇게 하면 사용자가 앱 클라이언트에서 인증 챌린지를 완료해야 하는 시간도 변경됩니다.

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

------
#### [ User pools API ]

**앱 클라이언트 인증 흐름 세션 기간을 구성하는 방법(Amazon Cognito API)**

1. `DescribeUserPoolClient` 요청의 기존 사용자 풀 설정으로 `UpdateUserPoolClient` 요청을 준비합니다. `UpdateUserPoolClient` 요청에는 모든 기존 앱 클라이언트 속성이 포함되어야 합니다.

1. `AuthSessionValidity` 값을 SMS MFA 코드에 대해 원하는 유효 기간(분)으로 변경합니다. 이렇게 하면 사용자가 앱 클라이언트에서 인증 챌린지를 완료해야 하는 시간도 변경됩니다.

------

앱 클라이언트에 대한 자세한 내용은 [앱 클라이언트를 사용한 애플리케이션별 설정](user-pool-settings-client-apps.md) 섹션을 참조하세요.

### 로그인 시도 실패에 대한 잠금 동작
<a name="authentication-flow-lockout-behavior"></a>

인증되지 않은 API 작업 또는 IAM 인증 API 작업으로 요청되었는지 여부에 관계없이 사용자 암호로 로그인 시도가 5회 실패하면 Amazon Cognito는 1초 동안 사용자를 잠급니다. 이후 한 번 더 실패할 때마다 잠금 시간이 두 배로 늘어나 최대 15분 정도까지 늘어납니다.

잠금 기간 중에 시도하면 `Password attempts exceeded` 예외가 발생하며, 이후 잠금 기간에 영향을 주지는 않습니다. 누적 로그인 시도 실패 *n*(`Password attempts exceeded`예외 제외)회에 대해, Amazon Cognito는 *2^ (n-5)*초 동안 사용자를 차단합니다. 잠금을 *n=0* 초기 상태로 재설정하려면 사용자는 잠금 기간이 만료된 후 성공적으로 로그인하거나 잠금이 설정된 후 연속으로 15분 동안 로그인 시도를 하지 않아야 합니다. 이러한 동작은 변경될 수 있습니다. 암호 기반 인증도 수행하지 않으면 이 동작은 사용자 지정 챌린지에는 적용되지 않습니다.

## 인증 세션의 예
<a name="amazon-cognito-user-pools-authentication-flow"></a>

다음 다이어그램과 단계별 가이드는 사용자가 애플리케이션에 로그인하는 일반적인 시나리오를 보여줍니다. 예시 애플리케이션은 사용자에게 몇 가지 로그인 옵션을 제공합니다. 자격 증명을 입력하여 하나를 선택하고, 추가 인증 요소를 제공하고, 로그인합니다.

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


사용자가 사용자 이름과 암호로 로그인하거나, 이메일 메시지에서 일회용 코드를 요청하거나, 지문 옵션을 선택할 수 있는 로그인 페이지가 있는 애플리케이션을 가정해 보겠습니다.

1. **로그인 프롬프트**: 애플리케이션에 *로그인* 버튼이 있는 홈 화면이 표시됩니다.

1. **로그인 요청**: 사용자가 *로그인*을 선택합니다. 쿠키 또는 캐시에서 애플리케이션은 사용자 이름을 검색하거나 입력하라는 메시지를 표시합니다.

1. **요청 옵션**: 애플리케이션에서 `USER_AUTH` 흐름이 포함된 `InitiateAuth` API 요청으로 사용자의 로그인 옵션을 요청하여 사용자에게 사용 가능한 로그인 방법을 요청합니다.

1. **로그인 옵션 전송**: Amazon Cognito는 `PASSWORD`, `EMAIL_OTP` 및 `WEB_AUTHN`으로 응답합니다. 응답에는 다음 응답에서 재생할 수 있는 세션 식별자가 포함되어 있습니다.

1. **표시 옵션**: 애플리케이션에 사용자가 사용자 이름과 암호를 입력하거나, 일회용 코드를 가져오거나, 지문을 스캔할 수 있는 UI 요소가 표시됩니다.

1. **옵션/자격 증명 입력 선택**: 사용자가 사용자 이름과 암호를 입력합니다.

1. **인증 시작**: 애플리케이션에서 사용자 이름-암호 로그인을 확인하고 사용자 이름과 암호를 제공하는 `RespondToAuthChallenge` API 요청과 함께 사용자의 로그인 정보를 제공합니다.

1. **자격 증명 검증**: Amazon Cognito가 사용자의 자격 증명을 확인합니다.

1. **추가 문제**: 사용자에게 인증 앱으로 구성된 다중 인증이 있습니다. Amazon Cognito는 `SOFTWARE_TOKEN_MFA` 문제를 반환합니다.

1. **문제 프롬프트**: 애플리케이션에 사용자의 인증 앱에서 시간 기반 일회용 암호(TOTP)를 요청하는 양식이 표시됩니다.

1. **문제 답변**: 사용자가 TOTP를 제출합니다.

1. **문제에 응답**: 다른 `RespondToAuthChallenge` 요청에서 애플리케이션은 사용자의 TOTP를 제공합니다.

1. **문제 응답 검증**: Amazon Cognito는 사용자의 코드를 확인하고 현재 사용자에게 추가 문제를 발행하지 않도록 사용자 풀이 구성되어 있는지 확인합니다.

1. **문제 토큰**: Amazon Cognito는 ID, 액세스 및 새로 고침 JSON 웹 토큰(JWT)을 반환합니다. 사용자의 초기 인증이 완료되었습니다.

1. **토큰 저장**: 애플리케이션은 사용자 데이터를 참조하고, 리소스에 대한 액세스를 승인하고, 토큰이 만료되면 토큰을 업데이트할 수 있도록 사용자의 토큰을 캐싱합니다.

1. **승인된 콘텐츠 렌더링**: 애플리케이션은 ID 및 역할을 기반으로 리소스에 대한 사용자의 액세스를 결정하고 애플리케이션 콘텐츠를 제공합니다.

1. **액세스 콘텐츠**: 사용자가 로그인하고 애플리케이션 사용을 시작합니다.

1. **토큰이 만료된 콘텐츠 요청**: 나중에 사용자가 권한이 필요한 리소스를 요청합니다. 사용자의 캐시된 토큰이 만료되었습니다.

1. **새로 고침 토큰**: 애플리케이션에서 사용자의 저장된 새로 고침 토큰을 사용하여 `InitiateAuth` 요청을 만듭니다.

1. **문제 토큰**: Amazon Cognito는 새로운 ID와 액세스 JWT를 반환합니다. 자격 증명에 대한 추가 프롬프트 없이 사용자의 세션이 안전하게 새로 고쳐집니다.

[AWS Lambda 트리거](cognito-user-pools-working-with-lambda-triggers.md)를 사용하여 사용자가 인증하는 방식을 사용자 지정할 수 있습니다. 이러한 트리거는 인증 흐름의 일부로서 고유 챌린지를 발행 및 확인할 수 있습니다.

보안 백엔드 서버에 대해 관리자 인증 흐름을 사용할 수 있으며, [사용자 마이그레이션 인증 흐름](cognito-user-pools-using-import-tool.md)을 사용하면 사용자에게 암호 재설정을 요구하지 않고도 사용자 마이그레이션을 수행할 수 있습니다.