

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

# 사용자 존재 오류 응답 관리
<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`을 반환합니다.