

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

# Amazon Cognito 사용자 풀의 보안 기능 사용
<a name="managing-security"></a>

네트워크 침입, 암호 추측, 사용자 사칭, 악의적인 가입 및 로그인으로부터 애플리케이션을 보호해야 할 수도 있습니다. Amazon Cognito 사용자 풀 보안 기능의 구성은 보안 아키텍처의 주요 구성 요소가 될 수 있습니다. 애플리케이션의 보안은 AWS [공동](https://aws.amazon.com/compliance/shared-responsibility-model/) *책임 모델에 설명된 대로 고객 책임 "클라우드의 보안"*입니다. 이 장의 도구는 애플리케이션 보안 설계가 이러한 목표에 부합하는 데 도움이 됩니다.

사용자 풀을 구성할 때 결정해야 하는 중요한 사항은 공개 가입 및 로그인을 허용할지 여부입니다. 기밀 클라이언트, 사용자 생성 및 확인 관리, 도메인이 없는 사용자 풀과 같은 일부 사용자 풀 옵션은 인터넷을 통한 공격에 더 적은 정도로 영향을 받습니다. 그러나 일반적인 사용 사례는 인터넷에 있는 모든 사람의 가입을 수락하고 모든 작업을 사용자 풀로 직접 보내는 퍼블릭 클라이언트입니다. 모든 구성에서, 특히 이러한 퍼블릭 구성의 경우 보안 기능을 염두에 두고 사용자 풀을 계획하고 배포하는 것이 좋습니다. 보안이 충분하지 않으면 원치 않는 소스가 새 활성 사용자를 생성하거나 기존 사용자를 악용하려고 할 때 AWS 청구서에 영향을 미칠 수도 있습니다.

MFA 및 위협 보호는 [로컬 사용자](cognito-terms.md#terms-localuser)에게 적용됩니다. 타사 IdP는 [페더레이션 사용자](cognito-terms.md#terms-federateduser)의 보안 태세를 담당합니다.사용자 풀 보안 기능

**다중 인증(MFA)**  
사용자 풀 로그인을 확인하기 위해 사용자 풀에서 이메일(Essentials 또는 Plus 기능 플랜 포함)이나 SMS 메시지 또는 인증 앱을 통해 보내는 코드를 요청합니다.

**위협 방지**  
로그인에서 위험 지표를 모니터링하고 MFA 또는 블록 로그인을 적용합니다. 사용자 지정 클레임 및 범위를 액세스 토큰에 추가합니다. 이메일로 MFA 코드를 전송합니다.

**AWS WAF 웹 ACLs**  
네트워크 및 애플리케이션 레이어에서 원치 않는 활동이 있는지 [사용자 풀 엔드포인트 및 인증 API](authentication-flows-public-server-side.md#user-pools-API-operations)로 들어오는 트래픽을 검사합니다.

**대소문자 구분**  
문자 대소문자를 제외하고 이메일 주소 또는 기본 사용자 이름이 다른 사용자와 동일한 사용자를 생성하지 않도록 합니다.

**삭제 방지**  
자동화된 시스템이 실수로 사용자 풀을 삭제하는 것을 방지하세요. AWS Management Console에서 사용자 풀 삭제를 추가로 확인해야 합니다.

**사용자 존재 오류**  
사용자 풀에서 기존 사용자 이름과 별칭이 공개되지 않도록 보호합니다. 사용자 이름이 유효한지 여부에 관계없이 인증 실패에 대한 응답으로 일반 오류를 반환합니다.

**Topics**
+ [사용자 풀에 MFA 추가](user-pool-settings-mfa.md)
+ [위협 방지 기능이 있는 고급 보안](cognito-user-pool-settings-threat-protection.md)
+ [AWS WAF 웹 ACL을 사용자 풀과 연결](user-pool-waf.md)
+ [사용자 풀 대/소문자 구분](user-pool-case-sensitivity.md)
+ [사용자 풀 삭제 방지](user-pool-settings-deletion-protection.md)
+ [사용자 존재 오류 응답 관리](cognito-user-pool-managing-errors.md)

# 사용자 풀에 MFA 추가
<a name="user-pool-settings-mfa"></a>

MFA는 일반적으로 사용자 이름과 암호인 초기 *사용자가 알고 있는 것* 인증 요소에 *사용자가 가지고 있는 것* 인증 요소를 추가합니다. 암호를 기본 인증 요소로 사용하는 사용자를 로그인시키기 위해 SMS 문자 메시지, 이메일 메시지 또는 시간 기반 일회용 암호(TOTP)를 추가 요소로 선택할 수 있습니다.

다중 인증(MFA)은 애플리케이션의 [로컬 사용자](cognito-terms.md#terms-localuser)의 보안을 강화합니다. [페더레이션 사용자](cognito-terms.md#terms-federateduser)의 경우 Amazon Cognito는 모든 인증 프로세스를 IdP에 위임하며 추가 인증 요소를 제공하지 않습니다.

**참고**  
새 사용자가 앱에 처음 로그인할 때 Amazon Cognito는 사용자 풀에 MFA가 필요한 경우에도 OAuth 2.0 토큰을 발급합니다. 사용자가 처음 로그인할 때 두 번째 인증 요소는 Amazon Cognito가 사용자에게 보내는 확인 메시지를 확인하는 것입니다. 사용자 풀에 MFA가 필요한 경우 Amazon Cognito는 첫 로그인 후 각 로그인 시도 중에 사용할 추가 로그인 요소를 등록하라는 메시지를 표시합니다.

적응형 인증을 통해 위험 수준이 높아졌을 때 추가 인증 요소를 요구하도록 사용자 풀을 구성할 수 있습니다. 사용자 풀에 조정 인증을 추가하는 방법은 [위협 방지 기능이 있는 고급 보안](cognito-user-pool-settings-threat-protection.md) 섹션을 참조하세요.

MFA를 사용자 풀에 대해 `required`로 설정하면 모든 사용자가 로그인하려면 MFA를 완료해야 합니다. 로그인하려면 각 사용자가 하나 이상의 MFA 요소를 설정해야 합니다. MFA가 필요한 경우 사용자 풀에서 사용자의 로그인을 허용하도록 사용자 온보딩에 MFA 설정을 포함해야 합니다.

MFA를 필수로 설정하면 관리형 로그인에 MFA를 설정하라는 메시지가 표시됩니다. 사용자 풀에서 MFA를 선택 사항으로 설정하면 관리형 로그인에서 사용자에게 메시지를 표시하지 않습니다. 선택적 MFA를 사용하려면 사용자에게 MFA를 설정할 것인지 선택하라는 메시지를 표시한 다음 API 입력을 통해 추가 로그인 요소를 검증하도록 안내하는 인터페이스를 앱에 구축해야 합니다.

**Topics**
+ [사용자 풀 MFA에 대해 알아야 할 사항](#user-pool-settings-mfa-prerequisites)
+ [사용자 MFA 기본 설정](#user-pool-settings-mfa-preferences)
+ [사용자 런타임 시 MFA 로직에 대한 세부 정보](#user-pool-settings-mfa-user-outcomes)
+ [다중 인증을 위한 사용자 풀 구성](#user-pool-configuring-mfa)
+ [SMS 및 이메일 메시지 MFA](user-pool-settings-mfa-sms-email-message.md)
+ [TOTP 소프트웨어 토큰 MFA](user-pool-settings-mfa-totp.md)

## 사용자 풀 MFA에 대해 알아야 할 사항
<a name="user-pool-settings-mfa-prerequisites"></a>

MFA를 설정하기 전에 다음을 고려하세요.
+ 사용자는 MFA를 사용하거나 암호 없는 요소로 ** 로그인할 수 있습니다. 단, 사용자 풀 `MULTI_FACTOR_WITH_USER_VERIFICATION`에서를 `FactorConfiguration`로 설정하면 사용자 확인이 포함된 패스키가 MFA 요구 사항을 충족할 수 있습니다`WebAuthnConfiguration`.
  + [일회용 암호를](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless) 지원하는 사용자 풀에서는 MFA를 필수로 설정할 수 없습니다.
  + 사용자 풀에 MFA가 필요한 `AllowedFirstAuthFactors` 경우 `EMAIL_OTP` 또는 `SMS_OTP`를에 추가할 수 없습니다. `FactorConfiguration`가 로 설정된 `WEB_AUTHN` 경우를 추가할 수 있습니다`MULTI_FACTOR_WITH_USER_VERIFICATION`.
  + [선택 기반 로그인](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)은 사용자 풀에 MFA가 필요한 경우 모든 앱 클라이언트에서만 `PASSWORD` 및 `PASSWORD_SRP` 요인을 제공합니다. 사용자 이름-암호 흐름에 대한 자세한 내용은 이 가이드의 **인증** 장에서 [영구 암호로 로그인](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password) 및 [영구 암호 및 보안 페이로드로 로그인](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp) 섹션을 참조하세요.
  + MFA가 선택 사항인 사용자 풀에서 MFA 요소를 구성한 사용자는 선택 기반 로그인 시 사용자 이름 암호 인증 흐름으로만 로그인할 수 있습니다. 이러한 사용자는 모든 [클라이언트 기반 로그인](authentication-flows-selection-sdk.md#authentication-flows-selection-client) 흐름을 사용할 수 있습니다.

  다음 표에서는 사용자 풀 MFA 설정 및 MFA 요소의 사용자 구성이 암호 없는 요소로 로그인하는 사용자의 기능에 미치는 영향을 설명합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/user-pool-settings-mfa.html)
+ 사용자가 선호하는 MFA 메서드는 암호를 복구하는 데 사용할 수 있는 메서드에 영향을 미칩니다. 선호하는 MFA가 이메일 메시지인 사용자는 이메일로 암호 재설정 코드를 받을 수 없습니다. 선호하는 MFA가 SMS 메시지인 사용자는 SMS로 암호 재설정 코드를 받을 수 없습니다.

  사용자가 선호하는 암호 재설정 방법을 사용할 수 없는 경우 [암호 복구](managing-users-passwords.md#user-pool-password-reset-and-recovery) 설정에서 대체 옵션을 제공해야 합니다. 예를 들어 복구 메커니즘에 이메일이 최우선 순위일 수 있고 이메일 MFA가 사용자 풀의 옵션일 수 있습니다. 이 경우 SMS 메시지 계정 복구를 두 번째 옵션으로 추가하거나 관리 API 작업을 사용하여 해당 사용자의 암호를 재설정합니다.

  Amazon Cognito는 `InvalidParameterException` 오류 응답과 함께 유효한 복구 방법이 없는 사용자의 암호 재설정 요청에 응답합니다.

  [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html#API_UpdateUserPool_Examples)에 대한 예제 요청 본문은 이메일 메시지 암호 재설정을 사용할 수 없는 경우 사용자가 SMS 메시지로 복구로 돌아갈 수 있는 `AccountRecoverySetting`을 보여줍니다.
+ 사용자는 동일한 이메일 주소 또는 전화번호로 MFA 및 암호 재설정 코드를 받을 수 없습니다. MFA용 이메일 메시지의 일회용 암호(OTP)를 사용하는 경우 계정 복구에 SMS 메시지를 사용해야 합니다. MFA에 SMS 메시지의 OTP를 사용하는 경우 계정 복구에 이메일 메시지를 사용해야 합니다. MFA가 있는 사용자 풀에서 사용자가 이메일 주소 속성은 있지만 전화번호가 없거나, 전화번호 속성은 있지만 이메일 주소가 없는 경우 셀프 서비스 암호 복구를 완료하지 못할 수 있습니다.

  사용자가 이 구성으로 사용자 풀에서 암호를 재설정할 수 없는 상태를 방지하려면 `email` 및 `phone_number` [속성을 필요에 따라](user-pool-settings-attributes.md) 설정합니다. 또는 사용자가 가입하거나 관리자가 사용자 프로필을 생성할 때 항상 이러한 속성을 수집하고 설정하는 프로세스를 설정할 수 있습니다. 사용자에게 두 속성이 모두 있는 경우 Amazon Cognito는 사용자의 MFA 요소가 *아닌* 대상으로 암호 재설정 코드를 자동으로 전송합니다.
+ 사용자 풀에서 MFA를 활성화하고 **SMS 메시지** 또는 **이메일 메시지**를 두 번째 요소로 선택하면 Amazon Cognito에서 확인하지 않은 전화번호 또는 이메일 속성으로 메시지를 보낼 수 있습니다. 사용자가 MFA를 완료하면 Amazon Cognito에서 `phone_number_verified` 또는 `email_verified` 속성을 `true`로 설정합니다.
+ MFA 코드 제시 시도가 5번 실패하면 Amazon Cognito는 [로그인 시도 실패에 대한 잠금 동작](authentication.md#authentication-flow-lockout-behavior)에 설명된 기하급수적 타임아웃 잠금 프로세스를 시작합니다.
+ 계정이 사용자 풀에 대한 Amazon Simple Notification Service(Amazon SNS) 리소스가 포함된의 SMS 샌드박스에 AWS 리전 있는 경우 SMS 메시지를 보내기 전에 Amazon SNS의 전화번호를 확인해야 합니다. 자세한 내용은 [Amazon Cognito 사용자 풀의 SMS 메시지 설정](user-pool-sms-settings.md) 단원을 참조하십시오.
+ 위협 방지 기능을 사용하여 감지된 이벤트에 대한 응답으로 사용자의 MFA 상태를 변경하려면 Amazon Cognito 사용자 풀 콘솔에서 MFA를 활성화하고 선택 사항으로 설정합니다. 자세한 내용은 [위협 방지 기능이 있는 고급 보안](cognito-user-pool-settings-threat-protection.md) 단원을 참조하십시오.
+ 이메일 및 SMS 메시지를 사용하려면 사용자에게 각각 이메일 주소와 전화번호 속성이 있어야 합니다. 사용자 풀에서 `email` 또는 `phone_number`를 필수 속성으로 설정할 수 있습니다. 이 경우 사용자는 전화번호를 제공하지 않으면 가입을 완료할 수 없습니다. 필요에 따라 이러한 속성을 설정하지 않고 이메일 또는 SMS 메시지 MFA를 수행하려는 경우 사용자가 가입할 때 이메일 주소 또는 전화번호를 묻는 메시지가 표시됩니다. 모범 사례로 [이러한 속성을 검증](signing-up-users-in-your-app.md)하도록 사용자에게 자동으로 메시지를 보내도록 사용자 풀을 구성합니다.

  Amazon Cognito는 사용자가 SMS 또는 이메일 메시지로 임시 코드를 성공적으로 수신하고 [VerifyUserAttribute](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttribute.html) API 요청에서 해당 코드를 반환한 경우 확인된 전화번호 또는 이메일 주소를 계산합니다. 또는 팀이 전화번호를 설정하고 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) API 요청을 수행하는 관리 애플리케이션으로 확인된 것으로 표시할 수 있습니다.
+ MFA를 필수로 설정하고 둘 이상의 인증 요소를 활성화한 경우 Amazon Cognito는 새 사용자에게 사용하려는 MFA 요소를 선택하라는 메시지를 표시합니다. SMS 메시지 MFA를 설정하려면 사용자에게 전화번호가 있어야 하고 이메일 메시지 MFA를 설정하려면 이메일 주소가 있어야 합니다. 사용 가능한 메시지 기반 MFA에 대해 정의된 속성이 사용자에게 없는 경우 Amazon Cognito는 TOTP MFA를 설정하라는 메시지를 표시합니다. MFA 요인(`SELECT_MFA_TYPE`)을 선택하고 선택한 요인(`MFA_SETUP`)을 설정하는 프롬프트는 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 및 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) API 작업에 대한 챌린지 응답으로 표시됩니다.

## 사용자 MFA 기본 설정
<a name="user-pool-settings-mfa-preferences"></a>

사용자는 여러 MFA 요소를 설정할 수 있습니다. 하나만 활성화할 수 있습니다. 사용자 풀 설정 또는 사용자 프롬프트에서 사용자에게 효과적인 MFA 기본 설정을 선택할 수 있습니다. 사용자 풀 설정 및 자체 사용자 수준 설정이 다음 조건을 충족할 때 사용자 풀은 사용자에게 MFA 코드를 묻는 메시지를 표시합니다.

1. MFA를 선택 사항으로 설정하거나 사용자 풀에 필요합니다.

1. 사용자에게 유효 `email` 또는 `phone_number` 속성이 있거나 TOTP용 인증자 앱을 설정했습니다.

1. 하나 이상의 MFA 요소가 활성 상태입니다.

1. 하나의 MFA 요소가 기본 설정으로 설정됩니다.

### 로그인 및 MFA에 동일한 요소를 사용하지 않도록 방지
<a name="user-pool-settings-mfa-preferences-same-factor"></a>

하나의 로그인 요소를 일부 또는 모든 사용자가 사용할 수 있는 유일한 로그인 및 MFA 옵션으로 만드는 방식으로 사용자 풀을 구성할 수 있습니다. 이 결과는 기본 로그인 사용 사례가 이메일 메시지 또는 SMS 메시지 일회용 암호(OTPs. 다음 조건에서는 사용자가 선호하는 MFA가 로그인과 동일한 유형의 팩터일 수 있습니다.
+ MFA는 사용자 풀에 필요합니다.
+ 이메일 및 SMS OTP는 사용자 풀에서 로그인 *및* MFA 옵션을 사용할 수 있습니다.
+ 사용자가 이메일 또는 SMS 메시지 OTP로 로그인합니다.
+ 이메일 주소 속성은 있지만 전화번호 속성은 없거나 전화번호 속성은 있지만 이메일 주소 속성은 없습니다.

이 시나리오에서 사용자는 이메일 OTP로 로그인하고 이메일 OTP로 MFA를 완료할 수 있습니다. 이 옵션은 MFA의 필수 함수를 취소합니다. 일회용 암호로 로그인하는 사용자는 MFA와 다른 로그인 전송 방법을 사용할 수 있어야 합니다. 사용자에게 SMS 및 이메일 옵션이 모두 있는 경우 Amazon Cognito는 자동으로 다른 요소를 할당합니다. 예를 들어 사용자가 이메일 OTP로 로그인하면 선호하는 MFA는 SMS OTP입니다.

사용자 풀이 로그인 및 MFA 모두에 대해 OTP 인증을 지원하는 경우 다음 단계를 수행하여 동일 인증 문제를 해결합니다.

1. 이메일 및 SMS OTP를 모두 로그인 요인으로 활성화합니다.

1. 이메일 및 SMS OTP를 모두 MFA 요소로 활성화합니다.

1. 수집

### 사용자 풀 설정 및 MFA 옵션에 미치는 영향
<a name="user-pool-settings-mfa-preferences-things-to-know"></a>

사용자 풀의 구성은 사용자가 선택할 수 있는 MFA 메서드에 영향을 미칩니다. 다음은 MFA를 설정하는 사용자의 기능에 영향을 미치는 일부 사용자 풀 설정입니다.
+ Amazon Cognito 콘솔의 **로그인** 메뉴에 있는 **다중 인증** 구성에서 MFA를 선택적 또는 필수로 설정하거나 끌 수 있습니다. 이 설정과 동등한 API는 `CreateUserPool`, `UpdateUserPool` 및 `SetUserPoolMfaConfig`의 [MfaConfiguration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-MfaConfiguration) 파라미터입니다.

  또한 **다중 인증** 구성에서 **MFA 메서드** 설정은 사용자가 설정할 수 있는 MFA 요소를 결정합니다. 이 설정과 동등한 API는 [SetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserPoolMfaConfig.html) 작업입니다.
+ **사용자 계정 복구**의 **로그인** 메뉴에서 사용자 풀이 암호를 잊어버린 사용자에게 메시지를 보내는 방법을 구성할 수 있습니다. 사용자의 MFA 메서드는 암호 찾기 코드에 대한 사용자 풀 전송 메서드와 동일한 MFA 전송 메서드를 가질 수 없습니다. 암호 찾기 전송 방법의 API 파라미터는 `CreateUserPool` 및 `UpdateUserPool`의 [AccountRecoverySetting](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-AccountRecoverySetting) 파라미터입니다.

  예를 들어 복구 옵션이 **이메일 전용**인 경우 사용자는 이메일 MFA를 설정할 수 없습니다. 동일한 사용자 풀에서 이메일 MFA를 활성화하고 복구 옵션을 **이메일 전용**으로 설정할 수 없기 때문입니다. 이 옵션을 **사용 가능한 경우 이메일, 그렇지 않은 경우 SMS**로 설정하면 이메일이 복구의 우선 순위 옵션이지만, 사용자가 이메일 메시지 복구에 적합하지 않은 경우 사용자 풀이 SMS 메시지로 대체될 수 있습니다. 이 시나리오에서 사용자는 이메일 MFA를 기본 설정으로 설정하고 암호 재설정을 시도할 때만 SMS 메시지를 수신할 수 있습니다.
+ 사용 가능한 MFA 메서드를 하나만 설정하면 사용자 MFA 기본 설정을 관리할 필요가 없습니다.
+ 활성 SMS 구성은 SMS 메시지를 사용자 풀에서 사용 가능한 MFA 메서드로 자동 설정합니다.

  사용자 풀에 자체 Amazon SES 리소스가 포함된 활성 [이메일 구성](user-pool-email.md)과 Essentials 또는 Plus 기능 플랜은 자동으로 이메일 메시지를 사용자 풀에서 사용 가능한 MFA 방법으로 만듭니다.
+ MFA를 사용자 풀에서 필수로 설정하면 사용자는 MFA 메서드를 활성화하거나 비활성화할 수 없습니다. 선호하는 방법만 설정할 수 있습니다.
+ 사용자 풀에서 MFA를 선택 사항으로 설정하면 관리형 로그인은 사용자에게 MFA를 설정하라는 메시지를 표시하지 않지만, 사용자에게 선호하는 MFA 메서드가 있는 경우 MFA 코드를 묻는 메시지를 표시합니다.
+ [위협 방지](cognito-user-pool-settings-threat-protection.md)를 활성화하고 전체 기능 모드에서 적응형 인증 응답을 구성하는 경우 MFA는 사용자 풀에서 선택 사항이어야 합니다. 적응형 인증을 사용하는 응답 옵션 중 하나는 로그인 시도가 위험 수준을 포함하도록 평가되는 사용자에게 MFA를 요구하는 것입니다.

  콘솔의 **가입** 메뉴에 있는 **필수 속성** 설정에 따라 사용자가 애플리케이션에 가입하기 위해 이메일 주소 또는 전화번호를 제공해야 하는지 여부가 결정됩니다. 이메일 및 SMS 메시지는 사용자에게 해당 속성이 있을 때 적격 MFA 요소가 됩니다. `CreateUserPool`의 [스키마](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#CognitoUserPools-CreateUserPool-request-Schema) 파라미터는 필요에 따라 속성을 설정합니다.
+ MFA를 사용자 풀에 필수로 설정하고 사용자가 관리형 로그인으로 로그인하면 Amazon Cognito는 사용자 풀에 사용 가능한 방법에서 MFA 메서드를 선택하라는 메시지를 표시합니다. 관리형 로그인은 이메일 주소 또는 전화번호의 수집과 TOTP 설정을 처리합니다. 다음 다이어그램은 Amazon Cognito가 사용자에게 제공하는 옵션의 논리를 보여줍니다.

### 사용자에 대한 MFA 기본 설정 구성
<a name="user-pool-settings-mfa-preferences-configure"></a>

액세스 토큰 권한이 있는 셀프 서비스 모델 또는 관리형 API 작업이 있는 관리자 관리형 모델의 사용자에 대해 MFA 기본 설정을 구성할 수 있습니다. 이러한 작업은 MFA 메서드를 활성화 또는 비활성화하고 여러 메서드 중 하나를 기본 옵션으로 설정합니다. 사용자가 MFA 기본 설정을 지정하면 Amazon Cognito는 로그인 시 기본 MFA 메서드의 코드를 제공하라는 메시지를 표시합니다. 기본 설정을 지정하지 않은 사용자는 `SELECT_MFA_TYPE` 챌린지에서 선호하는 방법을 선택하라는 프롬프트를 받게 됩니다.
+ 사용자 셀프 서비스 모델 또는 퍼블릭 애플리케이션에서 로그인한 사용자의 액세스 토큰으로 승인된 [SetUserMfaPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserMFAPreference.html)는 MFA 구성을 설정합니다.
+ 관리자 관리형 또는 기밀 애플리케이션에서 관리 자격 AWS 증명으로 권한이 부여된 [AdminSetUserPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserMFAPreference.html)는 MFA 구성을 설정합니다.

Amazon Cognito 콘솔의 **사용자** 메뉴에서 사용자 MFA 기본 설정을 지정할 수도 있습니다. Amazon Cognito 사용자 풀 API의 공개 및 기밀 인증 모델에 대한 자세한 내용은 [API, OIDC 및 관리형 로그인 페이지 인증 이해](authentication-flows-public-server-side.md#user-pools-API-operations) 섹션을 참조하십시오.

## 사용자 런타임 시 MFA 로직에 대한 세부 정보
<a name="user-pool-settings-mfa-user-outcomes"></a>

사용자가 로그인할 때 수행할 단계를 결정하기 위해 사용자 풀은 사용자 MFA 기본 설정, [사용자 속성](user-pool-settings-attributes.md), [사용자 풀 MFA 설정](#user-pool-configuring-mfa), [위협 방지](cognito-user-pool-settings-adaptive-authentication.md) 조치 및 [셀프 서비스 계정 복구](managing-users-passwords.md#user-pool-password-reset-and-recovery) 설정을 평가합니다. 그런 다음 사용자에게 로그인하거나, MFA 메서드를 선택하라는 메시지를 표시하거나, MFA 메서드를 설정하라는 메시지를 표시하거나, MFA를 입력하라는 메시지를 표시합니다. MFA 메서드를 설정하려면 사용자가 [이메일 주소 또는 전화번호](user-pool-settings-mfa-sms-email-message.md)를 제공하거나 [TOTP 인증자를 등록](user-pool-settings-mfa-totp.md#totp-mfa-set-up-api)해야 합니다. 또한 MFA 옵션을 설정하고 미리 [선호하는 옵션을 등록](#user-pool-settings-mfa-preferences-configure)할 수 있습니다. 다음 다이어그램은 초기 가입 직후 로그인 시도에 대한 사용자 풀 구성의 자세한 영향을 나열합니다.

여기에 설명된 로직은 SDK 기반 애플리케이션 및 [관리형 로그인](cognito-user-pools-managed-login.md) 로그인에 적용되지만 관리형 로그인에는 표시되지 않습니다. MFA 문제를 해결할 때 사용자 결과에서 시작하여 해당 결정에 영향을 미친 사용자 프로필 및 사용자 풀 구성까지 역으로 작업합니다.

![\[최종 사용자 MFA 선택을 위한 Amazon Cognito 사용자 풀 결정 프로세스의 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/cup-mfa-decision-tree.png)


다음 목록은 결정 로직 다이어그램의 번호 지정에 해당하며 각 단계를 자세히 설명합니다. ![\[checkmark\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png)는 성공한 인증과 흐름의 결론을 나타냅니다. ![\[error\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/error.png)는 인증 실패를 나타냅니다.

1. 사용자가 로그인 화면에 사용자 이름 또는 사용자 이름과 암호를 표시합니다. 유효한 자격 증명을 제시하지 않으면 로그인 요청이 거부됩니다.

1. 사용자 이름-암호 인증에 성공한 경우 MFA가 필요한지, 선택 사항인지 또는 꺼져 있는지 확인합니다. 꺼져 있으면 올바른 사용자 이름과 암호로 인증이 성공합니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

   1. MFA가 선택 사항인 경우 사용자가 이전에 TOTP 인증자를 설정했는지 확인합니다. TOTP를 설정한 경우 TOTP MFA를 입력하라는 메시지를 표시합니다. MFA 문제에 성공적으로 응답하면 로그인됩니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

   1. 위협 방지의 적응형 인증 기능에 사용자가 MFA를 설정해야 하는지 확인합니다. MFA가 할당되지 않은 경우 사용자가 로그인됩니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

1. MFA가 필요하거나 적응형 인증에 MFA가 할당된 경우 사용자가 MFA 요소를 활성화 및 기본 설정으로 설정했는지 확인합니다. 설정한 경우 해당 요소로 MFA를 입력하라는 메시지가 표시됩니다. MFA 문제에 성공적으로 응답하면 로그인됩니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

1. 사용자가 MFA 기본 설정을 지정하지 않은 경우 사용자가 TOTP 인증자를 등록했는지 확인합니다.

   1. 사용자가 TOTP 인증자를 등록한 경우 사용자 풀에서 TOTP MFA를 사용할 수 있는지 확인합니다(사용자가 이전에 인증자를 설정한 후 TOTP MFA를 비활성화할 수 있음).

   1. 사용자 풀에서도 이메일 메시지나 SMS 메시지 MFA를 사용할 수 있는지 확인합니다.

   1.  이메일 또는 SMS MFA를 사용할 수 없는 경우 사용자에게 TOTP MFA를 입력하라는 메시지를 표시합니다. MFA 문제에 성공적으로 응답하면 로그인됩니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

   1. 이메일 또는 SMS MFA를 사용할 수 있는 경우 사용자에게 해당 `email` 또는 `phone_number` 속성이 있는지 확인합니다. 그렇다면 셀프 서비스 계정 복구의 기본 방법이 아니고 MFA에 대해 활성화된 모든 속성을 사용할 수 있습니다.

   1. TOTP와 사용 가능한 SMS 또는 이메일 MFA 요소를 포함하는 `MFAS_CAN_SELECT` 옵션을 사용하여 사용자에게 `SELECT_MFA_TYPE` 문제 메시지를 표시합니다.

   1.  사용자에게 `SELECT_MFA_TYPE` 문제에 대한 응답으로 선택한 요소를 묻는 메시지를 표시합니다. MFA 문제에 성공적으로 응답하면 로그인됩니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

1. 사용자가 TOTP 인증자를 등록하지 않았거나 TOTP MFA가 현재 비활성화되어 있는 경우 사용자에게 `email` 또는 `phone_number` 속성이 있는지 확인합니다.

1.  사용자에게 이메일 주소만 있거나 전화번호만 있는 경우 해당 속성이 사용자 풀이 암호 재설정을 위해 계정 복구 메시지를 보내기 위해 구현하는 방법인지 확인합니다. true인 경우 MFA가 필요한 로그인을 완료할 수 없으며 Amazon Cognito는 오류를 반환합니다. 이 사용자의 로그인을 활성화하려면 복구되지 않는 속성을 추가하거나 TOTP 인증자를 등록해야 합니다. ![\[alt text not found\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/error.png) 

   1. 사용 가능한 복구 불가능한 이메일 주소나 전화번호가 있는 경우 해당 이메일이나 SMS MFA 요소가 활성화되어 있는지 확인하세요.

   1. 복구되지 않는 이메일 주소 속성이 있고 이메일 MFA가 활성화된 경우 `EMAIL_OTP` 문제를 표시합니다. MFA 문제에 성공적으로 응답하면 로그인됩니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

   1. 복구되지 않는 전화번호 속성이 있고 SMS MFA가 활성화된 경우 `SMS_MFA` 문제를 입력하라는 메시지를 표시합니다. MFA 문제에 성공적으로 응답하면 로그인됩니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

   1. 활성화된 이메일 또는 SMS MFA 요소에 적합한 속성이 없는 경우 TOTP MFA가 활성화되어 있는지 확인합니다. TOTP MFA가 비활성화된 경우 MFA가 필요한 로그인을 완료할 수 없으며 Amazon Cognito는 오류를 반환합니다. 이 사용자의 로그인을 활성화하려면 복구되지 않는 속성을 추가하거나 TOTP 인증자를 등록해야 합니다. ![\[alt text not found\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/error.png) 
**참고**  
사용자에게 TOTP 인증자가 있지만 TOTP MFA가 비활성화된 경우 이 단계는 이미 **아니요**로 평가되었습니다.

   1. TOTP MFA가 활성화된 경우 `MFAS_CAN_SETUP` 옵션에서 `SOFTWARE_TOKEN_MFA`를 사용하여 사용자에게 `MFA_SETUP` 문제를 제시합니다. 이 문제를 완료하려면 사용자에 대한 TOTP 인증자를 별도로 등록하고 `"ChallengeName": "MFA_SETUP", "ChallengeResponses": {"USERNAME": "[username]", "SESSION": "[Session ID from VerifySoftwareToken]}"`로 응답해야 합니다.

   1. 사용자가 [VerifySoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifySoftwareToken.html) 요청의 세션 토큰으로 `MFA_SETUP` 문제에 응답한 후 `SOFTWARE_TOKEN_MFA` 문제 메시지를 표시합니다. MFA 문제에 성공적으로 응답하면 로그인됩니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

1. 사용자에게 이메일 주소와 전화번호가 모두 있는 경우 암호 재설정을 위한 계정 복구 메시지의 기본 방법이 되는 속성을 결정합니다.

   1. 셀프 서비스 계정 복구가 비활성화된 경우 두 속성 중 하나를 MFA에 사용할 수 있습니다. 이메일 및 SMS MFA 요소 중 하나 또는 둘 모두가 활성화되어 있는지 확인합니다.

   1. 두 속성이 모두 MFA 요소로 활성화된 경우 `MFAS_CAN_SELECT` 옵션 `SMS_MFA` 및 `EMAIL_OTP`에 대한 `SELECT_MFA_TYPE` 문제를 사용자에게 표시합니다.

   1. `SELECT_MFA_TYPE` 문제에 대한 응답으로 선택한 요소를 묻는 메시지를 표시합니다. MFA 문제에 성공적으로 응답하면 로그인됩니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

   1. 하나의 속성만 적격 MFA 요소인 경우 나머지 요소에 대한 문제를 표시합니다. MFA 문제에 성공적으로 응답하면 로그인됩니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

      이러한 결과는 다음과 같은 시나리오에서 발생합니다.

      1. `email` 및 `phone_number` 속성이 있는 경우 SMS 및 이메일 MFA가 활성화되고 기본 계정 복구 방법은 이메일 또는 SMS 메시지입니다.

      1. `email` 및 `phone_number` 속성이 있는 경우 SMS MFA 또는 이메일 MFA만 활성화되고 셀프 서비스 계정 복구는 비활성화됩니다.

1. 사용자가 TOTP 인증자를 등록하지 않았고 `email` 또는 `phone_number` 속성이 없는 경우 `MFA_SETUP` 문제를 입력하라는 메시지를 표시합니다. `MFAS_CAN_SETUP`의 목록에는 기본 계정 복구 옵션이 아닌 사용자 풀에서 활성화된 모든 MFA 요소가 포함됩니다. 이메일 또는 TOTP MFA에 대해 `ChallengeResponses`를 사용하여 이 문제에 응답할 수 있습니다. SMS MFA를 설정하려면 전화번호 속성을 별도로 추가하고 인증을 다시 시작합니다.

   TOTP MFA의 경우 `"ChallengeName": "MFA_SETUP", "ChallengeResponses": {"USERNAME": "[username]", "SESSION": "[Session ID from VerifySoftwareToken]"}`로 응답합니다.

   이메일 MFA의 경우 `"ChallengeName": "MFA_SETUP", "ChallengeResponses": {"USERNAME": "[username]", "email": "[user's email address]"}`로 응답합니다.

   1. `SELECT_MFA_TYPE` 문제에 대한 응답으로 선택한 요소를 묻는 메시지를 표시합니다. MFA 문제에 성공적으로 응답하면 로그인됩니다. ![\[Green circular icon with a checkmark symbol inside.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/checkmark.png) 

## 다중 인증을 위한 사용자 풀 구성
<a name="user-pool-configuring-mfa"></a>

Amazon Cognito 콘솔 또는 [SetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserPoolMfaConfig.html) API 작업 및 SDK 메서드를 사용하여 MFA를 구성할 수 있습니다.

**Amazon Cognito 콘솔에서 MFA를 구성하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에 로그인합니다.

1. [**사용자 풀(User Pools)**]을 선택합니다.

1. 목록에서 기존 사용자 풀을 선택하거나 [사용자 풀을 생성합니다](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html).

1. **로그인** 메뉴를 선택합니다. **다중 인증**을 찾아서 **편집**을 선택합니다.

1. 사용자 풀에 사용하려는 **MFA 시행(MFA enforcement)** 방법을 선택합니다.  
![\[MFA 옵션이 포함된 Amazon Cognito 콘솔의 스크린샷입니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/cup-mfa.png)

   1. **MFA 필수(Require MFA)**. 사용자 풀에 있는 모든 사용자는 추가 인증 요소로 SMS, 이메일 또는 시간 기반 일회용 암호(TOTP) 코드를 사용하여 로그인해야 합니다.

   1. **선택적 MFA**. 사용자에게 추가 로그인 팩터를 등록하는 옵션을 제공할 수 있지만 MFA를 구성하지 않은 사용자의 로그인도 허용할 수 있습니다. 조정 인증을 사용하는 경우 이 옵션을 선택합니다. 조정 인증에 대한 자세한 내용은 [위협 방지 기능이 있는 고급 보안](cognito-user-pool-settings-threat-protection.md) 섹션을 참조하세요.

   1. **MFA 없음(No MFA)**. 사용자는 추가 로그인 요소를 등록할 수 없습니다.

1. 앱에서 지원하는 **MFA 방법(MFA methods)**을 선택합니다. **이메일 메시지**, **SMS 메시지** 또는 TOTP 생성 **인증자 앱**을 두 번째 요소로 설정할 수 있습니다.

1. SMS 문자 메시지를 두 번째 팩터로 사용하는데 SMS 메시지용 Amazon Simple Notification Service(Amazon SNS)와 함께 사용하도록 구성된 IAM 역할이 없는 경우 콘솔에서 이러한 역할을 생성합니다. 사용자 풀의 **인증 방법** 메뉴에서 **SMS**를 찾아 **편집**을 선택합니다. Amazon Cognito가 사용자에게 SMS 메시지를 전송하도록 허용하는 기존 역할을 사용할 수도 있습니다. 자세한 내용은 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)을 참조하세요.

   이메일 메시지를 두 번째 요소로 사용하고 Amazon Simple Email Service(Amazon SES)에서 이메일 메시지에 사용할 발신 ID를 구성하지 않은 경우 콘솔에서 ID를 하나 만듭니다. **SES로 이메일 전송** 옵션을 선택해야 합니다. 사용자 풀의 **인증 방법** 메뉴에서 **이메일**을 찾아 **편집**을 선택합니다. 목록에 있는 사용 가능한 확인된 ID에서 **보낸 사람 이메일 주소**를 선택합니다. 확인된 도메인(예: `example.com`)을 선택하는 경우 `admin-noreply@example.com`과 같이 확인된 도메인에서 **보낸 사람 발신자 이름**도 구성해야 합니다.

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

# SMS 및 이메일 메시지 MFA
<a name="user-pool-settings-mfa-sms-email-message"></a>

SMS 및 이메일 MFA 메시지는 사용자가 로그인하기 전에 메시지 대상에 액세스할 수 있음을 확인합니다. 암호뿐만 아니라 원래 사용자의 SMS 메시지 또는 이메일 받은 편지함에도 액세스할 수 있는지 확인합니다. Amazon Cognito는 사용자가 사용자 이름과 암호를 성공적으로 제공한 후 사용자 풀이 보낸 단축 코드를 제공하도록 요청합니다.

SMS 및 이메일 메시지 MFA는 사용자가 프로필에 이메일 주소 또는 전화번호를 추가한 후 추가 구성이 필요하지 않습니다. Amazon Cognito는 확인되지 않은 이메일 주소와 전화번호로 메시지를 보낼 수 있습니다. 사용자가 첫 번째 MFA를 완료하면 Amazon Cognito는 이메일 주소 또는 전화번호를 확인된 것으로 표시합니다.

MFA 인증은 MFA를 사용하는 사용자가 애플리케이션에 사용자 이름과 암호를 입력할 때 시작됩니다. 애플리케이션은 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 또는 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) API 요청을 호출하는 SDK 메서드에 이러한 초기 파라미터를 제출합니다. API 응답의 `ChallengeParameters`에는 인증 코드가 전송된 위치를 나타내는 `CODE_DELIVERY_DESTINATION` 값이 포함되어 있습니다. 애플리케이션에서 사용자에게 휴대폰을 확인하라는 메시지를 표시하고 코드에 대한 입력 요소를 포함합니다. 코드를 입력하면 챌린지 응답 API 요청에 제출하여 로그인 프로세스를 완료합니다.

MFA를 사용하는 사용자가 [관리형 로그인](cognito-user-pools-managed-login.md) 페이지에서 사용자 이름과 암호로 로그인하면 MFA 코드를 자동으로 입력하라는 메시지가 표시됩니다.

사용자 풀은 AWS 계정의 Amazon Simple Notification Service(Amazon SNS) 리소스를 사용하여 MFA 및 기타 Amazon Cognito 알림에 대한 SMS 메시지를 보냅니다. 마찬가지로 사용자 풀은 계정의 Amazon Simple Email Service(Amazon SES) 리소스로 이메일 메시지를 전송합니다. 이러한 연결된 서비스에는 메시지 전송 AWS 청구서에 대한 자체 비용이 발생합니다. 또한 프로덕션 볼륨에서 메시지를 보내기 위한 추가 요구 사항도 있습니다. 자세한 내용은 다음 링크를 참조하십시오.
+ [Amazon Cognito 사용자 풀의 SMS 메시지 설정](user-pool-sms-settings.md)
+ [전 세계 SMS 요금](https://aws.amazon.com/sns/sms-pricing/)
+ [Amazon Cognito 사용자 풀에 대한 이메일 설정](user-pool-email.md)
+ [Amazon SES 요금](https://aws.amazon.com/ses/pricing)

## SMS 및 이메일 메시지 MFA 고려 사항
<a name="user-pool-settings-mfa-sms-email-message-considerations"></a>
+ 사용자가 이메일 MFA로 로그인하도록 허용하려면 사용자 풀에 다음 구성 옵션이 있어야 합니다.

  1. 사용자 풀에 Plus 또는 Essentials 기능 플랜이 있습니다. 자세한 내용은 [사용자 풀 기능 플랜](cognito-sign-in-feature-plans.md) 단원을 참조하십시오.

  1. 사용자 풀은 자체 Amazon SES 리소스와 함께 이메일 메시지를 전송합니다. 자세한 내용은 [Amazon SES 이메일 구성](user-pool-email.md#user-pool-email-developer) 단원을 참조하십시오.
+ MFA 코드는 앱 클라이언트에 대해 설정한 **인증 흐름 세션 기간** 동안 유효합니다.

  앱 클라이언트를 **편집**할 때 **앱 클라이언트** 메뉴에서 Amazon Cognito 콘솔에서 인증 흐름 세션의 기간을 설정합니다. `CreateUserPoolClient` 또는 `UpdateUserPoolClient` API 요청에서 인증 흐름 세션 기간을 설정할 수도 있습니다. 자세한 내용은 [인증 세션의 예](authentication.md#amazon-cognito-user-pools-authentication-flow) 단원을 참조하십시오.
+ 사용자가 Amazon Cognito가 확인되지 않은 전화번호 또는 이메일 주소로 보낸 SMS 또는 이메일 메시지의 코드를 성공적으로 제공하면 Amazon Cognito는 해당 속성을 확인된 것으로 표시합니다.
+ 사용자가 MFA와 연결된 전화번호 또는 이메일 주소의 값을 셀프 서비스 방식으로 변경하려면 액세스 토큰으로 로그인하여 요청을 승인해야 합니다. 현재 전화번호 또는 이메일 주소에 액세스할 수 없는 경우 로그인할 수 없습니다. 팀은 [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) API 요청에서 관리자 AWS 자격 증명을 사용하여 이러한 값을 변경해야 합니다.
+ 사용자 풀에서 [SMS를 구성](user-pool-sms-settings.md)한 후에는 SMS 메시지를 사용 가능한 MFA 요인으로 비활성화할 수 없습니다.

# TOTP 소프트웨어 토큰 MFA
<a name="user-pool-settings-mfa-totp"></a>

사용자 풀에서 TOTP 소프트웨어 토큰 MFA를 설정하면 사용자가 사용자 이름 및 암호로 로그인한 다음 TOTP를 사용하여 인증을 완료합니다. 사용자가 사용자 이름 및 암호를 설정하고 확인하면 MFA에서 TOTP 소프트웨어 토큰을 활성화할 수 있습니다. 앱이 Amazon Cognito 관리형 로그인을 사용하여 사용자를 로그인하는 경우 사용자는 자신의 사용자 이름 및 암호를 제출한 다음 추가 로그인 페이지에서 TOTP 암호를 제출합니다.

Amazon Cognito 콘솔에서 사용자 풀에 대해 TOTP MFA를 활성화하거나 Amazon Cognito API 작업을 사용할 수 있습니다. 사용자 풀 수준에서 [SetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserPoolMfaConfig.html)를 호출하여 MFA를 구성하고 TOTP MFA를 활성화할 수 있습니다.

**참고**  
사용자 풀에 대해 TOTP 소프트웨어 토큰 MFA를 활성화하지 않는 경우 Amazon Cognito는 토큰을 사용하여 사용자를 연결하거나 확인할 수 없습니다. 이 경우 사용자는 `SoftwareTokenMFANotFoundException` 설명과 함께 `Software Token MFA has not been enabled by the userPool` 예외를 수신합니다. 나중에 사용자 풀에 대해 소프트웨어 토큰 MFA를 비활성화하면 이전에 TOTP 토큰을 연결하고 확인한 사용자는 해당 토큰을 MFA에 계속 사용할 수 있습니다.

사용자에 대해 TOTP를 구성하는 것은 사용자가 일회용 암호를 입력하여 유효성을 검사하는 시크릿 코드를 받는 다단계 프로세스입니다. 그런 다음 사용자에 대해 TOTP MFA를 활성화하거나 TOTP를 사용자에 대한 기본 MFA 방법으로 설정할 수 있습니다.

TOTP MFA를 요구하도록 사용자 풀을 구성하고 사용자가 관리형 로그인에서 앱에 가입하면 Amazon Cognito가 사용자 프로세스를 자동화합니다. Amazon Cognito는 사용자에게 MFA 방식을 선택하라는 메시지를 표시하고 QR 코드를 표시하여 인증 앱을 설정하고 MFA 등록을 확인합니다. 사용자가 SMS와 TOTP MFA 중에서 선택할 수 있도록 허용한 사용자 풀에서 Amazon Cognito는 사용자에게 방식을 선택할 수 있는 기회도 제공합니다.

**중요**  
사용자 풀과 연결된 AWS WAF 웹 ACL이 있고 웹 ACL의 규칙에 CAPTCHA가 표시되는 경우 관리형 로그인 TOTP 등록에서 복구할 수 없는 오류가 발생할 수 있습니다. CAPTCHA 작업이 있고 관리형 로그인 TOTP에 영향을 주지 않는 규칙을 생성하려면 [관리형 로그인 TOTP MFA를 위한 AWS WAF 웹 ACL 구성](#totp-waf) 섹션을 참조하세요. AWS WAF 웹 ACL 및 Amazon Cognito에 대한 자세한 내용은 [AWS WAF 웹 ACL을 사용자 풀과 연결](user-pool-waf.md) 단원을 참조하시기 바랍니다.

 AWS SDK 및 [Amazon Cognito 사용자 풀 API를 사용하여 사용자 지정 빌드 UI에서 TOTP MFA를 구현하려면 섹션을 참조하세요](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html)[사용자에 대한 TOTP MFA 구성](#totp-mfa-set-up-api).

사용자 풀에 MFA를 추가하는 방법은 [사용자 풀에 MFA 추가](user-pool-settings-mfa.md) 섹션을 참조하세요.

**TOTP MFA 고려 사항 및 제한 사항**

1. Amazon Cognito는 TOTP 코드를 생성하는 인증자 앱을 통해 소프트웨어 토큰 MFA를 지원합니다. Amazon Cognito는 하드웨어 기반 MFA를 지원하지 않습니다.

1. 사용자 풀이 TOTP를 구성하지 않은 사용자에 대해 TOTP를 요구하는 경우 사용자는 앱이 사용자의 TOTP MFA를 활성화하는 데 사용할 수 있는 일회성 액세스 토큰을 수신합니다. 사용자가 추가 TOTP 로그인 팩터를 등록할 때까지 후속 로그인 시도는 실패합니다.
   + `SignUp` API 작업과 함께 또는 관리형 로그인을 통해 사용자 풀에 가입하는 사용자는 가입을 완료할 때 일회성 토큰을 수신합니다.
   + 사용자를 생성하고 해당 사용자가 자신의 초기 암호를 설정하면 Amazon Cognito가 관리형 로그인에서 해당 사용자에게 일회성 토큰을 발행합니다. 사용자에 대한 영구 암호를 설정하면 사용자가 처음 로그인할 때 Amazon Cognito가 일회성 토큰을 발급합니다.
   + Amazon Cognito는 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 또는 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) API 작업으로 로그인하는 관리자가 생성한 사용자에게 일회성 토큰을 발행하지 않습니다. 사용자가 자신의 초기 암호를 설정하는 문제에 성공한 후 또는 사용자에 대한 영구 암호가 설정된 경우 Amazon Cognito는 즉시 해당 사용자에게 MFA를 설정하는 문제를 냅니다.

1. MFA가 필요한 사용자 풀의 사용자가 이미 일회성 액세스 토큰을 수신했지만 TOTP MFA를 설정하지 않은 경우 사용자는 MFA를 설정할 때까지 관리형 로그인으로 로그인할 수 없습니다. 액세스 토큰 대신 [AssociateSoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AssociateSoftwareToken.html) 요청의 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 또는 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)에 대해 `MFA_SETUP` 문제의 `session` 응답 값을 사용할 수 있습니다.

1. 사용자가 TOTP를 설정한 경우 나중에 사용자 풀에 대해 TOTP가 비활성화되어도 해당 TOTP를 MFA에 사용할 수 있습니다.

1. Amazon Cognito는 HMAC-SHA1 해시 함수를 사용하여 코드를 생성하는 인증 앱의 TOTP만 허용합니다. SHA-256 해싱으로 생성된 코드는 `Code mismatch` 오류를 반환합니다.

## 사용자에 대한 TOTP MFA 구성
<a name="totp-mfa-set-up-api"></a>

사용자가 처음 로그인하면 앱은 일회성 액세스 토큰을 사용하여 TOTP 프라이빗 키를 생성하고 해당 키를 텍스트 또는 QR 코드 형식으로 사용자에게 제공합니다. 사용자가 인증자 앱을 구성하고 후속 로그인 시도에 TOTP를 제공합니다. 앱 또는 관리형 로그인은 MFA 문제 응답에서 Amazon Cognito에 TOTP를 제공합니다.

경우에 따라 관리형 로그인은 새 사용자에게 TOTP 인증자를 설정하라는 메시지를 표시합니다. 자세한 내용은 [사용자 런타임 시 MFA 로직에 대한 세부 정보](user-pool-settings-mfa.md#user-pool-settings-mfa-user-outcomes) 섹션을 참조하세요.

**Topics**
+ [TOTP 소프트웨어 토큰 연결](#user-pool-settings-mfa-totp-associate-token)
+ [TOTP 토큰 확인](#user-pool-settings-mfa-totp-verification)
+ [TOTP MFA로 로그인](#user-pool-settings-mfa-totp-sign-in)
+ [TOTP 토큰 제거](#user-pool-settings-mfa-totp-remove)

### TOTP 소프트웨어 토큰 연결
<a name="user-pool-settings-mfa-totp-associate-token"></a>

TOTP 토큰을 연결하려면 일회용 암호로 검증해야 하는 시크릿 코드를 사용자에게 보냅니다. 토큰 연결에는 세 가지 단계가 필요합니다.

1. 사용자가 TOTP 소프트웨어 토큰 MFA를 선택하면 [AssociateSoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AssociateSoftwareToken.html)을 호출하여 해당 사용자 계정에 대해 생성된 고유한 공유 시크릿 키 코드를 반환합니다. 액세스 토큰 또는 세션 문자열로 AssociateSoftwareToken을 인증할 수 있습니다.

1. 앱은 사용자에게 프라이빗 키 또는 프라이빗 키에서 생성한 QR 코드를 제공합니다. 사용자는 애플리케이션이 프라이빗 키에서 생성하는 QR 코드를 스캔하거나 키를 수동으로 입력하여 Google Authenticator와 같은 TOTP 생성 앱에 키를 입력해야 합니다.

1. 사용자가 키를 입력하거나 Google Authenticator와 같은 인증자 앱에 QR 코드를 스캔하면 앱에서 코드 생성을 시작합니다.

### TOTP 토큰 확인
<a name="user-pool-settings-mfa-totp-verification"></a>

다음으로 TOTP 토큰을 확인합니다. 다음과 같이 사용자의 샘플 코드를 요청하고 해당 코드를 Amazon Cognito 서비스에 제공하여 사용자가 TOTP 코드를 성공적으로 생성하고 있는지 확인합니다.

1. 앱에서 사용자에게 인증자 앱을 올바르게 설정했음을 보여주는 코드를 입력하라는 메시지를 표시합니다.

1. 사용자의 인증자 앱에서 임시 암호를 표시합니다. 인증자 앱은 이 암호를 사용자에게 제공된 시크릿 키를 기반으로 생성합니다.

1. 사용자가 자신의 임시 암호를 입력합니다. `[VerifySoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifySoftwareToken.html)` API 요청에서 앱이 임시 암호를 Amazon Cognito에 전달합니다.

1.  Amazon Cognito는 사용자와 연결된 시크릿 키를 유지하고 TOTP를 생성하여 사용자가 제공한 TOTP와 비교합니다. 일치하는 경우 `VerifySoftwareToken`에서 `SUCCESS` 응답을 반환합니다.

1. Amazon Cognito에서 TOTP 팩터를 사용자와 연결합니다.

1. `VerifySoftwareToken` 작업에서 `ERROR` 응답을 반환하는 경우 사용자의 클록이 정확하고 최대 재시도 횟수를 초과하지 않았는지 확인합니다. Amazon Cognito는 낮은 클록 스큐를 고려해서 시도 전후 30초 이내 TOTP 토큰은 허용합니다. 문제를 해결했으면 VerifySoftwareToken 작업을 다시 시도합니다.

### TOTP MFA로 로그인
<a name="user-pool-settings-mfa-totp-sign-in"></a>

이 시점에서 사용자는 시간 기반 일회용 암호를 사용하여 로그인합니다. 프로세스는 다음과 같습니다.

1. 사용자는 사용자 이름과 암호를 입력하여 클라이언트 앱에 로그인합니다.

1. TOTP MFA 문제가 호출되고, 앱은 사용자에게 임시 암호를 입력하라는 메시지를 표시합니다.

1. 사용자는 연결된 TOTP 생성 앱에서 임시 암호를 가져옵니다.

1. 사용자는 클라이언트 앱에 TOTP 코드를 입력합니다. 앱이 이를 확인하라고 Amazon Cognito 서비스에 알립니다. 각 로그인에 대해 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)를 호출하여 새 TOTP 인증 챌린지에 대한 응답을 받아야 합니다.

1. Amazon Cognito에서 토큰을 확인하면 로그인이 성공하고 사용자가 인증 흐름을 계속합니다.

### TOTP 토큰 제거
<a name="user-pool-settings-mfa-totp-remove"></a>

마지막으로, 앱에서 사용자가 TOTP 구성을 비활성화할 수 있도록 허용해야 합니다. 현재 사용자의 TOTP 소프트웨어 토큰을 삭제할 수 없습니다. 사용자의 소프트웨어 토큰을 교체하려면 새 소프트웨어 토큰을 연결하고 확인하세요. 사용자에 대한 TOTP MFA를 비활성화하려면 [SetUserMFAPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserMFAPreference.html)를 호출하여 사용자가 MFA를 사용하지 않거나 SMS MFA만 사용하도록 수정합니다.

1. MFA를 재설정하려는 사용자를 위한 인터페이스를 앱에 생성합니다. 이 인터페이스에서 사용자에게 암호를 입력하라는 메시지를 표시합니다.

1. Amazon Cognito가 TOTP MFA 챌린지를 반환하는 경우 [SetUserMFAPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserMFAPreference.html)로 사용자의 MFA 기본 설정을 업데이트합니다.

1. 앱에서 사용자에게 MFA를 비활성화했음을 알리고 다시 로그인하라는 메시지를 표시합니다.

## 관리형 로그인 TOTP MFA를 위한 AWS WAF 웹 ACL 구성
<a name="totp-waf"></a>

사용자 풀과 연결된 AWS WAF 웹 ACL이 있고 웹 ACL의 규칙에 CAPTCHA가 있는 경우 관리형 로그인 TOTP 등록에서 복구할 수 없는 오류가 발생할 수 있습니다. AWS WAF CAPTCHA 규칙은 관리형 로그인 및 클래식 호스팅 UI의 TOTP MFA*에만* 이러한 영향을 미칩니다. SMS MFA는 영향을 받지 않습니다.

CAPTCHA 규칙으로 인해 사용자가 TOTP MFA 설정을 완료할 수 없으면 Amazon Cognito에서 다음 오류를 표시합니다.

Request not allowed due to WAF captcha.

이 오류는가 사용자 풀이 백그라운드에서 수행하는 [AssociateSoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AssociateSoftwareToken.html) 및 [VerifySoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifySoftwareToken.html) API 요청에 대한 응답으로 CAPTCHA를 입력하라는 AWS WAF 메시지를 표시할 때 발생합니다. 관리형 로그인 페이지에서 TOTP에 영향을 미치지 않고 CAPTCHA 작업이 있는 규칙을 만들려면 규칙의 CAPTCHA 작업에서 `AssociateSoftwareToken` 및 `VerifySoftwareToken`의 `x-amzn-cognito-operation-name` 헤더 값을 제외합니다.

다음 스크린샷은 `x-amzn-cognito-operation-name` 헤더 값이 `AssociateSoftwareToken` 또는가 아닌 모든 요청에 CAPTCHA 작업을 적용하는 예제 AWS WAF 규칙을 보여줍니다`VerifySoftwareToken`.

![\[x-amzn-cognito-operation-name 헤더 값이 AssociateSoftwareToken 또는가 아닌 모든 요청에 CAPTCHA 작업을 적용하는 AWS WAF 규칙의 스크린샷입니다VerifySoftwareToken.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/cup-WAF-rule-TOTP.png)


 AWS WAF 웹 ACLs[AWS WAF 웹 ACL을 사용자 풀과 연결](user-pool-waf.md). Amazon Cognito

# 위협 방지 기능이 있는 고급 보안
<a name="cognito-user-pool-settings-threat-protection"></a>

사용자 풀을 생성한 후에는 Amazon Cognito 콘솔의 탐색 메뉴에서 **위협 방지**에 액세스할 수 있습니다. 위협 방지 기능을 켜고 다양한 위험에 대응하여 취해지는 조치를 사용자 지정할 수 있습니다. 또는 감사 모드를 사용하여 보안 완화를 적용하지 않고 탐지된 위험에 대한 지표를 수집할 수 있습니다. 감사 모드에서 위협 방지는 Amazon CloudWatch에 지표를 게시합니다. Amazon Cognito가 첫 번째 이벤트를 생성한 후에 지표를 볼 수 있습니다. [위협 방지 지표 보기](metrics-for-cognito-user-pools.md#user-pool-settings-viewing-threat-protection-metrics)을(를) 참조하세요.

위협 방지는 이전에 *고급 보안 기능*으로 불렸으며, 사용자 풀에서 원치 않는 활동에 대한 모니터링 도구 세트이며 잠재적으로 악의적인 활동을 자동으로 종료하는 구성 도구입니다. 위협 방지에는 표준 인증 작업과 사용자 지정 인증 작업에 대한 다양한 구성 옵션이 있습니다. 예를 들어, 추가 보안 요소를 설정했지만 기본 사용자 이름-암호 인증으로 동일한 위험 수준의 사용자를 차단한 의심스러운 사용자 지정 인증 로그인이 있는 사용자에게 알림을 보낼 수 있습니다.

위협 방지는 Plus 기능 플랜에서 사용할 수 있습니다. 자세한 내용은 [사용자 풀 기능 플랜](cognito-sign-in-feature-plans.md) 단원을 참조하십시오.

다음 사용자 풀 옵션은 위협 방지의 구성 요소입니다.

**손상된 보안 인증**  
사용자는 여러 사용자 계정에 암호를 재사용합니다. Amazon Cognito의 손상된 보안 인증 기능은 사용자 이름 및 암호의 공개 유출 데이터를 수집하여 사용자의 보안 인증을 유출된 보안 인증 목록과 비교합니다. 손상된 보안 인증 탐지는 일반적으로 추측되는 암호도 검사합니다. 사용자 풀의 사용자 이름 및 암호 표준 인증 흐름에서 손상된 자격 증명을 확인할 수 있습니다. Amazon Cognito는 보안 원격 암호(SRP) 또는 사용자 지정 인증에서 손상된 자격 증명을 감지하지 않습니다.  
손상된 보안 인증을 확인하도록 요청하는 사용자 작업과 이에 대한 응답으로 Amazon Cognito가 수행하기를 원하는 작업을 선택할 수 있습니다. 로그인, 가입, 암호 변경 이벤트의 경우, Amazon Cognito는 **로그인을 차단**하거나 **로그인을 허용**할 수 있습니다. 두 경우 모두 Amazon Cognito가 생성하는 사용자 활동 로그에서 이벤트에 대한 추가 정보를 찾을 수 있습니다.  
**자세히 알아보기**  
[손상된 자격 증명 감지 작업](cognito-user-pool-settings-compromised-credentials.md)

**조정 인증**  
Amazon Cognito는 사용자의 로그인 요청에서 위치 및 디바이스 정보를 검토하고 자동 응답을 적용하여 의심스러운 활동으로부터 사용자 풀의 사용자 계정을 보호할 수 있습니다. 사용자 활동을 모니터링하고 사용자 이름-암호 및 SRP의 감지된 위험 수준에 대한 응답과 사용자 지정 인증을 자동화할 수 있습니다.  
위협 방지를 활성화하면 Amazon Cognito가 사용자 활동에 위험 점수를 할당합니다. 의심스러운 활동에 자동 응답을 할당할 수 있습니다. **MFA를 요구**하거나, **로그인을 차단**하거나, 활동 세부 정보 및 위험 점수를 로깅할 수 있습니다. 또한 의심스러운 활동을 사용자에게 알리는 이메일 메시지를 자동으로 전송하여 사용자가 암호를 재설정하거나 기타 자체 안내 조치를 취할 수 있습니다.  
**자세히 알아보기**  
[적응형 인증 작업](cognito-user-pool-settings-adaptive-authentication.md)

**IP 주소 허용 목록 및 거부 목록**  
**전체 기능** 모드의 Amazon Cognito 위협 방지를 사용하면 IP 주소 **항상 차단** 및 **항상 허용** 예외를 생성할 수 있습니다. **항상 차단(Always block)** 예외 목록에 있는 IP 주소의 세션에는 조정 인증별 위험 수준이 할당되지 않으며 이러한 세션은 사용자 풀에 로그인할 수 없습니다.  

**IP 주소 허용 목록 및 차단 목록에 대해 알아야 할 사항**
+ **항상 차단** 및 **항상 허용**은 CIDR 형식으로 표현해야 합니다. 예를 들어 `192.0.2.0/24`는 24비트 마스크, `192.0.2.252/32`는 단일 IP 주소입니다.
+  IP 주소가 **항상 차단** IP 범위에 있는 디바이스는 SDK 기반 또는 관리형 로그인 애플리케이션으로 가입하거나 로그인할 수 없지만 타사 IdP로 로그인할 수 있습니다.
+ **항상 허용** 및 **항상 차단** 목록은 토큰 새로 고침에 영향을 주지 않습니다.
+ Amazon Cognito는 **항상 허용** IP 범위의 디바이스에 적응형 인증 MFA 규칙을 적용하지 않지만 손상된 자격 증명 규칙을 적용합니다.

**로그 내보내기**  
위협 방지는 사용자 풀에 대한 사용자 인증 요청의 세부 정보를 세부적으로 기록합니다. 이러한 로그에는 위협 평가, 사용자 정보, 위치 및 디바이스와 같은 세션 메타데이터가 포함됩니다. 보존 및 분석을 위해 이러한 로그의 외부 아카이브를 생성할 수 있습니다. Amazon Cognito 사용자 풀은 위협 방지 로그를 Amazon S3, CloudWatch Logs 및 Amazon Data Firehose로 내보냅니다. 자세한 내용은 [사용자 이벤트 기록 보기 및 내보내기](cognito-user-pool-settings-adaptive-authentication.md#user-pool-settings-adaptive-authentication-event-user-history) 단원을 참조하십시오.  
**자세히 알아보기**  
[위협 방지 사용자 활동 로그 내보내기](exporting-quotas-and-usage.md#exporting-quotas-and-usage-user-activity)

**Topics**
+ [위협 방지를 위한 고려 사항 및 제한 사항](#cognito-user-pool-threat-protection-considerations)
+ [사용자 풀에서 위협 방지 켜기](#cognito-user-pool-threat-protection-activating)
+ [위협 방지 시행 개념](#cognito-user-pool-settings-threat-protection-threat-protection-enforcement)
+ [표준 인증 및 사용자 지정 인증을 위한 위협 방지](#cognito-user-pool-settings-threat-protection-threat-protection-types)
+ [위협 방지 전제 조건](#cognito-user-pool-threat-protection-prerequisites)
+ [위협 방지 설정](#cognito-user-pool-settings-configure-threat-protection)
+ [손상된 자격 증명 감지 작업](cognito-user-pool-settings-compromised-credentials.md)
+ [적응형 인증 작업](cognito-user-pool-settings-adaptive-authentication.md)
+ [애플리케이션에서 위협 방지를 위한 데이터 수집](user-pool-settings-viewing-threat-protection-app.md)

## 위협 방지를 위한 고려 사항 및 제한 사항
<a name="cognito-user-pool-threat-protection-considerations"></a>

**위협 방지 옵션은 인증 흐름마다 다릅니다.**  
Amazon Cognito는 인증 흐름 `USER_PASSWORD_AUTH` 및 `ADMIN_USER_PASSWORD_AUTH`를 통해 적응형 인증과 손상된 자격 증명 탐지를 모두 지원합니다. `USER_SRP_AUTH`에 대한 적응형 인증만 활성화할 수 있습니다. 페더레이션 로그인에는 위협 방지를 사용할 수 없습니다.

**상시 차단 IP 요청 할당량에 기여합니다.**  
사용자 풀의 **항상 차단(Always block)** 예외 목록에 있는 IP 주소의 차단된 요청은 사용자 풀에 대한 [요청 비율 할당량](https://docs.aws.amazon.com/cognito/latest/developerguide/limits.html#category_operations)에 기여합니다.

**위협 방지는 속도 제한을 적용하지 않습니다.**  
일부 악성 트래픽은 분산 서비스 거부(DDoS) 공격과 같은 대량 요청의 특성을 갖습니다. Amazon Cognito가 들어오는 트래픽에 적용하는 위험 등급은 요청당이며 요청 볼륨을 고려하지 않습니다. 대량 이벤트의 개별 요청은 볼륨 공격에서의 역할과 관련이 없는 애플리케이션 계층 이유로 위험 점수와 자동 응답을 받을 수 있습니다. 사용자 풀에서 볼륨 측정 공격에 대한 방어를 구현하려면 AWS WAF 웹 ACLs 추가합니다. 자세한 내용은 [AWS WAF 웹 ACL을 사용자 풀과 연결](user-pool-waf.md) 단원을 참조하십시오.

**위협 방지는 M2M 요청에 영향을 주지 않습니다.**  
클라이언트 보안 인증 부여는 사용자 계정과 연결되지 않은 M2M(Machine-to-Machine) 인증을 위한 것입니다. 위협 방지는 사용자 풀의 사용자 계정과 암호만 모니터링합니다. M2M 활동으로 보안 기능을 구현하려면 요청 속도 및 콘텐츠를 모니터링하기 AWS WAF 위한의 기능을 고려하세요. 자세한 내용은 [AWS WAF 웹 ACL을 사용자 풀과 연결](user-pool-waf.md) 단원을 참조하십시오.

## 사용자 풀에서 위협 방지 켜기
<a name="cognito-user-pool-threat-protection-activating"></a>

------
#### [ Amazon Cognito user pools console ]

**사용자 풀에 대한 위협 방지를 활성화하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)로 이동합니다. 메시지가 표시되면 자격 AWS 증명을 입력합니다.

1. [**사용자 풀(User Pools)**]을 선택합니다.

1. 목록에서 기존 사용자 풀을 선택하거나 [사용자 풀을 생성합니다](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html).

1. 아직 활성화하지 않은 경우 **설정** 메뉴에서 Plus 기능 플랜을 활성화합니다.

1. **위협 방지** 메뉴를 선택하고 **활성화**를 선택합니다.

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

------
#### [ 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 요청에서 기능 플랜을 Plus로 설정합니다. 다음 부분 예제 요청 본문은 위협 방지를 전체 기능 모드로 설정합니다. 전체 예제 요청은 [예제](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html#API_CreateUserPool_Examples) 섹션을 참조하세요.

```
"UserPoolAddOns": { 
      "AdvancedSecurityMode": "ENFORCED"
   }
```

------

위협 방지는 계정 탈취 징후에 대해 사용자 작업을 모니터링하고 영향을 받는 사용자 계정을 보호하기 위해 자동으로 대응하는 기능을 통칭하는 용어입니다. 사용자가 표준 및 사용자 지정 인증 흐름으로 로그인할 때 위협 방지 설정을 적용할 수 있습니다.

위협 방지는 사용자의 로그인, 로그아웃 및 기타 활동을 자세히 설명하는 [로그를 생성](cognito-user-pool-settings-adaptive-authentication.md#user-pool-settings-adaptive-authentication-event-user-history)합니다. 이러한 로그를 타사 시스템으로 내보낼 수 있습니다. 자세한 내용은 [사용자 이벤트 기록 보기 및 내보내기](cognito-user-pool-settings-adaptive-authentication.md#user-pool-settings-adaptive-authentication-event-user-history) 단원을 참조하십시오.

## 위협 방지 시행 개념
<a name="cognito-user-pool-settings-threat-protection-threat-protection-enforcement"></a>

위협 방지는 사용자 풀이 사용자 활동을 모니터링하고 위험 수준을 할당하며 로그를 생성하는 *감사 전용* 모드에서 시작됩니다. *전체 기능 모드*를 활성화하기 전에 2주 이상 감사 전용 모드에서 실행하는 것이 가장 좋습니다. 전체 기능 모드에는 감지된 위험한 활동 및 손상된 암호에 대한 자동 대응 세트가 포함됩니다. 감사 전용 모드를 사용하면 Amazon Cognito가 수행하는 위협 평가를 모니터링할 수 있습니다. 가양성 및 부정 사항에 대해 기능을 훈련하는 [피드백을 제공](cognito-user-pool-settings-adaptive-authentication.md#user-pool-settings-adaptive-authentication-feedback)할 수도 있습니다.

사용자 풀 수준의 위협 방지 적용은 사용자 풀의 모든 앱 클라이언트와 개별 앱 클라이언트 수준에서 구성할 수 있습니다. 앱 클라이언트 위협 방지 구성은 사용자 풀 구성을 재정의합니다. 앱 클라이언트에 대한 위협 방지를 구성하려면 Amazon Cognito 콘솔의 사용자 풀에 있는 **앱 클라이언트** 메뉴에서 앱 클라이언트 설정으로 이동합니다. 여기서 **클라이언트 수준 설정을 사용**하고 앱 클라이언트 전용으로 적용을 구성할 수 있습니다.

또한 표준 인증 유형과 사용자 지정 인증 유형에 대해 위협 방지를 별도로 구성할 수 있습니다.

## 표준 인증 및 사용자 지정 인증을 위한 위협 방지
<a name="cognito-user-pool-settings-threat-protection-threat-protection-types"></a>

위협 방지를 구성할 수 있는 방법은 사용자 풀 및 앱 클라이언트에서 수행하는 인증 유형에 따라 다릅니다. 다음 각 유형의 인증에는 자체 적용 모드와 자동 응답이 있을 수 있습니다.

**표준 인증**  
*표준 인증*은 관리형 로그인에서 사용자 이름-암호 흐름을 사용한 사용자 로그인, 로그아웃 및 암호 관리입니다. Amazon Cognito 위협 방지는 관리형 로그인으로 로그인하거나 다음 API `AuthFlow` 파라미터를 사용할 때 작업에서 위험 지표를 모니터링합니다.    
**[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthFlow)**  
`USER_PASSWORD_AUTH`, `USER_SRP_AUTH`. 손상된 자격 증명 기능은 `USER_SRP_AUTH` 로그인에서 암호에 액세스할 수 없으며 이 흐름을 사용하여 이벤트를 모니터링하거나 작업하지 않습니다.  
**[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-AuthFlow)**  
`ADMIN_USER_PASSWORD_AUTH`, `USER_SRP_AUTH`. 손상된 자격 증명 기능은 `USER_SRP_AUTH` 로그인에서 암호에 액세스할 수 없으며 이 흐름을 사용하여 이벤트를 모니터링하거나 작업하지 않습니다.
표준 인증의 **적용 모드**를 **감사 전용** 또는 **전체 함수**로 설정할 수 있습니다. 표준 인증에 대한 위협 모니터링을 비활성화하려면 위협 방지를 **적용 없음**으로 설정합니다.

**사용자 지정 인증**  
*사용자 지정 인증*은 [사용자 지정 챌린지 Lambda 트리거](user-pool-lambda-challenge.md)를 사용한 사용자 로그인입니다. 관리형 로그인에서는 사용자 지정 인증을 수행할 수 없습니다. Amazon Cognito 위협 방지는 `InitiateAuth` 및 `AdminInitiateAuth`의 API `AuthFlow` 파라미터 `CUSTOM_AUTH`를 사용하여 로그인할 때 위험 지표에 대한 작업을 모니터링합니다.  
사용자 지정 인증의 **적용 모드**를 **감사 전용**, **전체 함수** 또는 **적용 없음**으로 설정할 수 있습니다. **적용 없음** 옵션은 다른 위협 방지 기능에 영향을 주지 않고 사용자 지정 인증에 대한 위협 모니터링을 비활성화합니다.

## 위협 방지 전제 조건
<a name="cognito-user-pool-threat-protection-prerequisites"></a>

시작하려면 다음이 필요합니다.
+ 앱 클라이언트가 포함된 사용자 풀. 자세한 내용은 [사용자 풀 시작하기](getting-started-user-pools.md) 단원을 참조하십시오.
+ Amazon Cognito 콘솔에서 멀티 팩터 인증(MFA)을 [**선택 사항(Optional)**]으로 설정하여 위험 기반 조정 인증 기능을 사용합니다. 자세한 내용은 [사용자 풀에 MFA 추가](user-pool-settings-mfa.md) 섹션을 참조하세요.
+ 이메일 알림을 사용하고 있는 경우에는 [Amazon SES 콘솔](https://console.aws.amazon.com/ses/home)로 이동하여 이메일 알림에서 사용할 이메일 주소 또는 도메인을 구성하고 확인합니다. Amazon SES에 대한 자세한 내용은 [Amazon SES에서 자격 증명 확인](https://docs.aws.amazon.com/ses/latest/dg/verify-addresses-and-domains.html)을 참조하세요.

## 위협 방지 설정
<a name="cognito-user-pool-settings-configure-threat-protection"></a>

다음 지침에 따라 사용자 풀 위협 방지를 설정합니다.

**참고**  
Amazon Cognito 사용자 풀 콘솔에서 앱 클라이언트에 대해 다른 위협 방지 구성을 설정하려면 **앱 클라이언트** 메뉴에서 앱 클라이언트를 선택하고 **클라이언트 수준 설정 사용**을 선택합니다.

------
#### [ AWS Management Console ]

**사용자 풀에 대한 위협 방지를 구성하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)로 이동합니다. 메시지가 표시되면 자격 AWS 증명을 입력합니다.

1. [**사용자 풀(User Pools)**]을 선택합니다.

1. 목록에서 기존 사용자 풀을 선택하거나 [사용자 풀을 생성합니다](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html).

1. **위협 방지** 메뉴를 선택하고 **활성화**를 선택합니다.

1. 구성하려는 위협 방지 방법인 **표준 및 사용자 지정 인증**을 선택합니다. 사용자 지정 및 표준 인증에 대해 다양한 적용 모드를 설정할 수 있지만 **전체 함수** 모드에서 자동 응답의 구성을 공유합니다.

1. **편집**을 선택합니다.

1. **적용 모드**를 선택합니다. 감지된 위험에 즉시 대응하려면 **전체 함수**를 선택하고 손상된 자격 증명 및 적응형 인증에 대한 자동 응답을 구성합니다. 사용자 수준 로그 및 CloudWatch에서 정보를 수집하려면 **감사 전용**을 선택합니다.

   작업을 활성화하기 전에 2주 동안 위협 방지를 감사 모드로 유지하는 것이 좋습니다. 이 기간 동안 Amazon Cognito는 앱 사용자의 사용 패턴을 학습하고 응답을 조정하기 위한 이벤트 피드백을 제공할 수 있습니다.

1. **감사 전용(Audit only)**을 선택한 경우 **변경 사항 저장(Save changes)**을 선택합니다. [**전체 기능(Full function)**]을 선택한 경우 다음을 수행합니다.

   1. [**사용자 정의(Custom)**] 작업을 수행할지 또는 [**Cognito 기본값(Cognito defaults)**]을 사용하여 의심스러운 [**손상된 자격 증명(Compromised credentials)**]에 대응할지 선택합니다. [**Cognito 기본값(Cognito defaults)**]은 다음과 같습니다.

      1. [**로그인(Sign-in)**], [**가입(Sign-up)**], **암호 변경(Password change)**]에서 손상된 자격 증명을 탐지합니다.

      1. [**로그인 차단(Block sign-in)**] 작업으로 손상된 자격 증명에 대응합니다.

   1. **손상된 자격 증명**에 대해 **사용자 지정** 작업을 선택한 경우 Amazon Cognito가 **이벤트 감지**에 사용할 사용자 풀 작업 및 Amazon Cognito가 수행하도록 할 **손상된 자격 증명 응답**을 선택합니다. 의심스러운 손상된 자격 증명으로 [**로그인 차단(Block sign-in)**] 또는 [**로그인 허용(Allow sign-in)**]을 선택할 수 있습니다.

   1. **조정 인증(Adaptive authentication)**에서 악의적인 로그인 시도에 대응하는 방법을 선택합니다. **사용자 지정(Custom)** 작업을 수행할지 또는 **Cognito 기본값(Cognito defaults)**을 사용하여 의심스러운 악의적인 활동에 대응할지 선택합니다. **Cognito 기본값(Cognito defaults)**을 선택한 경우 Amazon Cognito는 모든 위험 수준에서 로그인을 차단하고 사용자에게 알리지 않습니다.

   1. **조정 인증(Adaptive authentication)**에서 **사용자 지정(Custom)** 작업을 선택한 경우 Amazon Cognito에서 심각도 수준에 따라 탐지된 위험에 대응하여 수행할 **자동 위험 대응(Automatic risk response)**을 선택합니다. 위험 수준에 대응을 할당할 때 더 높은 수준의 위험에 덜 제한적인 대응을 할당할 수는 없습니다. 위험 수준에 할당할 수 있는 대응은 다음과 같습니다.

      1. [**로그인 허용(Allow sign-in)**] - 예방 조치를 수행하지 않습니다.

      1. [**선택적 MFA(Optional MFA)**] - 사용자에 대해 MFA가 구성되어 있는 경우 Amazon Cognito는 사용자가 로그인할 때 항상 추가 SMS 또는 시간 기반 일회용 암호(TOTP) 팩터를 제공하도록 요구합니다. MFA가 구성되어 있지 않은 사용자는 정상적으로 로그인을 계속할 수 있습니다.

      1. [**MFA 필요(Require MFA)**] - 사용자에 대해 MFA가 구성되어 있는 경우 Amazon Cognito는 사용자가 로그인할 때 항상 추가 SMS 또는 TOTP 팩터를 제공하도록 요구합니다. MFA가 구성되어 있지 않은 사용자의 경우 Amazon Cognito에서 MFA를 설정하라는 메시지를 표시합니다. 사용자에게 MFA를 자동으로 요구하기 전에 SMS MFA용 전화 번호를 캡처하거나 TOTP MFA용 인증 앱을 등록하는 메커니즘을 앱에 구성합니다.

      1. **로그인 차단(Block sign-in)** - 사용자가 로그인할 수 없도록 합니다.

      1. **사용자 알림(Notify user)** - Amazon Cognito가 탐지한 위험과 수행된 대응 작업에 대한 정보가 포함된 이메일 메시지를 사용자에게 보냅니다. 보내는 메시지의 이메일 메시지 템플릿을 사용자 지정할 수 있습니다.

1. 이전 단계에서 **사용자 알림(Notify user)**을 선택한 경우 조정 인증용 이메일 전송 설정 및 이메일 템플릿을 사용자 지정할 수 있습니다.

   1. **이메일 구성**에서 적응형 인증과 함께 사용할 **SES 리전**, **보낸 사람 이메일 주소**, **보낸 사람 발신자 이름** 및 **회신 이메일 주소**를 선택합니다. 사용자 풀 이메일 메시지를 Amazon Simple Email Service와 통합하는 방법에 대한 자세한 내용은 [Amazon Cognito 사용자 풀에 대한 이메일 설정](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-email.html)을 참조하세요.  
![\[사용자 이벤트 기록\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/cup-advanced-security-ses-notification.png)

   1. **이메일 템플릿(Email templates)**을 확장하여 HTML 버전의 이메일 메시지와 일반 텍스트 버전의 이메일 메시지 모두에서 조정 인증 알림을 사용자 지정합니다. 이메일 메시지 템플릿에 대한 자세한 내용은 [메시지 템플릿](cognito-user-pool-settings-message-customizations.md#cognito-user-pool-settings-message-templates) 섹션을 참조하세요.

1. 위협 방지 위험 평가에 관계 없이 항상 허용되거나 차단되는 IPv4 또는 IPv6 주소 범위의 **항상 허용** 또는 **항상 차단** 목록을 생성하기 위해 **IP 주소 예외**를 확장합니다. [CIDR 표기법](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation)(예: 192.168.100.0/24)으로 IP 주소 범위를 지정합니다.

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

------
#### [ API (user pool) ]

사용자 풀에 대한 위협 방지 구성을 설정하려면 `ClientId` 파라미터가 아닌 `UserPoolId` 파라미터가 포함된 [SetRiskConfiguration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetRiskConfiguration.html) 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 요청에서 `AdvancedSecurityMode`를 `ENFORCED`로 설정해야 합니다. 이 예제의 `{username}`와 같은 자리 표시자 템플릿에 대한 자세한 내용은 [MFA, 인증, 확인 및 초대 메시지 구성](cognito-user-pool-settings-message-customizations.md) 섹션을 참조하십시오.

```
{
   "AccountTakeoverRiskConfiguration": { 
      "Actions": { 
         "HighAction": { 
            "EventAction": "MFA_REQUIRED",
            "Notify": true
         },
         "LowAction": { 
            "EventAction": "NO_ACTION",
            "Notify": true
         },
         "MediumAction": { 
            "EventAction": "MFA_IF_CONFIGURED",
            "Notify": true
         }
      },
      "NotifyConfiguration": { 
         "BlockEmail": { 
            "Subject": "You have been blocked for suspicious activity",
            "TextBody": "We blocked {username} at {login-time} from {ip-address}."
         },
         "From": "admin@example.com",
         "MfaEmail": { 
            "Subject": "Suspicious activity detected, MFA required",
            "TextBody": "Unexpected sign-in from {username} on device {device-name}. You must use MFA."
         },
         "NoActionEmail": { 
            "Subject": "Suspicious activity detected, secure your user account",
            "TextBody": "We noticed suspicious sign-in activity by {username} from {city}, {country} at {login-time}. If this was not you, reset your password."
         },
         "ReplyTo": "admin@example.com",
         "SourceArn": "arn:aws:ses:us-west-2:123456789012:identity/admin@example.com"
      }
   },
   "CompromisedCredentialsRiskConfiguration": { 
      "Actions": { 
         "EventAction": "BLOCK"
      },
      "EventFilter": [ "SIGN_UP" ]
   },
   "RiskExceptionConfiguration": { 
      "BlockedIPRangeList": [ "192.0.2.0/24","198.51.100.0/24" ],
      "SkippedIPRangeList": [ "203.0.113.0/24" ]
   },
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

------
#### [ API (app client) ]

앱 클라이언트에 대한 위협 방지 구성을 설정하려면 `UserPoolId` 파라미터와 `ClientId` 파라미터를 포함하는 [SetRiskConfiguration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetRiskConfiguration.html) 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 요청에서 `AdvancedSecurityMode`를 `ENFORCED`로 설정해야 합니다. 이 예제의 `{username}`와 같은 자리 표시자 템플릿에 대한 자세한 내용은 [MFA, 인증, 확인 및 초대 메시지 구성](cognito-user-pool-settings-message-customizations.md) 섹션을 참조하십시오.

```
{
   "AccountTakeoverRiskConfiguration": { 
      "Actions": { 
         "HighAction": { 
            "EventAction": "BLOCK",
            "Notify": true
         },
         "LowAction": { 
            "EventAction": "NO_ACTION",
            "Notify": true
         },
         "MediumAction": { 
            "EventAction": "MFA_REQUIRED",
            "Notify": true
         }
      },
      "NotifyConfiguration": { 
         "BlockEmail": { 
            "Subject": "You have been blocked for suspicious activity",
            "TextBody": "We blocked {username} at {login-time} from {ip-address}."
         },
         "From": "admin@example.com",
         "MfaEmail": { 
            "Subject": "Suspicious activity detected, MFA required",
            "TextBody": "Unexpected sign-in from {username} on device {device-name}. You must use MFA."
         },
         "NoActionEmail": { 
            "Subject": "Suspicious activity detected, secure your user account",
            "TextBody": "We noticed suspicious sign-in activity by {username} from {city}, {country} at {login-time}. If this was not you, reset your password."
         },
         "ReplyTo": "admin@example.com",
         "SourceArn": "arn:aws:ses:us-west-2:123456789012:identity/admin@example.com"
      }
   },
   "ClientId": "1example23456789",
   "CompromisedCredentialsRiskConfiguration": { 
      "Actions": { 
         "EventAction": "BLOCK"
      },
      "EventFilter": [ "SIGN_UP", "SIGN_IN", "PASSWORD_CHANGE" ]
   },
   "RiskExceptionConfiguration": { 
      "BlockedIPRangeList": [ "192.0.2.1/32","192.0.2.2/32" ],
      "SkippedIPRangeList": [ "192.0.2.3/32","192.0.2.4/32" ]
   },
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

------

# 손상된 자격 증명 감지 작업
<a name="cognito-user-pool-settings-compromised-credentials"></a>

Amazon Cognito는 사용자의 사용자 이름과 암호가 다른 곳에서 손상되었는지 탐지할 수 있습니다. 사용자가 자격 증명을 둘 이상의 사이트에서 재사용하거나 안전하지 않은 암호를 사용할 때 이러한 문제가 발생할 수 있습니다. Amazon Cognito는 사용자 이름과 암호로 관리형 로그인 및 Amazon Cognito API로 로그인하는 [로컬 사용자](cognito-terms.md#terms-localuser)를 확인합니다.

Amazon Cognito 콘솔의 **위협 방지** 메뉴에서 **손상된 자격 증명**을 구성할 수 있습니다. **이벤트 감지(Event detection)**를 구성하여 손상된 보안 인증 정보에 대해 모니터링할 사용자 이벤트를 선택합니다. **손상된 보안 인증 정보 응답(Compromised credentials responses)**을 구성하여 손상된 보안 인증 정보가 감지된 경우 사용자를 허용할지 또는 차단할지 선택합니다. 로그인, 가입 및 암호 변경을 진행하는 동안 Amazon Cognito에서 손상된 보안 인증 정보를 확인할 수 있습니다.

**로그인 허용(Allow sign-in)**을 선택한 경우 Amazon CloudWatch Logs를 검토하여 사용자 이벤트에서 Amazon Cognito가 수행하는 평가를 모니터링할 수 있습니다. 자세한 내용은 [위협 방지 지표 보기](metrics-for-cognito-user-pools.md#user-pool-settings-viewing-threat-protection-metrics) 단원을 참조하십시오. **로그인 차단(Block sign-in)**을 선택하면 Amazon Cognito는 손상된 보안 인증 정보를 이용하는 사용자의 로그인을 방지합니다. Amazon Cognito가 사용자의 로그인을 차단하면 사용자의 [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserType.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserType.html)가 `RESET_REQUIRED`로 설정됩니다. `RESET_REQUIRED` 상태의 사용자는 암호를 변경해야 다시 로그인할 수 있습니다.

손상된 자격 증명은 다음 사용자 활동에 대한 암호를 확인할 수 있습니다.

**가입**  
사용자 풀은 사용자가 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) 작업 및 관리형 로그인의 가입 페이지에서 전송하는 암호에 손상 지표가 있는지 확인합니다.

**로그인**  
사용자 풀은 사용자가 암호 기반 로그인에서 제출하는 암호에 손상 지표가 있는지 확인합니다. Amazon Cognito는 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)의 `ADMIN_USER_PASSWORD_AUTH` 흐름, [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)의 `USER_PASSWORD_AUTH` 흐름 및 둘 다의 `USER_AUTH` 흐름 `PASSWORD` 옵션을 검토할 수 있습니다.  
현재 Amazon Cognito는 SRP(Secure Remote Password) 흐름을 사용한 로그인 작업에서 손상된 보안 인증을 확인하지 않습니다. SRP는 로그인 시 해시된 암호 증명을 전송합니다. Amazon Cognito는 내부적으로 암호에 액세스할 수 없으므로 클라이언트가 일반 텍스트로 전달하는 암호만 평가할 수 있습니다.

**암호 재설정**  
사용자 풀은 [ConfirmForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html) 셀프 서비스 암호 재설정 작업을 사용하여 새 사용자 암호를 설정하는 작업의 손상 지표를 확인합니다. 이 작업에 필요한 코드는 [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) 및 [AdminResetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html)에서 생성됩니다.  
손상된 자격 증명은 [AdminSetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html)로 설정된 임시 또는 영구 관리자 설정 암호를 확인하지 않습니다. 그러나 임시 암호를 사용하면 사용자 풀이 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) 및 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)의 `NEW_PASSWORD_REQUIRED` 문제에 대한 응답의 암호를 확인합니다.

사용자 풀에 손상된 자격 증명 차단을 추가하는 방법은 [위협 방지 기능이 있는 고급 보안](cognito-user-pool-settings-threat-protection.md) 섹션을 참조하세요.

# 적응형 인증 작업
<a name="cognito-user-pool-settings-adaptive-authentication"></a>

조정 인증을 사용하면 의심스러운 로그인을 차단하거나 위험 수준이 높아졌을 때 두 번째 인증 요소를 추가하도록 사용자 풀을 구성할 수 있습니다. Amazon Cognito는 각 로그인 시도에 대해 손상된 소스로부터 로그인 요청이 나오게 될 가능성에 대해 위험 점수를 계산합니다. 이 위험 점수는 애플리케이션이 제공하는 디바이스 및 사용자 요인과 Amazon Cognito가 요청에서 파생된 기타 요인을 기반으로 합니다. Amazon Cognito의 위험 평가에 영향을 미치는 몇 가지 요인은 IP 주소, 사용자 에이전트 및 다른 로그인 시도와의 지리적 거리입니다. 적응형 인증은 Amazon Cognito가 사용자 세션에서 위험을 감지하고 사용자가 아직 MFA 방법을 선택하지 않은 경우 사용자 풀의 사용자에 대해 다중 인증(MFA)을 켜거나 요구할 수 있습니다. 사용자에 대해 MFA를 활성화하면 적응형 인증이 구성된 방식과 관계없이 인증 중에 두 번째 요소를 제공하거나 설정하라는 인증 문제가 항상 수신됩니다. 사용자의 관점에서 보면 앱이 MFA 설정을 지원하며, 선택적으로 Amazon Cognito는 추가 요소를 구성할 때까지 사용자가 다시 로그인하지 못하도록 합니다.

Amazon Cognito는 로그인 시도, 위험 수준 및 실패한 챌린지에 대한 지표를 Amazon CloudWatch에 게시합니다. 자세한 내용은 [위협 방지 지표 보기](metrics-for-cognito-user-pools.md#user-pool-settings-viewing-threat-protection-metrics) 단원을 참조하십시오.

사용자 풀에 조정 인증을 추가하는 방법은 [위협 방지 기능이 있는 고급 보안](cognito-user-pool-settings-threat-protection.md) 섹션을 참조하세요.

**Topics**
+ [조정 인증 개요](#security-cognito-user-pool-settings-adaptive-authentication-overview)
+ [API 요청에 사용자 디바이스 및 세션 데이터 추가](#user-pool-settings-adaptive-authentication-device-fingerprint)
+ [사용자 이벤트 기록 보기 및 내보내기](#user-pool-settings-adaptive-authentication-event-user-history)
+ [이벤트 피드백 제공](#user-pool-settings-adaptive-authentication-feedback)
+ [알림 메시지 전송](#user-pool-settings-adaptive-authentication-messages)

## 조정 인증 개요
<a name="security-cognito-user-pool-settings-adaptive-authentication-overview"></a>

Amazon Cognito 콘솔의 **위협 방지** 메뉴에서 다양한 위험 수준에서 수행할 작업과 사용자에 대한 알림 메시지 사용자 지정을 포함하여 적응형 인증에 대한 설정을 선택할 수 있습니다. 모든 앱 클라이언트에 글로벌 위협 방지 구성을 할당할 수 있지만 개별 앱 클라이언트에는 클라이언트 수준 구성을 적용할 수 있습니다.

Amazon Cognito 조정 인증은 각 사용자 세션에 **높음**, **중간**, **낮음** 또는 **위험 없음** 위험 수준 중 하나를 할당합니다.

**Enforcement method**(적용 방법)를 **Audit-only**(감사 전용)에서 **Full-function**(전체 기능)으로 변경할 때는 옵션을 신중하게 고려하세요. 위험 수준에 적용하는 자동 응답은 Amazon Cognito가 동일한 특성을 가진 후속 사용자 세션에 할당하는 위험 수준에 영향을 줍니다. 예를 들어, Amazon Cognito가 처음에 고위험으로 평가한 사용자 세션에 조치를 취하지 않거나 **Allow**(허용)를 선택하면 Amazon Cognito는 유사한 세션을 위험이 낮은 것으로 간주합니다.


**위험 수준별로 다음 옵션 중에서 선택할 수 있습니다.**  

|  옵션  |  작업  | 
| --- | --- | 
| 허용 | 사용자는 추가 팩터 없이 로그인할 수 있습니다. | 
| 선택적 MFA | 두 번째 팩터가 구성된 사용자는 로그인을 위해 두 번째 팩터 문제를 완료해야 합니다. SMS 전화 번호 및 TOTP 소프트웨어 토큰이 사용 가능한 두 번째 팩터입니다. 두 번째 인증 요소를 구성하지 않은 사용자는 하나의 자격 증명 세트로만 로그인할 수 있습니다. | 
| MFA 필요 | 두 번째 팩터가 구성된 사용자는 로그인을 위해 두 번째 팩터 문제를 완료해야 합니다. Amazon Cognito는 두 번째 팩터가 구성되지 않은 사용자의 로그인을 차단합니다. | 
| 차단 | Amazon Cognito는 지정된 위험 수준의 모든 로그인 시도를 차단합니다. | 

**참고**  
두 번째 인증 팩터인 SMS에 사용하기 위해 전화 번호를 인증할 필요가 없습니다.

## API 요청에 사용자 디바이스 및 세션 데이터 추가
<a name="user-pool-settings-adaptive-authentication-device-fingerprint"></a>

API를 사용하여 가입하고, 로그인하고, 암호를 재설정할 때 사용자의 세션 정보를 수집하여 Amazon Cognito 위협 방지로 전달할 수 있습니다. 이 정보에는 사용자의 IP 주소와 고유 디바이스 식별자가 포함됩니다.

프록시 서비스나 애플리케이션 서버와 같이 사용자와 Amazon Cognito 간에 중간 네트워크 디바이스가 있을 수 있습니다. 적응형 인증이 서버나 프록시 대신 사용자 엔드포인트의 특성을 기반으로 위험을 계산하도록 사용자의 컨텍스트 데이터를 수집하여 Amazon Cognito에 전달할 수 있습니다. 클라이언트측 앱이 Amazon Cognito API 작업을 직접 호출하는 경우 적응형 인증은 소스 IP 주소를 자동으로 기록합니다. 그러나 디바이스 지문을 수집하지 않는 한 `user-agent`와 같은 다른 디바이스 정보는 기록하지 않습니다.

Amazon Cognito 컨텍스트 데이터 수집 라이브러리로 이 데이터를 생성하여 [ContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ContextDataType.html) 및 [UserContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserContextDataType.html) 파라미터와 함께 Amazon Cognito 위협 방지에 제출합니다. 컨텍스트 데이터 수집 라이브러리는 AWS SDKs에 포함됩니다. 자세한 내용은 [웹 및 모바일 앱과 Amazon Cognito 인증 및 권한 부여 통합](cognito-integrate-apps.md) 단원을 참조하십시오. Plus 기능 플랜이 있는 경우 `ContextData`를 제출할 수 있습니다. 자세한 내용은 [위협 방지 설정](cognito-user-pool-settings-threat-protection.md#cognito-user-pool-settings-configure-threat-protection) 단원을 참조하십시오.

애플리케이션 서버에서 다음 Amazon Cognito 인증 API 작업을 호출할 때 사용자 디바이스의 IP를 `ContextData` 파라미터에 전달합니다. 또한 서버 이름, 서버 경로 및 인코딩된 디바이스 지문 데이터를 전달합니다.
+ [AdminInitiateAuth ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)
+ [AdminRespondToAuthChallenge ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)

Amazon Cognito에서 인증하지 않은 API 작업을 호출하면 `UserContextData`를 Amazon Cognito 위협 방지에 제출할 수 있습니다. 이 데이터에는 `EncodedData` 파라미터에 디바이스 지문이 포함되어 있습니다. 다음 조건을 충족하는 경우 `UserContextData`에 `IpAddress` 파라미터를 제출할 수도 있습니다.
+ 사용자 풀은 Plus 기능 플랜에 있습니다. 자세한 내용은 [사용자 풀 기능 플랜](cognito-sign-in-feature-plans.md) 단원을 참조하십시오.
+ 앱 클라이언트에 클라이언트 보안 암호가 있습니다. 자세한 내용은 [앱 클라이언트를 사용한 애플리케이션별 설정](user-pool-settings-client-apps.md) 단원을 참조하십시오.
+ 앱 클라이언트에서 **추가 사용자 컨텍스트 데이터 허용(Accept additional user context data)**을 활성화했습니다. 자세한 내용은 [추가 사용자 컨텍스트 데이터 수락(AWS Management Console)](#user-pool-settings-adaptive-authentication-accept-user-context-data) 단원을 참조하십시오.

앱은 다음 Amazon Cognito에서 인증하지 않은 API 작업의 인코딩된 디바이스 지문 데이터와 사용자 디바이스 IP 주소로 `UserContextData` 파라미터를 채울 수 있습니다.
+ [InitiateAuth ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)
+ [RespondToAuthChallenge ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)
+ [SignUp ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html)
+ [ConfirmSignUp ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html)
+ [ForgotPassword ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html)
+ [ConfirmForgotPassword ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html)
+ [ResendConfirmationCode ](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ResendConfirmationCode.html)

### 추가 사용자 컨텍스트 데이터 수락(AWS Management Console)
<a name="user-pool-settings-adaptive-authentication-accept-user-context-data"></a>

**추가 사용자 컨텍스트 데이터 허용(Accept additional user context data)** 기능을 활성화하면 사용자 풀에서 `UserContextData` 파라미터의 IP 주소를 수락합니다. 다음과 같은 경우에는 이 기능을 활성화할 필요가 없습니다.
+ 사용자가 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)와 같은 인증 API 작업으로만 로그인하고, 본인은 `ContextData` 파라미터를 사용합니다.
+ 인증되지 않은 API 작업에서 IP 주소가 아닌 디바이스 지문만 Amazon Cognito 위협 방지로 전송하려고 합니다.

Amazon Cognito 콘솔에서 다음과 같이 앱 클라이언트를 업데이트하여 추가 사용자 컨텍스트 데이터에 대한 지원을 추가합니다.

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에 로그인합니다.

1. 탐색 창에서 **사용자 풀 관리(Manage your User Pools)**를 선택한 다음 편집할 사용자 풀을 선택합니다.

1. **앱 클라이언트** 메뉴를 선택합니다.

1. 앱 클라이언트를 선택하거나 생성합니다. 자세한 내용은 [사용자 풀 앱 클라이언트 구성](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html)을 참조하세요.

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

1. 앱 클라이언트의 **고급 인증 설정(Advanced authentication settings)**에서 **추가 사용자 컨텍스트 데이터 허용(Accept additional user context data)**을 선택합니다.

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

Amazon Cognito API에서 사용자 컨텍스트 데이터를 수락하도록 앱 클라이언트를 구성하려면[CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) 또는 [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) 요청에서 `EnablePropagateAdditionalUserContextData`를 `true`로 설정합니다. 웹 또는 모바일 앱에서 위협 방지 기능을 사용하는 방법에 대한 자세한 내용은 [애플리케이션에서 위협 방지를 위한 데이터 수집](user-pool-settings-viewing-threat-protection-app.md) 섹션을 참조하세요. 앱이 서버에서 Amazon Cognito를 호출하면 클라이언트 측에서 사용자 컨텍스트 데이터를 수집합니다. 다음은 JavaScript SDK 메서드 `getData`를 사용하는 예제입니다.

```
var EncodedData = AmazonCognitoAdvancedSecurityData.getData(username, userPoolId, clientId);
```

앱에서 조정 인증을 사용하도록 설계하는 경우 최신 Amazon Cognito SDK를 앱에 통합하는 것이 좋습니다. SDK의 최신 버전은 디바이스 ID, 모델 및 표준 시간대와 같은 디바이스 지문 정보를 수집합니다. Amazon Cognito SDK에 대한 자세한 내용은 [사용자 풀 SDK 설치](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-sdk-links.html)를 참조하세요. Amazon Cognito 위협 방지는 앱이 올바른 형식으로 제출하는 이벤트에만 위험 점수를 저장하고 할당합니다. Amazon Cognito에서 오류 응답을 반환하는 경우 요청에 유효한 시크릿 해시가 포함되어 있는지, `IPaddress` 파라미터가 유효한 IPv4 또는 IPv6 주소인지 확인합니다.

**`ContextData` 및 `UserContextData` 리소스**
+ AWS Amplify Android용 SDK: [GetUserContextData](https://github.com/aws-amplify/aws-sdk-android/blob/main/aws-android-sdk-cognitoidentityprovider/src/main/java/com/amazonaws/mobileconnectors/cognitoidentityprovider/CognitoUserPool.java#L626)
+ AWS Amplify iOS용 SDK: [userContextData](https://github.com/aws-amplify/aws-sdk-ios/blob/d3cd4fa0086b526f2f5c9c6c58880c9da7004c66/AWSCognitoIdentityProviderASF/AWSCognitoIdentityProviderASF.m#L21)
+ JavaScript: [amazon-cognito-advanced-security-data.min.js](https://amazon-cognito-assets.us-east-1.amazoncognito.com/amazon-cognito-advanced-security-data.min.js)

## 사용자 이벤트 기록 보기 및 내보내기
<a name="user-pool-settings-adaptive-authentication-event-user-history"></a>

Amazon Cognito는 위협 방지를 활성화하면 사용자가 각 인증 이벤트에 대한 로그를 생성합니다. 기본적으로 Amazon Cognito 콘솔의 **사용자** 메뉴 또는 [AdminListUserAuthEvents](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminListUserAuthEvents.html) API 작업에서 사용자 로그를 볼 수 있습니다. 이러한 이벤트를 CloudWatch Logs, Amazon S3 또는 Amazon Data Firehose와 같은 외부 시스템으로 내보낼 수도 있습니다. 내보내기 기능을 사용하면 애플리케이션의 사용자 활동에 대한 보안 정보를 자체 보안 분석 시스템에 더 쉽게 액세스할 수 있습니다.

**Topics**
+ [사용자 이벤트 기록 보기(AWS Management Console)](#user-pool-settings-adaptive-authentication-event-user-history-console)
+ [사용자 이벤트 기록 보기(API/CLI)](#user-pool-settings-adaptive-authentication-event-user-history-api-cli)
+ [사용자 인증 이벤트 내보내기](#user-pool-settings-adaptive-authentication-event-user-history-exporting)

### 사용자 이벤트 기록 보기(AWS Management Console)
<a name="user-pool-settings-adaptive-authentication-event-user-history-console"></a>

사용자의 로그인 기록을 보려면 Amazon Cognito 콘솔의 **사용자** 메뉴에서 사용자를 선택합니다. Amazon Cognito는 사용자 이벤트 기록을 2년 동안 보관합니다.

![\[사용자 이벤트 기록\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/cup-advanced-security-event-history.png)


각 로그인 이벤트에는 이벤트 ID가 있습니다. 이벤트에는 위치, 디바이스 세부 정보 및 위험 탐지 결과와 같은 해당 컨텍스트 데이터도 있습니다.

이벤트 ID를 이벤트를 기록한 시점에 Amazon Cognito가 발행한 토큰과 연관시킬 수도 있습니다. ID 및 액세스 토큰은 페이로드에 이 이벤트 ID를 포함합니다. Amazon Cognito는 새로 고침 토큰 사용을 원래 이벤트 ID와 연관시킵니다. 원래 이벤트 ID를 Amazon Cognito 토큰을 발급한 로그인 이벤트의 이벤트 ID로 다시 추적할 수 있습니다. 시스템 내에서 특정 인증 이벤트에 대한 토큰 사용을 추적할 수 있습니다. 자세한 내용은 [사용자 풀 JSON 웹 토큰(JWT) 이해](amazon-cognito-user-pools-using-tokens-with-identity-providers.md) 단원을 참조하십시오.

### 사용자 이벤트 기록 보기(API/CLI)
<a name="user-pool-settings-adaptive-authentication-event-user-history-api-cli"></a>

Amazon Cognito API 작업 [AdminListUserAuthEvents](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminListUserAuthEvents.html) 또는 [admin-list-user-auth-events](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-list-user-auth-events.html)가 있는 AWS Command Line Interface (AWS CLI)를 사용하여 사용자 이벤트 기록을 쿼리할 수 있습니다.

------
#### [ AdminListUserAuthEvents request ]

`AdminListUserAuthEvents`에 대한 다음 요청 본문은 한 사용자에 대한 최신 활동 로그를 반환합니다.

```
{
  "UserPoolId": "us-west-2_EXAMPLE", 
  "Username": "myexampleuser", 
  "MaxResults": 1
}
```

------
#### [ admin-list-user-auth-events request ]

`admin-list-user-auth-events`에 대한 다음 요청은 한 사용자에 대한 최신 활동 로그를 반환합니다.

```
aws cognito-idp admin-list-user-auth-events --max-results 1 --username myexampleuser --user-pool-id us-west-2_EXAMPLE
```

------
#### [ Response ]

Amazon Cognito는 두 요청에 동일한 JSON 응답 본문을 반환합니다. 다음은 위험 요소를 포함하지 않은 관리형 로그인 이벤트에 대한 예시 응답입니다.

```
{
    "AuthEvents": [
        {
            "EventId": "[event ID]",
            "EventType": "SignIn",
            "CreationDate": "[Timestamp]",
            "EventResponse": "Pass",
            "EventRisk": {
                "RiskDecision": "NoRisk",
                "CompromisedCredentialsDetected": false
            },
            "ChallengeResponses": [
                {
                    "ChallengeName": "Password",
                    "ChallengeResponse": "Success"
                }
            ],
            "EventContextData": {
                "IpAddress": "192.168.2.1",
                "DeviceName": "Chrome 125, Windows 10",
                "Timezone": "-07:00",
                "City": "Bellevue",
                "Country": "United States"
            }
        }
    ],
    "NextToken": "[event ID]#[Timestamp]"
}
```

------

### 사용자 인증 이벤트 내보내기
<a name="user-pool-settings-adaptive-authentication-event-user-history-exporting"></a>

위협 방지에서 외부 시스템으로 사용자 이벤트를 내보내도록 사용자 풀을 구성합니다. 지원되는 외부 시스템인 Amazon S3, CloudWatch Logs 및 Amazon Data Firehose는 전송하거나 검색하는 데이터에 대한 비용을 AWS 청구서에 추가할 수 있습니다. 자세한 내용은 [위협 방지 사용자 활동 로그 내보내기](exporting-quotas-and-usage.md#exporting-quotas-and-usage-user-activity) 단원을 참조하십시오.

------
#### [ AWS Management Console ]

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에 로그인합니다.

1. [**사용자 풀(User Pools)**]을 선택합니다.

1. 목록에서 기존 사용자 풀을 선택하거나 [사용자 풀을 생성합니다](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html).

1. **로그 스트리밍** 메뉴를 선택합니다. **편집**을 선택합니다.

1. **로깅 상태**에서 **사용자 활동 로그 내보내기 활성화** 옆의 확인란을 선택합니다.

1. **로깅 대상**에서 로그를 처리할 AWS 서비스 (**CloudWatch 로그 그룹**, **Amazon Data Firehose 스트림** 또는 **S3 버킷**)를 선택합니다.

1. 선택하면 리소스 선택기가 해당 리소스 유형으로 채워집니다. 목록에서 로그 그룹, 스트림 또는 버킷을 선택합니다. **생성** 버튼을 선택하여 선택한 서비스의 AWS Management Console 로 이동하고 새 리소스를 생성할 수도 있습니다.

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

------
#### [ API ]

사용자 활동 로그의 대상 유형 하나를 선택합니다.

다음은 Firehose 스트림을 로그 대상으로 설정하는 `SetLogDeliveryConfiguration` 요청 본문의 예입니다.

```
{
   "LogConfigurations": [
      {
         "EventSource": "userAuthEvents",
         "FirehoseConfiguration": {
            "StreamArn": "arn:aws:firehose:us-west-2:123456789012:deliverystream/example-user-pool-activity-exported"
         },
         "LogLevel": "INFO"
      }
   ],
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

다음은 Amazon S3 버킷을 로그 대상으로 설정하는 `SetLogDeliveryConfiguration` 요청 본문의 예입니다.

```
{
   "LogConfigurations": [
      {
         "EventSource": "userAuthEvents",
         "S3Configuration": { 
            "BucketArn": "arn:aws:s3:::amzn-s3-demo-logging-bucket"
         },
         "LogLevel": "INFO"
      }
   ],
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

다음은 CloudWatch 로그 그룹을 로그 대상으로 설정하는 `SetLogDeliveryConfiguration` 요청 본문의 예입니다.

```
{
   "LogConfigurations": [
      {
         "EventSource": "userAuthEvents",
         "CloudWatchLogsConfiguration": { 
            "LogGroupArn": "arn:aws:logs:us-west-2:123456789012:log-group:DOC-EXAMPLE-LOG-GROUP"
         },
         "LogLevel": "INFO"
      }
   ],
   "UserPoolId": "us-west-2_EXAMPLE"
}
```

------

## 이벤트 피드백 제공
<a name="user-pool-settings-adaptive-authentication-feedback"></a>

이벤트 피드백은 실시간으로 위험 평가에 영향을 미치고 시간이 지남에 따라 위험 평가 알고리즘을 개선합니다. 또한 Amazon Cognito 콘솔 및 API 작업을 통해 로그인 시도의 유효성에 대한 피드백을 제공할 수 있습니다.

**참고**  
이벤트 피드백은 Amazon Cognito가 동일한 특성을 가진 후속 사용자 세션에 할당하는 위험 수준에 영향을 미칩니다.

Amazon Cognito 콘솔의 **사용자** 메뉴에서 사용자를 선택하고 **이벤트 피드백 제공**을 선택합니다. 이벤트 세부 정보를 검토하고 **Set as valid**(유효한 것으로 설정) 또는 **Set as invalid**(잘못된 것으로 설정)를 선택할 수 있습니다.

콘솔은 **사용자** 메뉴의 사용자 세부 정보에 로그인 기록을 나열합니다. 항목을 선택한 경우 이벤트를 유효하거나 유효하지 않음으로 표시할 수 있습니다. 사용자 풀 API 작업 [AdminUpdateAuthEventFeedback](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateAuthEventFeedback.html)과 AWS CLI 명령 [admin-update-auth-event-feedback](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-update-auth-event-feedback.html)을 통해 피드백을 제공할 수도 있습니다.

Amazon Cognito 콘솔에서 **Set as valid**(유효한 것으로 설정)를 선택하거나 API에서 `valid` `FeedbackValue` 값을 제공하면 Amazon Cognito가 일정 수준의 위험을 평가한 사용자 세션을 신뢰한다고 Amazon Cognito에 알리는 것입니다. Amazon Cognito 콘솔에서 **Set as invalid**(잘못된 것으로 설정)를 선택하거나 API에서 `invalid` `FeedbackValue` 값을 제공하면 사용자 세션을 신뢰하지 않거나 Amazon Cognito가 충분히 높은 수준의 위험을 평가했다고 믿지 않는다고 Amazon Cognito에 알리는 것입니다.

## 알림 메시지 전송
<a name="user-pool-settings-adaptive-authentication-messages"></a>

위협 방지를 통해 Amazon Cognito는 사용자에게 위험한 로그인 시도를 알릴 수 있습니다. 또한 Amazon Cognito는 사용자에게 로그인이 유효한지 여부를 나타내는 링크를 선택하라는 메시지를 표시할 수 있습니다. Amazon Cognito는 이 피드백을 사용하여 사용자 풀의 위험 탐지 정확도를 개선합니다.

**참고**  
Amazon Cognito는 작업이 로그인 차단, 로그인 허용, MFA를 선택 사항으로 설정 또는 MFA 요구와 같은 자동 위험 응답을 생성하는 경우에만 사용자에게 알림 메시지를 보냅니다. 일부 요청에는 위험 수준이 할당될 수 있지만 적응형 인증 자동 위험 응답을 생성하지 않습니다. 이 경우 사용자 풀은 알림을 보내지 않습니다. 예를 들어 잘못된 암호는 위험 등급과 함께 로깅될 수 있지만 Amazon Cognito의 응답은 적응형 인증 규칙을 적용하지 않고 로그인에 실패하는 것입니다.

**Automatic risk response**(자동 위험 대응) 섹션에서 낮음, 중간 또는 높은 위험 사례에 대해 **Notify Users**(사용자 알림)를 선택합니다.

![\[사용자 알림\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/cup-adaptive-auth.png)


Amazon Cognito는 이메일 주소 확인 여부와 관계없이 사용자에게 이메일 알림을 보냅니다.

알림 이메일 메시지를 사용자 지정하고, 이러한 메시지의 일반 텍스트 버전과 HTML 버전을 모두 제공할 수 있습니다. 이메일 알림을 사용자 지정하려면 위협 방지 구성의 **적응형 인증 메시지**에서 **이메일 템플릿**을 엽니다. 이메일 템플릿에 대한 자세한 내용은 [메시지 템플릿](cognito-user-pool-settings-message-customizations.md#cognito-user-pool-settings-message-templates) 섹션을 참조하세요.

# 애플리케이션에서 위협 방지를 위한 데이터 수집
<a name="user-pool-settings-viewing-threat-protection-app"></a>

Amazon Cognito [적응형 인증](cognito-user-pool-settings-adaptive-authentication.md)은 사용자의 로그인 시도에 대한 컨텍스트 세부 정보에서 시도된 계정 탈취에 대한 위험 수준을 평가합니다. Amazon Cognito 위협 방지가 위험을 보다 정확하게 평가할 수 있도록 애플리케이션은 API 요청에 *컨텍스트 데이터*를 추가해야 합니다. 컨텍스트 데이터는 IP 주소, 브라우저 에이전트, 디바이스 정보 및 요청 헤더와 같은 정보로, 사용자가 사용자 풀에 연결된 방식에 대한 컨텍스트 정보를 제공합니다.

Amazon Cognito에 이 컨텍스트를 제출하는 애플리케이션의 핵심 책임은 사용자 풀에 대한 인증 요청의 `EncodedData` 파라미터입니다. 요청에 이 데이터를 추가하려면 이 정보를 자동으로 생성하는 SDK를 사용하여 Amazon Cognito를 구현하거나 이 데이터를 수집하는 JavaScript, iOS 또는 Android용 모듈을 구현할 수 있습니다. Amazon Cognito에 직접 요청하는 *클라이언트 전용* 애플리케이션은 AWS Amplify SDKs 구현해야 합니다. 중간 서버 또는 API 구성 요소가 있는 *클라이언트 서버* 애플리케이션은 별도의 SDK 모듈을 구현해야 합니다.

다음 시나리오에서 인증 프런트 엔드는 추가 구성 없이 사용자 컨텍스트 데이터 수집을 관리합니다.
+ 관리형 로그인은 컨텍스트 데이터를 자동으로 수집하여 위협 방지에 제출합니다.
+ 모든 AWS Amplify 라이브러리에는 인증 방법에 컨텍스트 데이터 컬렉션이 내장되어 있습니다.

## Amplify를 사용하여 클라이언트 전용 애플리케이션에서 사용자 컨텍스트 데이터 제출
<a name="user-pool-settings-viewing-threat-protection-app-amplify"></a>

![\[Amplify 애플리케이션의 위협 방지를 위한 데이터 수집 개요입니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/user-pools-asf-amplify-data-collection.png)


Amplify SDK는 Amazon Cognito로 직접 인증하는 모바일 클라이언트를 지원합니다. 이러한 유형의 클라이언트는 Amazon Cognito 퍼블릭 API 작업에 직접 API를 요청합니다. Amplify 클라이언트는 기본적으로 위협 방지를 위해 컨텍스트 데이터를 자동으로 수집합니다.

JavaScript를 사용한 Amplify 애플리케이션은 예외입니다. 사용자 컨텍스트 데이터를 수집하는 [JavaScript 모듈](#user-pool-settings-viewing-threat-protection-app-additional-resources-js)을 추가해야 합니다.

일반적으로 이 구성의 애플리케이션은 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 및 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)와 같은 인증되지 않은 API 작업을 사용합니다. [UserContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserContextDataType.html) 개체는 이러한 작업에 대한 위험을 보다 정확하게 평가하는 데 도움이 됩니다. Amplify SDK는 디바이스 및 세션 정보를 `UserContextData`의 `EncodedData` 파라미터에 추가합니다.

## 클라이언트-서버 애플리케이션에서 컨텍스트 데이터 수집
<a name="user-pool-settings-viewing-threat-protection-app-server-side"></a>

일부 애플리케이션에는 사용자 인증 데이터를 수집하는 프런트 엔드 계층과 Amazon Cognito에 인증 요청을 제출하는 애플리케이션 백 엔드 계층이 있습니다. 이는 마이크로서비스가 지원하는 웹서버 및 애플리케이션의 일반적인 아키텍처입니다. 이러한 애플리케이션에서는 퍼블릭 컨텍스트 데이터 수집 라이브러리를 가져와야 합니다.

![\[JavaScript의 위협 방지 컨텍스트 데이터를 사용한 서버 측 인증 개요입니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/user-pools-asf-non-amplify-data-collection.png)


일반적으로 이 구성의 애플리케이션 서버는 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 및 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)와 같은 인증된 API 작업을 사용합니다. [ContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-ContextData) 개체는 Amazon Cognito가 이러한 작업에 대한 위험을 보다 정확하게 평가하는 데 도움이 됩니다. `ContextData`의 내용은 프런트 엔드가 서버에 전달한 인코딩된 데이터와 서버에 대한 사용자의 HTTP 요청에서 추가 세부 정보입니다. HTTP 헤더 및 IP 주소와 같은 이러한 추가 컨텍스트 세부 정보는 애플리케이션 서버에 사용자 환경의 특성을 제공합니다.

애플리케이션 서버는 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 및 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)와 같은 인증되지 않은 API 작업으로 로그인할 수도 있습니다. [UserContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-UserContextData) 객체는 이러한 작업에서 위협 방지 위험 분석을 알립니다. 사용 가능한 퍼블릭 컨텍스트 데이터 수집 라이브러리의 작업은 인증 요청의 `EncodedData` 파라미터에 보안 정보를 추가합니다. 또한 추가 컨텍스트 데이터를 허용하도록 사용자 풀을 구성하고 사용자의 소스 IP를 `UserContextData`의 `IpAddress` 파라미터에 추가합니다.

**클라이언트-서버 애플리케이션에 컨텍스트 데이터를 추가하는 방법**

1. 프런트엔드 애플리케이션에서 [iOS, Android 또는 JavaScript 모듈](#user-pool-settings-viewing-threat-protection-app-additional-resources)을 사용하여 클라이언트에서 인코딩된 컨텍스트 데이터를 수집합니다.

1. 인코딩된 데이터와 인증 요청의 세부 정보를 애플리케이션 서버에 전달합니다.

1. 애플리케이션 서버에서 HTTP 요청에서 사용자의 IP 주소, 관련 HTTP 헤더, 요청된 서버 이름 및 요청된 경로를 추출합니다. Amazon Cognito에 대한 API 요청의 [ContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-ContextData) 파라미터에 이러한 값을 채웁니다.

1. API 요청에서 `ContextData`의 `EncodedData` 파라미터를 SDK 모듈이 수집한 인코딩된 디바이스 데이터로 채웁니다. 이 컨텍스트 데이터를 인증 요청에 추가합니다.

## 클라이언트-서버 애플리케이션을 위한 컨텍스트 데이터 라이브러리
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources"></a>

### JavaScript
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-js"></a>

`amazon-cognito-advanced-security-data.min.js` 모듈은 애플리케이션 서버에 전달할 수 있는 `EncodedData`를 수집합니다.

JavaScript 구성에 `amazon-cognito-advanced-security-data.min.js` 모듈을 추가합니다. 를 , `us-east-1`, `us-east-2`, `us-west-2`, `eu-west-2`또는 AWS 리전 목록에서 `eu-west-1``<region>`로 바꿉니다`eu-central-1`.

```
<script src="https://amazon-cognito-assets.<region>.amazoncognito.com/amazon-cognito-advanced-security-data.min.js"></script>
```

`EncodedData` 파라미터에서 사용할 수 있는 `encodedContextData` 개체를 생성하려면 JavaScript 애플리케이션 소스에 다음을 추가합니다.

```
var encodedContextData = AmazonCognitoAdvancedSecurityData.getData(_username, _userpoolId, _userPoolClientId);
```

### iOS/Swift
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-ios"></a>

컨텍스트 데이터를 생성하기 위해 iOS 애플리케이션은 [Mobile SDK for iOS](https://github.com/aws-amplify/aws-sdk-ios/tree/main) 모듈 [AWSCognitoIdentityProviderASF](https://github.com/aws-amplify/aws-sdk-ios/tree/main/AWSCognitoIdentityProviderASF)를 통합할 수 있습니다.

위협 방지를 위해 인코딩된 컨텍스트 데이터를 수집하려면 애플리케이션에 다음 조각을 추가합니다.

```
import AWSCognitoIdentityProviderASF

let deviceId = getDeviceId()
let encodedContextData = AWSCognitoIdentityProviderASF.userContextData(
                            userPoolId, 
                            username: username, 
                            deviceId: deviceId, 
                            userPoolClientId: userPoolClientId)
                                
/**
 * Reuse DeviceId from keychain or generate one for the first time.
 */
func getDeviceId() -> String {
    let deviceIdKey = getKeyChainKey(namespace: userPoolId, key: "AWSCognitoAuthAsfDeviceId")
    
   if let existingDeviceId = self.keychain.string(forKey: deviceIdKey) {
        return existingDeviceId
    }

    let newDeviceId = UUID().uuidString
    self.keychain.setString(newDeviceId, forKey: deviceIdKey)
    return newDeviceId
}

/**
 * Get a namespaced keychain key given a namespace and key
 */    
func getKeyChainKey(namespace: String, key: String) -> String {
    return "\(namespace).\(key)"
}
```

### Android
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-android"></a>

컨텍스트 데이터를 생성하기 위해 Android 애플리케이션은 [Mobile SDK for Android](https://github.com/aws-amplify/aws-sdk-android/tree/main) 모듈 [aws-android-sdk-cognitoidentityprovider-asf](https://github.com/aws-amplify/aws-sdk-android/tree/main/aws-android-sdk-cognitoidentityprovider-asf)를 통합할 수 있습니다.

위협 방지를 위해 인코딩된 컨텍스트 데이터를 수집하려면 애플리케이션에 다음 조각을 추가합니다.

```
UserContextDataProvider provider = UserContextDataProvider.getInstance();
// context here is android application context.
String encodedContextData = provider.getEncodedContextData(context, username, userPoolId, userPoolClientId);
```

# AWS WAF 웹 ACL을 사용자 풀과 연결
<a name="user-pool-waf"></a>

AWS WAF 는 웹 애플리케이션 방화벽입니다. AWS WAF 웹 ACL(웹 액세스 제어 목록)을 사용하면 클래식 호스팅 UI, 관리형 로그인 및 Amazon Cognito API 서비스 엔드포인트에 대한 원치 않는 요청으로부터 사용자 풀을 보호할 수 있습니다. 웹 ACL을 사용하면 사용자 풀이 응답하는 모든 HTTPS 웹 요청을 세부적으로 제어할 수 있습니다. AWS WAF 웹 ACL에 대한 자세한 내용은 *AWS WAF 개발자 안내서*의 [웹 액세스 제어 목록(웹 ACL) 관리 및 사용](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl.html)을 참조하세요.

사용자 풀과 연결된 AWS WAF 웹 ACL이 있는 경우 Amazon Cognito는 선택한 비기밀 헤더 및 사용자의 요청 내용을에 전달합니다 AWS WAF.는 요청 내용을 AWS WAF 검사하고 웹 ACL에 지정한 규칙과 비교하여 Amazon Cognito에 응답을 반환합니다.

## AWS WAF 웹 ACLs 및 Amazon Cognito에 대해 알아야 할 사항
<a name="user-pool-waf-things-to-know"></a>
+ 사용자 이름, 암호, 전화번호 또는 이메일 주소와 같은 사용자 풀 요청의 개인 식별 정보(PII)와 일치하도록 웹 ACL 규칙을 구성할 수 없습니다. 이 데이터는 사용할 수 없습니다 AWS WAF. 대신 IP 주소, 브라우저 에이전트 및 요청된 API 작업과 같은 헤더, 경로 및 본문의 세션 데이터와 일치하도록 웹 ACL 규칙을 구성합니다.
+ 웹 ACL 규칙 조건은 사용자의 **첫 번째** 요청에 대한 사용자 지정 블록 응답만 사용자 대화형 관리형 로그인 페이지에 반환할 수 있습니다. 후속 연결이 사용자 지정 블록 응답 조건과 일치하면 사용자 지정 상태 코드, 헤더 및 리디렉션 응답이 반환되지만 기본 블록 메시지가 반환됩니다.
+ 에서 차단한 요청은 모든 요청 유형에 대한 요청 속도 할당량에 포함되지 AWS WAF 않습니다. AWS WAF 핸들러는 API 수준 제한 핸들러보다 먼저 호출됩니다.
+ 웹 ACL을 생성할 때 웹 ACL이 완전히 전파되어 Amazon Cognito에서 사용할 수 있게 되기까지 약간의 시간이 걸립니다. 전파 시간은 몇 초에서 몇 분 사이일 수 있습니다. 웹 ACL이 완전히 전파되기 전에 연결을 시도[https://docs.aws.amazon.com/waf/latest/APIReference/API_AssociateWebACL.html#API_AssociateWebACL_Errors](https://docs.aws.amazon.com/waf/latest/APIReference/API_AssociateWebACL.html#API_AssociateWebACL_Errors)하면가를 AWS WAF 반환합니다.
+ 각 사용자 풀에 하나의 웹 ACL을 연결할 수 있습니다.
+ 요청으로 인해 AWS WAF 가 검사할 수 있는 한계보다 더 큰 페이로드가 발생할 수 있습니다. 가 Amazon Cognito의 [과대 요청을 처리하는 방법을 구성하는 방법은 개발자 안내서의 과대 요청 구성 요소 처리를](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-oversize-handling.html) 참조하세요. *AWS WAF * AWS WAF 
+  AWS WAF [Fraud Control 계정 탈취 방지(ATP)](https://docs.aws.amazon.com/waf/latest/developerguide/waf-atp.html)를 사용하는 웹 ACL을 Amazon Cognito 사용자 풀과 연결할 수 없습니다. ATP 기능은 `AWS-AWSManagedRulesATPRuleSet` 관리형 규칙 그룹에 있습니다. 웹 ACL을 사용자 풀과 연결하기 전에 해당 관리형 규칙 그룹을 사용하지 않는지 확인합니다.
+ 사용자 풀과 연결된 AWS WAF 웹 ACL이 있고 웹 ACL의 규칙에 CAPTCHA가 표시되는 경우 관리형 로그인 TOTP 등록에서 복구할 수 없는 오류가 발생할 수 있습니다. CAPTCHA 작업이 있고 관리형 로그인 TOTP에 영향을 주지 않는 규칙을 생성하려면 [관리형 로그인 TOTP MFA를 위한 AWS WAF 웹 ACL 구성](user-pool-settings-mfa-totp.md#totp-waf) 섹션을 참조하세요.

AWS WAF 는 다음 엔드포인트에 대한 요청을 검사합니다.

**관리형 로그인 및 클래식 호스팅 UI**  
[사용자 풀 엔드포인트 및 관리형 로그인 참조](cognito-userpools-server-contract-reference.md)의 모든 엔드포인트에 대한 요청입니다.

**퍼블릭 API 작업**  
 AWS 자격 증명을 사용하여 권한을 부여하지 않는 앱의 Amazon Cognito API에 대한 요청입니다. 여기에는 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html), [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) 및 [GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html)와 같은 API 작업이 포함됩니다. 범위가 인 API 작업은 AWS 자격 증명으로 인증 AWS WAF 할 필요가 없습니다. 인증되지 않았거나 세션 문자열 또는 액세스 토큰으로 권한이 부여되었습니다. 자세한 내용은 [권한 부여 모델별로 그룹화된 API 작업 목록](authentication-flows-public-server-side.md#user-pool-apis-auth-unauth) 단원을 참조하십시오.

**Count**(개수), **Allow**(허용), **Block**(차단) 또는 규칙과 일치하는 요청에 대한 응답으로 **CAPTCHA**를 표시하는 규칙 작업을 사용하여 웹 ACL에서 규칙을 구성할 수 있습니다. 자세한 내용은 *AWS WAF 개발자 안내서*의 [AWS WAF 규칙](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rules.html)을 참조하세요. 규칙 작업에 따라 Amazon Cognito가 사용자에게 반환하는 응답을 사용자 지정할 수 있습니다.

**중요**  
오류 응답을 사용자 지정하는 옵션은 API 요청을 수행하는 방식에 따라 달라집니다.  
관리형 로그인 요청의 오류 코드와 응답 본문을 사용자 지정할 수 있습니다. 관리형 로그인에서는 사용자가 해결할 수 있는 CAPTCHA만 제시할 수 있습니다.
Amazon Cognito[ 사용자 풀 API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html)로 요청하는 경우 **차단** 응답을 수신하는 요청의 응답 본문을 사용자 지정할 수 있습니다. 400\$1499 범위의 사용자 지정 오류 코드를 지정할 수도 있습니다.
 AWS Command Line Interface (AWS CLI) 및 AWS SDKs 반환합니다. `ForbiddenException` **** **** 

## 웹 ACL을 사용자 풀과 연결
<a name="user-pool-waf-setting-up"></a>

사용자 풀에서 웹 ACL을 사용하려면 AWS Identity and Access Management (IAM) 보안 주체에 다음과 같은 Amazon Cognito 및 AWS WAF 권한이 있어야 합니다. AWS WAF 권한에 대한 자세한 내용은 *AWS WAF 개발자 안내서*의 [AWS WAF API 권한을](https://docs.aws.amazon.com/waf/latest/developerguide/waf-api-permissions-ref.html) 참조하세요.

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

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Sid": "AllowWebACLUserPool",
			"Effect": "Allow",
			"Action": [
				"cognito-idp:ListResourcesForWebACL",
				"cognito-idp:GetWebACLForResource",
				"cognito-idp:AssociateWebACL"
			],
			"Resource": [
				"arn:aws:cognito-idp:*:123456789012:userpool/*"
			]
		},
		{
			"Sid": "AllowWebACLUserPoolWAFv2",
			"Effect": "Allow",
			"Action": [
				"wafv2:ListResourcesForWebACL",
				"wafv2:AssociateWebACL",
				"wafv2:DisassociateWebACL",
				"wafv2:GetWebACLForResource"
			],
			"Resource": "arn:aws:wafv2:*:123456789012:*/webacl/*/*"
		},
		{
			"Sid": "DisassociateWebACL1",
			"Effect": "Allow",
			"Action": "wafv2:DisassociateWebACL",
			"Resource": "*"
		},
		{
			"Sid": "DisassociateWebACL2",
			"Effect": "Allow",
			"Action": [
				"cognito-idp:DisassociateWebACL"
			],
			"Resource": [
				"arn:aws:cognito-idp:*:123456789012:userpool/*"
			]
		}
	]
}
```

------

IAM 권한을 부여해야 하지만 나열된 작업은 권한 전용이며 [API 작업](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html)에 해당하지 않습니다.

**사용자 풀 AWS WAF 에 대해를 활성화하고 웹 ACL을 연결하려면**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)에 로그인합니다.

1. 탐색 창에서 [**사용자 풀(User Pools)**]을 선택한 다음 편집할 사용자 풀을 선택합니다.

1. **보안** 섹션에서 **AWS WAF** 탭을 선택합니다.

1. **편집**을 선택합니다.

1. **사용자 풀 AWS WAF 과 함께 사용을** 선택합니다.  
![\[사용자 풀과 AWS WAF 함께 사용을 선택한 AWS WAF 대화 상자의 스크린샷입니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/cup-WAF-console.png)

1. 이미 생성한 **AWS WAF 웹 ACL**을 선택하거나 **에서 웹 ACL 생성을 선택하여의 새 세션에 웹 ACL AWS WAF**을 생성합니다 AWS Management Console. AWS WAF 

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

웹 ACL을 AWS Command Line Interface 또는 SDK의 사용자 풀과 프로그래밍 방식으로 연결하려면 AWS WAF API의 [AssociateWebACL](https://docs.aws.amazon.com/waf/latest/APIReference/API_AssociateWebACL.html)을 사용합니다. Amazon Cognito에는 웹 ACL을 연결하는 별도의 API 작업이 없습니다.

## AWS WAF 웹 ACLs 테스트 및 로깅
<a name="user-pool-waf-evaluating-and-logging"></a>

웹 ACL에서 규칙 작업을 **개수**로 설정하면가 규칙과 일치하는 요청 수에 요청을 AWS WAF 추가합니다. 사용자 풀로 웹 ACL을 테스트하려면 규칙 작업을 **Count**(개수)로 설정하고 각 규칙과 일치하는 요청 볼륨을 고려합니다. 예를 들어 **Block**(차단) 작업으로 설정하려는 규칙이 일반 사용자 트래픽으로 판단되는 많은 수의 요청과 일치하는 경우 규칙을 재구성해야 할 수 있습니다. 자세한 내용은 *AWS WAF 개발자 안내서*의 [AWS WAF 보호 기능 테스트 및 조정](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-testing.html)을 참조하세요.

Amazon CloudWatch Logs 로그 그룹, Amazon Simple Storage Service(Amazon S3) 버킷 또는 Amazon Data Firehose에 요청 헤더를 로깅 AWS WAF 하도록를 구성할 수도 있습니다. `x-amzn-cognito-client-id` 및 `x-amzn-cognito-operation-name`을 통해 사용자 풀 API로 수행한 Amazon Cognito 요청을 식별할 수 있습니다. 관리형 로그인 요청에는 `x-amzn-cognito-client-id` 헤더만 포함됩니다. 자세한 내용은 *AWS WAF 개발자 안내서*의 [웹 ACL 트래픽 로깅](https://docs.aws.amazon.com/waf/latest/developerguide/logging.html)을 참조하세요.

AWS WAF 웹 ACLs은 모든 사용자 풀 [기능 플랜](cognito-sign-in-feature-plans.md)에서 사용할 수 있습니다. AWS WAF 의 보안 기능은 Amazon Cognito 위협 방지를 보완합니다. 사용자 풀에서 두 기능을 모두 활성화할 수 있습니다. AWS WAF 는 사용자 풀 요청 검사에 대해 별도로 요금을 청구합니다. 자세한 내용은 [AWS WAF 요금](https://aws.amazon.com/waf/pricing)을 참조하세요.

로깅 AWS WAF 요청 데이터에는 로그를 대상으로 하는 서비스의 추가 요금이 부과됩니다. 자세한 내용은 *AWS WAF 개발자 안내서*의 [웹 ACL 트래픽 정보 로깅 요금](https://docs.aws.amazon.com/waf/latest/developerguide/logging.html#logging-pricing)을 참조하세요.

# 사용자 풀 대/소문자 구분
<a name="user-pool-case-sensitivity"></a>

에서 생성하는 Amazon Cognito 사용자 풀 AWS Management Console 은 기본적으로 대/소문자를 구분하지 않습니다. 사용자 풀이 대/소문자를 구분하지 않는 경우 *user@example.com*과 *User@example.com*은 동일한 사용자를 지칭합니다. 사용자 풀의 사용자 이름이 대/소문자를 구분하지 않는 경우 `preferred_username` 및 `email` 속성도 대/소문자를 구분하지 않습니다.

대소문자 구분은 속성 입력뿐만 아니라 출력에도 적용됩니다. 대소문자를 구분하지 않는 사용자 풀의 대소문자가 혼합된 속성 값은 사용자 풀 텍스트 출력에서 ​​소문자로 변환됩니다. 사용자 풀 텍스트 출력의 예로는 [userInfo](userinfo-endpoint.md) 응답, [GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html) 출력과 같은 사용자 쿼리 응답, [Lambda 트리거](cognito-user-pools-working-with-lambda-triggers.md)에 대한 입력 이벤트가 있습니다.

사용자 풀 대/소문자 구분 설정을 고려하여 앱 코드에서 대체 사용자 속성을 기반으로 사용자를 식별합니다. 사용자 이름, 기본 설정 사용자 이름 또는 이메일 주소 속성의 대/소문자는 사용자 프로필마다 다를 수 있으므로 `sub` 속성을 참조하세요. 사용자 풀에 변경 불가능한 사용자 지정 속성을 생성하고 각 새 사용자 프로필의 속성에 고유한 식별자 값을 할당할 수도 있습니다. 사용자를 처음 생성할 때 생성된 변경 불가능한 사용자 지정 속성에 값을 쓸 수 있습니다.

**참고**  
사용자 풀의 대/소문자 구분 설정에 관계없이 Amazon Cognito에서는 SAML 자격 증명 공급자(IdP)의 페더레이션 사용자가 고유하고 대/소문자를 구분하는 `NameId` 또는 `sub` 클레임을 전달해야 합니다. 고유 식별자 대/소문자 구분 및 SAML IdP에 대한 자세한 내용은 [SP 시작 SAML 로그인 구현](cognito-user-pools-SAML-session-initiation.md#cognito-user-pools-saml-idp-authentication) 섹션을 참조하세요.

대/소문자를 구분하는 사용자 풀 생성  
[CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html)과 같은 API 작업 및 AWS Command Line Interface (AWS CLI)를 사용하여 리소스를 생성하는 경우 부울 `CaseSensitive` 파라미터를 로 설정해야 합니다`false`. 이 설정은 대/소문자를 구분하지 않는 사용자 풀을 생성합니다. 값을 지정하지 않으면 `CaseSensitive`가 `true`를 기본값으로 사용합니다. Amazon Cognito 콘솔에서 생성하는 사용자 풀은 대/소문자를 구분하지 않습니다. 대/소문자를 구분하는 사용자 풀을 생성하려면 `CreateUserPool` 작업을 사용해야 합니다. 2020년 2월 12일 이전에는 플랫폼과 관계없이 사용자 풀이 기본적으로 대/소문자를 구분하도록 설정되었습니다.  
 AWS Management Console 의 **로그인** 메뉴와 [DescribeUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserPoolType.html#CognitoUserPools-Type-UserPoolType-UsernameConfiguration)의 `UsernameConfiguration` 속성에서 계정의 각 사용자 풀에 대한 대소문자 구분 설정을 검토할 수 있습니다.

새 사용자 풀로 마이그레이션  
사용자 프로필 간에 충돌이 발생할 수 있으므로 Amazon Cognito 사용자 풀을 대/소문자 구분에서 대/소문자 구분 안 함으로 변경할 수 없습니다. 대신 사용자를 새 사용자 풀로 마이그레이션할 수 있습니다. 대/소문자 관련 충돌을 해결하려면 마이그레이션 코드를 작성해야 합니다. 이 코드는 충돌이 감지될 때 고유한 새 사용자를 반환하거나 로그인 시도를 거부해야 합니다. 대/소문자를 구분하지 않는 새 사용자 풀에서 [사용자 마이그레이션 Lambda 트리거](user-pool-lambda-migrate-user.md)를 할당합니다. AWS Lambda 함수는 대/소문자를 구분하지 않는 새 사용자 풀에서 사용자를 생성할 수 있습니다. 사용자가 대/소문자를 구분하지 않는 사용자 풀로 로그인에 실패하면 Lambda 함수가 대/소문자를 구분하는 사용자 풀에서 사용자를 찾아서 복제합니다. [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) 이벤트에 대해 사용자 마이그레이션 Lambda 트리거를 활성화할 수도 있습니다. Amazon Cognito는 로그인 또는 암호 복구 작업의 사용자 정보 및 이벤트 메타데이터를 Lambda 함수로 전달합니다. 함수가 대/소문자를 구분하지 않는 사용자 풀에서 새 사용자를 생성할 때 이벤트 데이터를 사용하여 사용자 이름과 이메일 주소 간의 충돌을 관리할 수 있습니다. 이러한 충돌은 대/소문자를 구분하는 사용자 풀에서는 고유하지만 대/소문자를 구분하지 않는 사용자 풀에서는 동일한 사용자 이름과 이메일 주소 간에 발생합니다.  
Amazon Cognito 사용자 풀 간에 사용자 Lambda 마이그레이션 트리거를 사용하는 방법에 대한 자세한 내용은 AWS 블로그의 [사용자에서 Amazon Cognito 사용자 풀로 마이그레이션](https://aws.amazon.com/blogs/mobile/migrating-users-to-amazon-cognito-user-pools/)을 참조하세요.

# 사용자 풀 삭제 방지
<a name="user-pool-settings-deletion-protection"></a>

관리자가 실수로 사용자 풀을 삭제하지 않도록 하려면 삭제 방지를 활성화합니다. 삭제 방지가 활성화된 상태에서는 사용자 풀을 삭제하기 전에 사용자 풀을 삭제할 것임을 확인해야 합니다. 에서 사용자 풀을 삭제하면 삭제 방지 기능을 동시에 비활성화 AWS Management Console할 수 있습니다. 다음 이미지와 같이 삭제 방지를 비활성화하라는 메시지를 수락하고 삭제 의사를 확인하면 Amazon Cognito가 사용자 풀을 삭제합니다.

![\[삭제 방지 기능을 비활성화하는 프롬프트가 포함된 사용자 풀을 삭제하라는 프롬프트를 AWS Management Console 보여주는의 스크린샷입니다.\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/amazon-cognito-delete-user-pool-deactivate-deletion-protection.png)


Amazon Cognito API 요청을 사용하여 사용자 풀을 삭제하려면 먼저 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) 요청에서 `DeletionProtection`을 `Inactive`로 변경해야 합니다. 삭제 방지를 비활성화하지 않으면 Amazon Cognito에서 `InvalidParameterException` 오류를 반환합니다. 삭제 방지를 비활성화한 후 [DeleteUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUserPool.html) 요청에서 사용자 풀을 삭제할 수 있습니다.

 AWS Management Console에서 새 사용자 풀을 생성하면 기본적으로 Amazon Cognito가 **Deletion protection**(삭제 방지)을 활성화합니다. `CreateUserPool` API를 이용해 사용자 풀을 생성하면 기본적으로 삭제 방지가 비활성화됩니다. AWS CLI 또는 AWS SDK를 사용하여 생성한 사용자 풀에서이 기능을 사용하려면 `DeletionProtection` 파라미터를 로 설정합니다`True`.

Amazon Cognito 콘솔의 **설정** 메뉴에 있는 **삭제 방지** 컨테이너에서 삭제 방지 상태를 활성화하거나 비활성화할 수 있습니다.

# 삭제 방지를 구성하려면


1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)로 이동합니다. 자격 AWS 증명을 입력하라는 메시지가 표시될 수 있습니다.

1. [**사용자 풀(User Pools)**]을 선택합니다.

1. 목록에서 기존 사용자 풀을 선택하거나 [사용자 풀을 생성합니다](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html).

1. **설정** 메뉴를 선택하고 **삭제 방지** 탭으로 이동합니다. **활성화** 또는 **비활성화**를 선택합니다.

1. 다음 대화 상자에서 선택을 확인합니다.

# 사용자 존재 오류 응답 관리
<a name="cognito-user-pool-managing-errors"></a>

Amazon Cognito는 사용자 풀에서 반환하는 오류 응답을 사용자 지정하도록 지원합니다. 사용자 지정 오류 응답은 사용자 생성, 인증, 암호 복구 및 확인 작업에 사용할 수 있습니다.

사용자 풀 앱 클라이언트의 `PreventUserExistenceErrors` 설정을 사용하여 사용자 존재 여부와 관련한 오류를 사용하거나 사용하지 않도록 설정합니다. Amazon Cognito 사용자 풀 API로 새로운 앱 클라이언트를 생성할 때 기본적으로 `PreventUserExistenceErrors`는 `LEGACY`이거나 비활성화됩니다. Amazon Cognito 콘솔에서는 `PreventUserExistenceErrors`의 `ENABLED` 설정인 **사용자 존재 오류 방지** 옵션이 기본적으로 선택되어 있습니다. `PreventUserExistenceErrors` 구성을 업데이트하려면 다음 중 하나를 수행합니다.
+ [https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) API 요청에서 `ENABLED`와 `LEGACY` 사이의 `PreventUserExistenceErrors` 값을 변경합니다.
+ Amazon Cognito 콘솔에서 앱 클라이언트를 편집하고 선택한 (`ENABLED`)와 선택 취소된 (`LEGACY`) 사이에서 **사용자 존재 오류 방지**의 상태를 변경합니다.

이 속성의 값이 `LEGACY`인 경우 사용자가 사용자 풀에 없는 사용자 이름으로 로그인을 시도하면 앱 클라이언트가 `UserNotFoundException` 오류 응답을 반환합니다.

이 속성의 값이 `ENABLED`인 경우 앱 클라이언트는 `UserNotFoundException` 오류와 함께 사용자 풀에 사용자 계정이 존재하지 않음을 공개하지 않습니다. `ENABLED`의 `PreventUserExistenceErrors` 구성은 존재하지 않는 사용자 이름에 대한 요청을 제출할 때 다음과 같은 영향을 미칩니다.
+ Amazon Cognito는 API 요청에 대해 비특정 정보로 응답하며, 그렇지 않으면 유효한 사용자가 존재한다는 사실이 공개될 수 있습니다.
+ Amazon Cognito는 암호를 잊어버린 경우와 [선택 기반 인증](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)(`USER_AUTH`)을 *제외*한 인증 흐름이 있는 인증 요청에 대해 일반적인 인증 실패 응답을 반환합니다(예: `USER_SRP_AUTH` 또는 `CUSTOM_AUTH`). 이 오류 응답은 사용자 이름 또는 암호가 잘못되었음을 나타냅니다.
+ Amazon Cognito는 사용자 풀에 허용되는 문제 유형 중에서 임의로 선택하여 선택 기반 인증 요청에 응답합니다. 사용자 풀은 패스키, 일회용 암호 또는 암호 문제를 반환할 수 있습니다.
+ Amazon Cognito 계정 확인 및 암호 복구 API의 동작은 코드가 시뮬레이션된 전송 매체로 전송되었음을 나타내는 응답을 반환하고 `InvalidParameterException` 오류를 반환하는 것을 번갈아 수행합니다.

다음 정보는 `PreventUserExistenceErrors`가 `ENABLED`로 설정된 경우 사용자 풀 작업의 동작을 자세히 설명합니다.

## 인증 및 사용자 생성 작업
<a name="cognito-user-pool-managing-errors-user-auth"></a>

사용자 이름-암호 및 SRP(보안 원격 암호) 인증에서 오류 응답을 구성할 수 있습니다. 사용자 지정 인증을 통해 반환되는 오류를 사용자 지정할 수도 있습니다. 선택 기반 인증은 `PreventUserExistenceErrors` 구성의 영향을 받지 않습니다.인증 흐름의 사용자 존재 공개 세부 정보

**선택 기반 인증**  
`USER_AUTH` 선택 기반 인증 흐름에서 Amazon Cognito는 사용자 풀 구성 및 사용자의 속성에 따라 사용 가능한 기본 인증 요소에서 문제를 반환합니다. 이 인증 흐름은 암호, 보안 원격 암호(SRP), WebAuthn(패스키), SMS 일회용 암호(OTP) 또는 이메일 OTP 문제를 반환할 수 있습니다. `PreventUserExistenceErrors` 활성 상태에서 Amazon Cognito는 존재하지 않는 사용자에게 사용 가능한 인증 형식 중 하나 이상을 완료하기 위한 문제를 발행합니다. `PreventUserExistenceErrors` 비활성 상태인 경우 Amazon Cognito는 `UserNotFound` 예외를 반환합니다.

**사용자 이름 및 암호 인증**  
인증 흐름 `ADMIN_USER_PASSWORD_AUTH`, `USER_PASSWORD_AUTH` 및 `USER_AUTH`의 `PASSWORD` 흐름은 `PreventUserExistenceErrors`이 활성 상태일 때 메시지 `Incorrect username or password`와 함께를 `NotAuthorizedException`을 반환합니다. `PreventUserExistenceErrors`가 비활성 상태이면 이러한 흐름은 `UserNotFoundException`를 반환합니다.

**Secure Remote Password(SRP) 기반 인증**  
가장 좋은 방법은 이메일 주소, 전화번호 또는 선호하는 사용자 이름 [별칭 속성](user-pool-settings-attributes.md#user-pool-settings-aliases) 없이 `USER_SRP_AUTH`를 사용하는 `PreventUserExistenceErrors` 또는 사용자 풀에서 `USER_AUTH`의 `PASSWORD_SRP` 흐름으로만 구현하는 것입니다. 별칭 속성이 있는 사용자는 SRP 인증 흐름에서 사용자 존재 억제가 적용되지 않을 수 있습니다. 사용자 이름 암호 인증 흐름(`ADMIN_USER_PASSWORD_AUTH`, `USER_PASSWORD_AUTH`, 및 `USER_AUTH` `PASSWORD` 문제)은 별칭 속성에서 사용자의 존재를 완전히 억제합니다.  
누군가 앱 클라이언트에 알려지지 않은 사용자 이름으로 SRP 로그인을 시도하면 Amazon Cognito는 [RFC 5054](https://tools.ietf.org/html/rfc5054#section-2.5.1.3)에 설명된 대로 첫 번째 단계에서 시뮬레이션된 응답을 반환합니다. Amazon Cognito가 동일한 사용자 이름 및 사용자 풀 조합에 대해 동일한 솔트와 내부 사용자 ID([UUID](cognito-terms.md#terms-uuid) 형식)를 반환합니다. `RespondToAuthChallenge` 요청을 암호 증명과 함께 보내면, Amazon Cognito는 사용자 이름 또는 암호가 올바르지 않을 때 일반 `NotAuthorizedException` 오류를 반환합니다. SRP 인증 구현에 대한 자세한 내용은 [영구 암호 및 보안 페이로드로 로그인](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp) 섹션을 참조하세요.  
검증 기반 별칭 속성을 사용하고 있으며 변경 불가능한 사용자 이름의 형식이 [UUID](cognito-terms.md#terms-uuid)로 지정되지 않았다면, 사용자 이름 및 암호 인증을 사용하여 일반 응답을 시뮬레이션할 수 있습니다.

**사용자 지정 인증 문제 Lambda 트리거**  
Amazon Cognito는 사용자가 `CUSTOM_AUTH` 인증 흐름으로 로그인하려고 하지만 사용자 이름을 찾을 수 없는 경우 [Lambda가 트리거하는 사용자 지정 인증 문제](user-pool-lambda-challenge.md)를 호출합니다. 입력 이벤트에는 존재하지 않는 사용자의 값이 `true`인 `UserNotFound`라는 부울 파라미터가 포함됩니다. 이 파라미터는 사용자 풀이 사용자 지정 인증 아키텍처를 구성하는 인증 문제 Lambda 함수를 생성, 정의 및 확인하는 데 보내는 요청 이벤트에 나타납니다. Lambda 함수의 로직에서 이 지표를 검사하면 존재하지 않는 사용자의 사용자 지정 인증 문제를 시뮬레이션할 수 있습니다.

**사전 인증 Lambda 트리거**  
Amazon Cognito는 사용자가 로그인을 시도했지만 사용자 이름을 찾을 수 없는 경우 [사전 인증 트리거](user-pool-lambda-pre-authentication.md)를 호출합니다. 입력 이벤트에는 존재하지 않는 사용자의 값이 `true`인 `UserNotFound` 파라미터가 포함됩니다.

다음 목록은 `PreventUserExistenceErrors`가 사용자 계정 생성에 미치는 영향을 설명합니다.사용자 생성 흐름의 사용자 존재 공개 세부 정보

**SignUp**  
`SignUp` 작업은 이미 사용 중인 사용자 이름인 경우 항상 `UsernameExistsException`을 반환합니다. 앱에서 사용자를 등록할 때 Amazon Cognito가 이메일 주소 및 전화번호에 대한 `UsernameExistsException` 오류를 반환하지 않게 하려면, 확인 기반 별칭 속성을 사용해야 합니다. 별칭에 대한 자세한 내용은 [로그인 속성 사용자 지정](user-pool-settings-attributes.md#user-pool-settings-aliases)을 참조하십시오.  
Amazon Cognito가 `SignUp` API 요청을 사용하여 사용자 풀에서 사용자를 검색하지 못하게 하는 예시는 [가입 시 이메일 주소 및 전화 번호 관련 `UsernameExistsException` 오류 방지](#cognito-user-pool-managing-errors-prevent-userexistence-errors)에서 확인할 수 있습니다.

**가져온 사용자**  
`PreventUserExistenceErrors`를 사용하는 경우 가져온 사용자를 인증하는 중에 `PasswordResetRequiredException`이 반환되지 않고 대신 사용자 이름 또는 암호가 잘못되었음을 나타내는 일반 `NotAuthorizedException` 오류가 반환됩니다. 자세한 정보는 [가져온 사용자에게 암호 재설정 요구](cognito-user-pools-using-import-tool.md#cognito-user-pools-using-import-tool-password-reset)을 참조하세요.

**사용자 마이그레이션 Lambda 트리거**  
Amazon Cognito는 Lambda 트리거에서 원래 이벤트 컨텍스트에 빈 응답이 설정된 경우 존재하지 않는 사용자에 대해 시뮬레이션된 응답을 반환합니다. 자세한 내용은 [사용자 마이그레이션 Lambda 트리거를 사용하여 사용자 가져오기](cognito-user-pools-import-using-lambda.md) 단원을 참조하십시오.

### 가입 시 이메일 주소 및 전화 번호 관련 `UsernameExistsException` 오류 방지
<a name="cognito-user-pool-managing-errors-prevent-userexistence-errors"></a>

다음 예제는 사용자 풀에서 별칭 속성을 구성할 때 중복된 이메일 주소와 전화번호 때문에 `SignUp` API 요청에 대한 응답으로 `UsernameExistsException` 오류가 생성되지 않게 하는 방법을 보여줍니다. 이메일 주소나 전화 번호를 별칭 속성으로 사용하여 사용자 풀을 생성해야 합니다. 자세한 내용은 [사용자 풀 속성](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-attributes.html#user-pool-settings-aliases)의 *로그인 특성 사용자 지정* 섹션을 참조하세요.

1. Jie는 새 사용자 이름을 등록하고 이메일 주소(`jie@example.com`)도 입력합니다. Amazon Cognito가 이 이메일 주소로 확인 코드를 전송합니다.

   **예제 AWS CLI 명령**

   ```
   aws cognito-idp sign-up --client-id 1234567890abcdef0 --username jie --password PASSWORD --user-attributes Name="email",Value="jie@example.com"
   ```

   **응답의 예**

   ```
   {
       "UserConfirmed": false, 
       "UserSub": "<subId>", 
       "CodeDeliveryDetails": {
           "AttributeName": "email", 
           "Destination": "j****@e****", 
           "DeliveryMedium": "EMAIL"
       }
   }
   ```

1. Jie는 전송된 코드를 입력하여 이메일 주소의 소유권을 확인합니다. 이로써 사용자 등록이 완료됩니다.

   **예제 AWS CLI 명령**

   ```
   aws cognito-idp confirm-sign-up --client-id 1234567890abcdef0 --username=jie --confirmation-code xxxxxx
   ```

1. Shirley는 새 사용자 계정을 등록하고 이메일 주소(`jie@example.com`)를 입력합니다. Amazon Cognito는 `UsernameExistsException` 오류를 반환하지 않고, Jie의 이메일 주소로 확인 코드를 보냅니다.

   **예제 AWS CLI 명령**

   ```
   aws cognito-idp sign-up --client-id 1234567890abcdef0 --username shirley --password PASSWORD --user-attributes Name="email",Value="jie@example.com"
   ```

   **응답의 예**

   ```
   {
       "UserConfirmed": false, 
       "UserSub": "<new subId>", 
       "CodeDeliveryDetails": {
           "AttributeName": "email", 
           "Destination": "j****@e****", 
           "DeliveryMedium": "EMAIL"
       }
   }
   ```

1. 다른 시나리오에서는 Shirley 가 `jie@example.com`에 대한 소유권을 가집니다. 셜리는 Amazon Cognito가 Jie의 이메일 주소로 보낸 코드를 검색하고 계정 확인을 시도합니다.

   **예제 AWS CLI 명령**

   ```
   aws cognito-idp confirm-sign-up --client-id 1234567890abcdef0 --username=shirley --confirmation-code xxxxxx
   ```

   **응답의 예**

   ```
   An error occurred (AliasExistsException) when calling the ConfirmSignUp operation: An account with the email already exists.
   ```

`jie@example.com`이 기존 사용자에게 할당되었지만 Amazon Cognito는 Shirley의 `aws cognito-idp sign-up` 요청에 대해 오류를 반환하지 않습니다. Shirley는 Amazon Cognito가 오류 응답을 반환하기 전에 이메일 주소의 소유권을 입증해야 합니다. 별칭 속성이 있는 사용자 풀에서는 이 동작 때문에, 지정된 이메일 주소나 전화 번호를 가진 사용자의 존재 여부를 공개 `SignUp` API로 확인할 수 없습니다.

이 동작은 다음 예에서처럼 Amazon Cognito가 기존 사용자 이름과 함께 `SignUp` 요청에 반환하는 응답과는 다릅니다. Shirley는 이 응답을 통해 사용자 이름이 `jie`인 사용자가 이미 존재함을 알게 되지만, 이 사용자와 관련된 이메일 주소나 전화번호는 알지 못합니다.

**CLI 명령 예**

```
aws cognito-idp sign-up --client-id 1example23456789 --username jie --password PASSWORD
      --user-attributes Name="email",Value="shirley@example.com"
```

**응답의 예**

```
An error occurred (UsernameExistsException) when calling the SignUp operation: User already exists
```

## 암호 재설정 작업
<a name="cognito-user-pool-managing-errors-password-reset"></a>

Amazon Cognito는 사용자 존재 오류를 방지하면 사용자 암호 재설정 작업에 다음과 같은 응답을 반환합니다.

**ForgotPassword**  
사용자를 찾을 수 없거나, 사용자가 비활성화되었거나, 암호를 복구할 수 있는 확인된 전달 메커니즘이 없는 경우 Amazon Cognito는 사용자에 대해 시뮬레이션된 전송 미디어와 함께 `CodeDeliveryDetails`를 반환합니다. 시뮬레이션된 전송 미디어는 사용자 풀의 입력 사용자 이름 형식 및 검증 설정에 따라 결정됩니다.

**ConfirmForgotPassword**  
Amazon Cognito는 존재하지 않거나 사용 중지된 사용자에 대해 `CodeMismatchException` 오류를 반환합니다. `ForgotPassword`를 사용할 때 코드가 요청되지 않은 경우 Amazon Cognito가 `ExpiredCodeException` 오류를 반환합니다.

## 확인 작업
<a name="cognito-user-pool-managing-errors-confirmation"></a>

Amazon Cognito는 사용자 존재 오류를 방지하는 경우 사용자 확인 및 검증 작업에 다음과 같은 응답을 반환합니다.

**ResendConfirmationCode**  
Amazon Cognito는 사용 중지되거나 존재하지 않는 사용자에 대해 `CodeDeliveryDetails` 오류를 반환합니다. Amazon Cognito는 기존 사용자의 이메일 또는 전화 번호로 확인 코드를 보냅니다.

**ConfirmSignUp**  
 `ExpiredCodeException`은 코드가 만료된 경우 반환됩니다. Amazon Cognito는 사용자에게 권한이 부여되지 않은 경우 `NotAuthorizedException`을 반환합니다. 서버에서 예상하는 코드와 일치하지 않는 경우 Amazon Cognito는 `CodeMismatchException`을 반환합니다.