

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

# 사용자 정의 인증 챌린지 Lambda 트리거
<a name="user-pool-lambda-challenge"></a>

Amazon Cognito 사용자 풀에 대한 인증 흐름을 구축할 때 기본 제공 흐름 이상으로 인증 모델을 확장하고 싶을 수 있습니다. 사용자 지정 챌린지 트리거의 일반적인 사용 사례 중 하나는 사용자 이름, 암호 및 다중 인증(MFA) 이외의 추가 보안 검사를 구현하는 것입니다. 사용자 지정 챌린지는 Lambda 지원 프로그래밍 언어로 생성할 수 있는 모든 질문과 응답입니다. 예를 들어 인증이 허용되기 전에 사용자가 CAPTCHA를 해결하거나 보안 질문에 답하도록 요구할 수 있습니다. 또 다른 잠재적 요구 사항은 특수 인증 요소 또는 디바이스와 통합하는 것입니다. 또는 하드웨어 보안 키 또는 생체 인식 장치로 사용자를 인증하는 소프트웨어를 이미 개발했을 수도 있습니다. 사용자 지정 챌린지에 대한 인증 성공의 정의는 Lambda 함수가 올바른 것으로 받아들이는 답변(예: 고정 문자열 또는 외부 API의 만족스러운 응답)입니다.

사용자 지정 챌린지로 인증을 시작하고 인증 프로세스를 완전히 제어하거나 애플리케이션이 사용자 지정 챌린지를 수신하기 전에 사용자 이름 암호 인증을 수행할 수 있습니다.

사용자 지정 인증 챌린지 Lambda 트리거:

**[정의](user-pool-lambda-define-auth-challenge.md)**  
챌린지 시퀀스를 시작합니다. 새 챌린지를 시작할지, 인증을 완료로 표시할지 또는 인증 시도를 중단할지 결정합니다.

**[생성](user-pool-lambda-create-auth-challenge.md)**  
사용자가 답변해야 하는 질문을 애플리케이션에 발급합니다. 이 함수는 애플리케이션이 사용자에게 표시해야 하는 보안 질문 또는 CAPTCHA에 대한 링크를 제공할 수 있습니다.

**[확인](user-pool-lambda-verify-auth-challenge-response.md)**  
예상 응답을 알고 이를 애플리케이션이 챌린지 응답에서 제공하는 응답과 비교합니다. 함수는 CAPTCHA 서비스의 API를 호출하여 사용자가 시도한 솔루션의 예상 결과를 검색할 수 있습니다.

이 세 가지 Lambda 함수는 서로 연결되어 사용자의 제어 범위 내에 있고 자체 설계에 완전히 속하는 인증 메커니즘을 제공합니다. 사용자 지정 인증에는 클라이언트 및 Lambda 함수에 애플리케이션 로직이 필요하므로 관리형 로그인 내에서 사용자 지정 인증을 처리할 수 없습니다. 이 인증 시스템에는 추가 개발자 노력이 필요합니다. 애플리케이션은 사용자 풀 API로 인증 흐름을 수행하고 사용자 지정 인증 문제의 중앙에서 질문을 렌더링하는 맞춤형 로그인 인터페이스로 결과 문제를 처리해야 합니다.

![\[문제 Lambda 트리거\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/lambda-challenges.png)


사용자 지정 인증을 구현하는 방법에 대한 자세한 내용은 [사용자 지정 인증 흐름 및 챌린지](amazon-cognito-user-pools-authentication-flow-methods.md#Custom-authentication-flow-and-challenges) 섹션을 참조하세요.

API 작업 [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)와 [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) 간의 인증. 이 흐름에서 인증이 실패하거나 사용자에게 토큰이 발행될 때까지 사용자는 연속 문제에 응답하여 인증합니다. 챌린지 응답은 새로운 챌린지일 수 있습니다. 이 경우 애플리케이션은 새로운 챌린지에 필요한 만큼 응답합니다. 인증 챌린지 정의 함수가 지금까지의 결과를 분석하여 모든 챌린지에 응답했다고 판단하고 `IssueTokens`를 반환하면 인증이 성공합니다.

**Topics**
+ [사용자 지정 문제 흐름의 SRP 인증](#user-pool-lambda-challenge-srp-authentication)
+ [인증 챌린지 정의 Lambda 트리거](user-pool-lambda-define-auth-challenge.md)
+ [인증 챌린지 생성 Lambda 트리거](user-pool-lambda-create-auth-challenge.md)
+ [인증 챌린지 확인 응답 Lambda 트리거](user-pool-lambda-verify-auth-challenge-response.md)

## 사용자 지정 문제 흐름의 SRP 인증
<a name="user-pool-lambda-challenge-srp-authentication"></a>

Amazon Cognito가 사용자 지정 문제를 표시하기 전에 사용자 암호를 확인하도록 할 수 있습니다. [request-rate 할당량](quotas.md#category_operations.title)의 인증 카테고리에 연결된 Lambda 트리거는 사용자 지정 문제 흐름에서 SRP 인증을 수행할 때 실행됩니다. 다음은 이 프로세스의 개요입니다.

1. 앱이 `AuthParameters` 맵으로 `InitiateAuth` 또는 `AdminInitiateAuth`를 호출하여 로그인을 시작합니다. 파라미터에는 `CHALLENGE_NAME: SRP_A,`와, `SRP_A` 및 `USERNAME`에 대한 값이 포함되어야 합니다.

1. Amazon Cognito는 `challengeName: SRP_A` 및 `challengeResult: true`를 포함하는 초기 세션과 함께 인증 문제 정의 Lambda 트리거를 호출합니다.

1. 이러한 입력을 수신한 후 Lambda 함수는 `challengeName: PASSWORD_VERIFIER`, `issueTokens: false`, `failAuthentication: false`로 응답합니다.

1. 암호 확인이 성공하면 Amazon Cognito가 `challengeName: PASSWORD_VERIFIER` 및 `challengeResult: true`가 포함된 새 세션을 사용하여 Lambda 함수를 다시 호출합니다.

1. 사용자 지정 문제를 시작하려면 Lambda 함수가 `challengeName: CUSTOM_CHALLENGE`, `issueTokens: false` 및 `failAuthentication: false`로 응답합니다. 암호 확인을 사용하여 사용자 지정 인증 흐름을 시작하지 않으려면 `CHALLENGE_NAME: CUSTOM_CHALLENGE`를 포함한 `AuthParameters` 맵으로 로그인을 시작하면 됩니다.

1. 모든 챌린지에 응답할 때까지 챌린지 루프가 반복됩니다.

다음은 SRP 흐름을 사용하여 사용자 지정 인증에 앞서 시작되는 `InitiateAuth` 요청의 예입니다.

```
{
    "AuthFlow": "CUSTOM_AUTH",
    "ClientId": "1example23456789",
    "AuthParameters": {
        "CHALLENGE_NAME": "SRP_A",
        "USERNAME": "testuser",
        "SRP_A": "[SRP_A]",
        "SECRET_HASH": "[secret hash]"
    }
}
```

### 사용자 지정 인증 SRP 흐름의 암호 재설정
<a name="user-pool-lambda-challenge-force-password-change"></a>

사용자가 `FORCE_CHANGE_PASSWORD` 상태인 경우 사용자 지정 인증 흐름은 인증 문제의 무결성을 유지하면서 암호 변경 단계를 통합해야 합니다. Amazon Cognito는 `NEW_PASSWORD_REQUIRED` 문제 중에 [인증 문제 정의](user-pool-lambda-define-auth-challenge.md) Lambda 트리거를 호출합니다. 이 시나리오에서는 사용자 지정 문제 흐름 및 SRP 인증으로 로그인하는 사용자가 암호 재설정 상태인 경우 새 암호를 설정할 수 있습니다.

사용자가 `RESET_REQUIRED` 또는 `FORCE_CHANGE_PASSWORD` 상태인 경우 `NEW_PASSWORD`를 사용하여 `NEW_PASSWORD_REQUIRED` 문제에 [응답](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html#API_RespondToAuthChallenge_RequestParameters)해야 합니다. SRP를 사용한 사용자 지정 인증에서 Amazon Cognito는 사용자가 SRP `NEW_PASSWORD_REQUIRED` 문제를 완료한 후 `PASSWORD_VERIFIER` 문제를 반환합니다. 인증 문제 정의 트리거는 `session` 배열에서 두 문제 결과를 모두 수신하며 사용자가 암호를 성공적으로 변경한 후 추가 사용자 지정 문제를 진행할 수 있습니다.

인증 문제 정의 Lambda 트리거는 SRP 인증, 암호 재설정 및 후속 사용자 지정 문제를 통해 문제 시퀀스를 관리해야 합니다. 트리거는 `PASSWORD_VERIFIER` 및 `NEW_PASSWORD_REQUIRED` 결과를 포함하여 `session` 파라미터에서 완료된 문제 배열을 수신합니다. 구현 예는 [인증 챌린지 정의 예제](user-pool-lambda-define-auth-challenge.md#aws-lambda-triggers-define-auth-challenge-example) 섹션을 참조하세요.

#### 인증 흐름 단계
<a name="user-pool-lambda-challenge-password-flow-steps"></a>

사용자 지정 문제 전에 암호를 확인해야 하는 사용자의 경우 프로세스는 다음 단계를 따릅니다.

1. 앱이 `AuthParameters` 맵으로 `InitiateAuth` 또는 `AdminInitiateAuth`를 호출하여 로그인을 시작합니다. 파라미터에는 `CHALLENGE_NAME: SRP_A`와, `SRP_A` 및 `USERNAME`에 대한 값이 포함되어야 합니다.

1. Amazon Cognito는 `challengeName: SRP_A` 및 `challengeResult: true`를 포함하는 초기 세션과 함께 인증 문제 정의 Lambda 트리거를 호출합니다.

1. 이러한 입력을 수신한 후 Lambda 함수는 `challengeName: PASSWORD_VERIFIER`, `issueTokens: false`, `failAuthentication: false`로 응답합니다.

1. 암호 확인에 성공하면 다음 두 가지 중 하나가 발생합니다.  
**정상 상태인 사용자의 경우:**  
Amazon Cognito가 `challengeName: PASSWORD_VERIFIER` 및 `challengeResult: true`가 포함된 새 세션을 사용하여 Lambda 함수를 다시 호출합니다.  
사용자 지정 문제를 시작하려면 Lambda 함수가 `challengeName: CUSTOM_CHALLENGE`, `issueTokens: false` 및 `failAuthentication: false`로 응답합니다.  
**`RESET_REQUIRED` 또는 `FORCE_CHANGE_PASSWORD` 상태의 사용자의 경우:**  
Amazon Cognito는 `challengeName: PASSWORD_VERIFIER` 및 `challengeResult: true`가 포함된 세션을 사용하여 Lambda 함수를 호출합니다.  
Lambda 함수는 `challengeName: NEW_PASSWORD_REQUIRED`, `issueTokens: false`, `failAuthentication: false`와 함께 응답해야 합니다.  
암호 변경에 성공하면 Amazon Cognito는 `PASSWORD_VERIFIER` 및 `NEW_PASSWORD_REQUIRED` 결과가 모두 포함된 세션으로 Lambda 함수를 호출합니다.  
사용자 지정 문제를 시작하려면 Lambda 함수가 `challengeName: CUSTOM_CHALLENGE`, `issueTokens: false` 및 `failAuthentication: false`로 응답합니다.

1. 모든 챌린지에 응답할 때까지 챌린지 루프가 반복됩니다.

암호 확인을 사용하여 사용자 지정 인증 흐름을 시작하지 않으려면 `CHALLENGE_NAME: CUSTOM_CHALLENGE`를 포함한 `AuthParameters` 맵으로 로그인을 시작하면 됩니다.

#### 세션 관리
<a name="user-pool-lambda-challenge-session-management"></a>

인증 흐름은 일련의 세션 IDs 및 문제 결과를 통해 세션 연속성을 유지합니다. 각 문제 응답은 세션 재사용 오류를 방지하기 위해 새 세션 ID를 생성합니다. 이는 다중 인증 흐름에 특히 중요합니다.

문제 결과는 Lambda 트리거가 수신하는 세션 배열에 시간순으로 저장됩니다. `FORCE_CHANGE_PASSWORD` 상태인 사용자의 경우 세션 배열에는 다음이 포함됩니다.

1. `session[0]` - 초기 `SRP_A` 문제

1. `session[1]` - `PASSWORD_VERIFIER` 결과

1. `session[2]` - `NEW_PASSWORD_REQUIRED` 결과

1. 후속 요소 - 추가 사용자 지정 문제의 결과

#### 인증 흐름 예시
<a name="user-pool-lambda-challenge-example-flow"></a>

다음 예제에서는 암호 변경과 사용자 지정 CAPTCHA 문제를 모두 완료해야 하는 `FORCE_CHANGE_PASSWORD` 상태의 사용자에 대한 전체 사용자 지정 인증 흐름을 보여줍니다.

1. **InitiateAuth 요청**

   ```
   {
       "AuthFlow": "CUSTOM_AUTH",
       "ClientId": "1example23456789",
       "AuthParameters": {
           "CHALLENGE_NAME": "SRP_A",
           "USERNAME": "testuser",
           "SRP_A": "[SRP_A]"
       }
   }
   ```

1. **InitiateAuth 응답**

   ```
   {
       "ChallengeName": "PASSWORD_VERIFIER",
       "ChallengeParameters": {
           "USER_ID_FOR_SRP": "testuser"
       },
       "Session": "[session_id_1]"
   }
   ```

1. **`PASSWORD_VERIFIER`를 사용한 RespondToAuthChallenge 요청**

   ```
   {
       "ChallengeName": "PASSWORD_VERIFIER",
       "ClientId": "1example23456789",
       "ChallengeResponses": {
           "PASSWORD_CLAIM_SIGNATURE": "[claim_signature]",
           "PASSWORD_CLAIM_SECRET_BLOCK": "[secret_block]",
           "TIMESTAMP": "[timestamp]",
           "USERNAME": "testuser"
       },
       "Session": "[session_id_1]"
   }
   ```

1. **`NEW_PASSWORD_REQUIRED` 문제가 포함된 RespondToAuthChallenge 응답**

   ```
   {
       "ChallengeName": "NEW_PASSWORD_REQUIRED",
       "ChallengeParameters": {},
       "Session": "[session_id_2]"
   }
   ```

1. **`NEW_PASSWORD_REQUIRED`를 사용한 RespondToAuthChallenge 요청**

   ```
   {
       "ChallengeName": "NEW_PASSWORD_REQUIRED",
       "ClientId": "1example23456789",
       "ChallengeResponses": {
           "NEW_PASSWORD": "[password]",
           "USERNAME": "testuser"
       },
       "Session": "[session_id_2]"
   }
   ```

1. **CAPTCHA 사용자 지정 문제를 사용한 RespondToAuthChallenge 응답**

   ```
   {
       "ChallengeName": "CUSTOM_CHALLENGE",
       "ChallengeParameters": {
           "captchaUrl": "url/123.jpg"
       },
       "Session": "[session_id_3]"
   }
   ```

1. **CAPTCHA 사용자 지정 문제에 대한 답변이 포함된 RespondToAuthChallenge 요청**

   ```
   {
       "ChallengeName": "CUSTOM_CHALLENGE",
       "ClientId": "1example23456789",
       "ChallengeResponses": {
           "ANSWER": "123",
           "USERNAME": "testuser"
       },
       "Session": "[session_id_3]"
   }
   ```

**6. 최종 성공 응답**

```
{
    "AuthenticationResult": {
        "AccessToken": "eyJra456defEXAMPLE",
        "ExpiresIn": 3600,
        "IdToken": "eyJra789ghiEXAMPLE",
        "RefreshToken": "eyJjd123abcEXAMPLE",
        "TokenType": "Bearer"
    },
    "ChallengeParameters": {}
}
```

# 인증 챌린지 정의 Lambda 트리거
<a name="user-pool-lambda-define-auth-challenge"></a>

인증 챌린지 정의 트리거는 사용자 지정 인증 흐름에서 챌린지 시퀀스를 유지하는 Lambda 함수입니다. 챌린지 시퀀스의 성공 또는 실패를 선언하고 시퀀스가 아직 완료되지 않은 경우 다음 챌린지를 설정합니다.

![\[문제 Lambda 트리거\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/lambda-challenges1.png)


**인증 문제 정의**  
 Amazon Cognito가 이 트리거를 호출하여 [사용자 지정 인증 흐름](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow)을 시작합니다.

이 Lambda 트리거에 대한 요청에는 `session`이 포함됩니다. `session` 파라미터는 현재 인증 프로세스에서 사용자에게 표시되는 모든 문제가 포함된 배열입니다. 해당하는 결과를 포함하는 어레이입니다. `session` 배열에는 문제 세부 정보(`ChallengeResult`)가 시간순으로 저장됩니다. 문제 `session[0]`은 사용자가 수신하는 첫 번째 문제를 나타냅니다.

**Topics**
+ [인증 챌린지 정의 Lambda 트리거 파라미터](#cognito-user-pools-lambda-trigger-syntax-define-auth-challenge)
+ [인증 챌린지 정의 예제](#aws-lambda-triggers-define-auth-challenge-example)

## 인증 챌린지 정의 Lambda 트리거 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge"></a>

Amazon Cognito가 이 Lambda 함수에 전달하는 요청은 아래 파라미터와 Amazon Cognito가 모든 요청에 추가하는 [공통 파라미터](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared)의 조합입니다.

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

```
{
    "request": {
        "userAttributes": {
            "string": "string",
                . . .
        },
        "session": [
            ChallengeResult,
            . . .
        ],
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "challengeName": "string",
        "issueTokens": boolean,
        "failAuthentication": boolean
    }
}
```

------

### 인증 챌린지 정의 요청 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge-request"></a>

 Amazon Cognito에서 Lambda 함수를 호출하면 Amazon Cognito가 다음과 같은 파라미터를 제공합니다.

**userAttributes**  
사용자 속성을 나타내는 하나 이상의 이름-값 페어입니다.

**userNotFound**  
사용자 풀 클라이언트에 대해 `PreventUserExistenceErrors`가 `ENABLED`로 설정된 경우 Amazon Cognito에서 채우는 부울입니다. 값이 `true`이면 해당 사용자 ID(사용자 이름, 이메일 주소, 기타 세부 정보)와 일치하는 기존 사용자가 없는 것입니다. `PreventUserExistenceErrors`가 `ENABLED`로 설정된 경우 서비스는 존재하지 않는 사용자를 앱에 알리지 않습니다. Lambda 함수에서 동일한 사용자 경험을 유지하고 대기 시간을 고려하는 것이 좋습니다. 이렇게 하면 호출자가 사용자의 존재 여부에 상관없이 동일한 동작을 감지할 수 있습니다.

**세션**  
`ChallengeResult` 요소 배열입니다. 각각 다음 요소가 포함됩니다.    
**challengeName**  
챌린지 유형 `CUSTOM_CHALLENGE`, `SRP_A`, `PASSWORD_VERIFIER`, `SMS_MFA`, `EMAIL_OTP`, `SOFTWARE_TOKEN_MFA`, `DEVICE_SRP_AUTH`, `DEVICE_PASSWORD_VERIFIER`, `ADMIN_NO_SRP_AUTH` 중 하나입니다.  
인증 챌린지 정의 함수가 멀티 팩터 인증을 설정한 사용자에게 `PASSWORD_VERIFIER` 챌린지를 발급하면 Amazon Cognito는 `SMS_MFA`, `EMAIL_OTP` 또는 `SOFTWARE_TOKEN_MFA` 챌린지로 후속 작업을 실행합니다. 다음은 다중 인증 코드에 대한 프롬프트입니다. 함수에 `SMS_MFA`, `EMAIL_OTP` 및 `SOFTWARE_TOKEN_MFA` 챌린지의 입력 이벤트 처리를 포함하세요. 인증 챌린지 정의 함수에서 MFA 챌린지를 호출할 필요는 없습니다.  
사용자가 성공적으로 인증되었고 토큰을 발급받아야 하는지 여부를 함수가 결정할 때 인증 챌린지 정의 함수에서 항상 `challengeName`을 확인하여 예상 값과 일치하는지 확인해야 합니다.  
**challengeResult**  
사용자가 챌린지를 성공적으로 완료하면 `true`로 설정하고 그렇지 않으면 `false`로 설정합니다.  
**challengeMetadata**  
사용자 지정 챌린지의 이름입니다. `challengeName`이 `CUSTOM_CHALLENGE`인 경우에만 사용됩니다.

**clientMetadata**  
인증 문제 정의 트리거에 지정하는 Lambda 함수에 사용자 지정 입력으로 제공할 수 있는 하나 이상의 키-값 쌍입니다. 이 데이터를 Lambda 함수에 전달하려면 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 및 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) API 작업에서 `ClientMetadata` 파라미터를 사용합니다. 인증 문제 정의 함수를 호출하는 요청에는 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 및 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API 작업의 ClientMetadata 파라미터에 전달된 데이터가 포함되지 않습니다.

### 인증 챌린지 정의 응답 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge-response"></a>

응답에서 인증 프로세스의 다음 단계를 반환할 수 있습니다.

**challengeName**  
다음 문제의 이름이 포함된 문자열입니다. 사용자에게 새로운 챌린지를 표시하려면 여기에 챌린지 이름을 지정하세요.

**issueTokens**  
사용자가 인증 문제를 충분히 완료했다고 확인한 경우 `true`로 설정합니다. 사용자가 문제를 충분히 충족하지 못한 경우 `false`로 설정합니다.

**failAuthentication**  
현재 인증 프로세스를 종료하려는 경우 `true`로 설정합니다. 현재 인증 프로세스를 계속하려면 `false`로 설정합니다.

## 인증 챌린지 정의 예제
<a name="aws-lambda-triggers-define-auth-challenge-example"></a>

이 예에서는 인증을 위한 일련의 문제를 정의하고 사용자가 모든 문제를 성공적으로 완료한 경우에만 토큰을 발행합니다. 사용자가 `SRP_A` 및 `PASSWORD_VERIFIER` 문제로 SRP 인증을 완료하면 이 함수는 인증 문제 생성 트리거를 호출하는 `CUSTOM_CHALLENGE`를 전달합니다. 이 시퀀스는 [인증 생성 문제 예제](user-pool-lambda-create-auth-challenge.md#aws-lambda-triggers-create-auth-challenge-example)와 함께 문제 3에 대한 CAPTCHA 문제와 문제 4에 대한 보안 질문을 제공합니다.

사용자가 CAPTCHA를 해결하고 보안 질문에 답변하면 이 함수는 사용자 풀이 토큰을 발급할 수 있는지 확인합니다. SRP 인증은 필요하지 않습니다. CAPTCHA 및 보안 질문을 문제 1과 2로 설정할 수도 있습니다. 인증 문제 정의 함수가 SRP 문제를 선언하지 않는 경우 사용자의 성공은 전적으로 사용자 지정 프롬프트에 대한 응답에 따라 결정됩니다.

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (
    event.request.session.length === 1 &&
    event.request.session[0].challengeName === "SRP_A"
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "PASSWORD_VERIFIER";
  } else if (
    event.request.session.length === 2 &&
    event.request.session[1].challengeName === "PASSWORD_VERIFIER" &&
    event.request.session[1].challengeResult === true
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else if (
    event.request.session.length === 3 &&
    event.request.session[2].challengeName === "CUSTOM_CHALLENGE" &&
    event.request.session[2].challengeResult === true
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else if (
    event.request.session.length === 4 &&
    event.request.session[3].challengeName === "CUSTOM_CHALLENGE" &&
    event.request.session[3].challengeResult === true
  ) {
    event.response.issueTokens = true;
    event.response.failAuthentication = false;
  } else {
    event.response.issueTokens = false;
    event.response.failAuthentication = true;
  }

  return event;
};

export { handler };
```

------

# 인증 챌린지 생성 Lambda 트리거
<a name="user-pool-lambda-create-auth-challenge"></a>

인증 챌린지 생성 트리거는 인증 챌린지 정의 트리거가 선언한 각 챌린지의 세부 정보를 포함하는 Lambda 함수입니다. 인증 챌린지 정의 트리거에서 선언한 챌린지 이름을 처리하고 애플리케이션이 사용자에게 제공해야 하는 `publicChallengeParameters`를 반환합니다. 그런 다음 이 함수는 사용자 풀이 인증 챌린지 확인 트리거에 전달하는 챌린지에 대한 답변(`privateChallengeParameters`)을 사용자 풀에 제공합니다. 인증 챌린지 정의 트리거가 챌린지 시퀀스를 관리하는 경우 인증 챌린지 생성 트리거가 챌린지 콘텐츠를 관리합니다.

![\[문제 Lambda 트리거\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/lambda-challenges2.png)


**인증 문제 생성**  
**인증 문제 정의** 트리거의 일부로 사용자 지정 문제를 지정한 경우 Amazon Cognito가 **인증 문제 정의** 이후에 이 트리거를 호출합니다. [사용자 지정 인증 흐름](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow)을 생성합니다.

사용자에게 표시할 문제를 만들기 위해 이 Lambda 트리거가 호출됩니다. 이 Lambda 트리거에 대한 요청에는 `challengeName` 및 `session`이 포함됩니다. `challengeName`은 문자열이며 사용자에게 표시할 다음 챌린지의 이름입니다. 인증 문제 정의 Lambda 트리거에서 이 속성의 값이 설정됩니다.

모든 챌린지에 응답할 때까지 챌린지 루프가 반복됩니다.

**Topics**
+ [인증 챌린지 생성 Lambda 트리거 파라미터](#cognito-user-pools-lambda-trigger-syntax-create-auth-challenge)
+ [인증 챌린지 생성 예제](#aws-lambda-triggers-create-auth-challenge-example)

## 인증 챌린지 생성 Lambda 트리거 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge"></a>

Amazon Cognito가 이 Lambda 함수에 전달하는 요청은 아래 파라미터와 Amazon Cognito가 모든 요청에 추가하는 [공통 파라미터](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared)의 조합입니다.

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

```
{
    "request": {
        "userAttributes": {
            "string": "string",
            . . .
        },
        "challengeName": "string",
        "session": [
            ChallengeResult,
            . . .
        ],
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "publicChallengeParameters": {
            "string": "string",
            . . .
        },
        "privateChallengeParameters": {
            "string": "string",
            . . .
        },
        "challengeMetadata": "string"
    }
}
```

------

### 인증 챌린지 생성 요청 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge-request"></a>

**userAttributes**  
사용자 속성을 나타내는 하나 이상의 이름-값 페어입니다.

**userNotFound**  
이 부울은 `PreventUserExistenceErrors`가 사용자 풀 클라이언트에 대해 `ENABLED`로 설정된 경우에 채워집니다.

**challengeName**  
새로운 챌린지의 이름입니다.

**세션**  
세션 요소는 각각 다음 요소를 포함하는 `ChallengeResult` 요소의 어레이입니다.    
**challengeName**  
챌린지 유형입니다. `"CUSTOM_CHALLENGE"`, `"PASSWORD_VERIFIER"`, `"SMS_MFA"`, `"DEVICE_SRP_AUTH"`, `"DEVICE_PASSWORD_VERIFIER"`, `"NEW_PASSWORD_REQUIRED"` 또는 `"ADMIN_NO_SRP_AUTH"` 중 하나입니다.  
**challengeResult**  
사용자가 챌린지를 성공적으로 완료하면 `true`로 설정하고 그렇지 않으면 `false`로 설정합니다.  
**challengeMetadata**  
사용자 지정 챌린지의 이름입니다. `challengeName`이 `"CUSTOM_CHALLENGE"`인 경우에만 사용됩니다.

**clientMetadata**  
인증 문제 생성 트리거에 지정하는 Lambda 함수에 사용자 지정 입력으로 제공할 수 있는 하나 이상의 키-값 페어입니다. [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 및 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) API 작업에서 ClientMetadata 파라미터를 사용하여 이 데이터를 Lambda 함수에 전달할 수 있습니다. 인증 문제 생성 함수를 호출하는 요청에는 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 및 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API 작업의 ClientMetadata 파라미터에 전달된 데이터가 포함되지 않습니다.

### 인증 챌린지 생성 응답 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge-response"></a>

**publicChallengeParameters**  
클라이언트 앱이 사용자에게 표시할 챌린지에 사용하기 위한 하나 이상의 키-값 페어입니다. 사용자에게 문제를 정확히 표시하는 데 필요한 모든 정보를 이 파라미터에 포함해야 합니다.

**privateChallengeParameters**  
이 파라미터는 인증 문제 응답 확인 Lambda 트리거에만 사용됩니다. 챌린지에 대한 사용자의 응답을 확인하는 데 필요한 모든 정보를 이 파라미터에 포함해야 합니다. 즉, `publicChallengeParameters` 파라미터는 사용자에게 표시할 질문을 포함하고 `privateChallengeParameters`는 질문의 유효한 대답을 포함합니다.

**challengeMetadata**  
이 항목이 사용자 지정 챌린지일 경우 사용자 지정 챌린지의 이름입니다.

## 인증 챌린지 생성 예제
<a name="aws-lambda-triggers-create-auth-challenge-example"></a>

이 함수에는 [인증 문제 정의 예제](user-pool-lambda-define-auth-challenge.md#aws-lambda-triggers-define-auth-challenge-example)의 문제 시퀀스에 해당하는 두 가지 사용자 지정 문제가 있습니다. 처음 두 가지 문제는 SRP 인증입니다. 세 번째 문제의 경우 이 함수는 문제 응답에서 애플리케이션에 CAPTCHA URL을 반환합니다. 애플리케이션은 지정된 URL에서 CAPTCHA를 렌더링하고 사용자의 입력을 반환합니다. CAPTCHA 이미지 URL이 퍼블릭 챌린지 파라미터에 "`captchaUrl`"로 추가되고 예상되는 답이 프라이빗 챌린지 파라미터에 추가됩니다.

네 번째 문제의 경우 이 함수는 보안 질문을 반환합니다. 애플리케이션이 질문을 렌더링하고 사용자에게 답변을 요청합니다. 사용자가 두 사용자 지정 문제를 모두 해결한 후 인증 문제 정의 트리거는 사용자 풀이 토큰을 발급할 수 있는지 확인합니다.

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (event.request.challengeName !== "CUSTOM_CHALLENGE") {
    return event;
  }

  if (event.request.session.length === 2) {
    event.response.publicChallengeParameters = {};
    event.response.privateChallengeParameters = {};
    event.response.publicChallengeParameters.captchaUrl = "url/123.jpg";
    event.response.privateChallengeParameters.answer = "5";
  }

  if (event.request.session.length === 3) {
    event.response.publicChallengeParameters = {};
    event.response.privateChallengeParameters = {};
    event.response.publicChallengeParameters.securityQuestion =
      "Who is your favorite team mascot?";
    event.response.privateChallengeParameters.answer = "Peccy";
  }

  return event;
};

export { handler };
```

------

# 인증 챌린지 확인 응답 Lambda 트리거
<a name="user-pool-lambda-verify-auth-challenge-response"></a>

확인 인증 챌린지 트리거는 사용자가 제공한 응답을 알려진 응답과 비교하는 Lambda 함수입니다. 이 함수는 사용자가 챌린지에 올바르게 응답했는지 여부를 사용자 풀에 알려줍니다. 인증 챌린지 확인 트리거가 `true`의 `answerCorrect`로 응답하면 인증 시퀀스를 계속할 수 있습니다.

![\[문제 Lambda 트리거\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/lambda-challenges3.png)


**인증 문제 응답 확인**  
Amazon Cognito는 이 트리거를 호출하여 사용자 지정 인증 문제에 대한 사용자의 응답이 유효한지 여부를 확인합니다. 이것은 사용자 풀 [사용자 지정 인증 흐름](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow)에 속합니다.

이 트리거에 대한 요청에는 `privateChallengeParameters` 및 `challengeAnswer` 파라미터가 포함됩니다. 인증 문제 생성 Lambda 트리거는 `privateChallengeParameters` 값을 반환하고 사용자의 예상 응답을 포함합니다. `challengeAnswer` 파라미터에는 챌린지에 대한 사용자의 응답이 포함됩니다.

응답에는 `answerCorrect` 속성이 포함됩니다. 사용자가 문제를 성공적으로 완료한 경우 Amazon Cognito는 속성 값을 `true`로 설정합니다. 사용자가 문제를 성공적으로 완료하지 못한 경우 Amazon Cognito는 속성 값을 `false`로 설정합니다.

사용자가 모든 문제에 응답할 때까지 문제 루프가 반복됩니다.

**Topics**
+ [인증 챌린지 확인 Lambda 트리거 파라미터](#cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge)
+ [인증 챌린지 확인 응답 예제](#aws-lambda-triggers-verify-auth-challenge-response-example)

## 인증 챌린지 확인 Lambda 트리거 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge"></a>

Amazon Cognito가 이 Lambda 함수에 전달하는 요청은 아래 파라미터와 Amazon Cognito가 모든 요청에 추가하는 [공통 파라미터](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared)의 조합입니다.

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

```
{
    "request": {
        "userAttributes": {
            "string": "string",
            . . .
        },
        "privateChallengeParameters": {
            "string": "string",
            . . .
        },
        "challengeAnswer": "string",
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "answerCorrect": boolean
    }
}
```

------

### 인증 챌린지 확인 요청 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge-request"></a>

**userAttributes**  
이 파라미터에는 사용자 속성을 나타내는 하나 이상의 이름-값 페어가 포함됩니다.

**userNotFound**  
Amazon Cognito에서 사용자 풀 클라이언트에 대해 `PreventUserExistenceErrors`를 `ENABLED`로 설정한 경우 Amazon Cognito는 이 부울을 채웁니다.

**privateChallengeParameters**  
이 파라미터는 인증 문제 생성 트리거에서 가져옵니다. 사용자가 문제를 통과했는지 여부를 확인하려면 Amazon Cognito에서 이 파라미터를 사용자의 **challengeAnswer**과 비교합니다.  
이 파라미터는 사용자의 문제에 대한 응답을 검증하는 데 필요한 모든 정보를 포함합니다. 이 정보에는 Amazon Cognito가 사용자에게 제시하는 질문(`publicChallengeParameters`) 및 질문에 대한 유효한 대답(`privateChallengeParameters`)이 포함됩니다. 인증 문제 응답 확인 Lambda 트리거만 이 파라미터를 사용합니다.

**challengeAnswer**  
이 파라미터 값은 사용자의 문제에 대한 응답에 있는 대답입니다.

**clientMetadata**  
이 파라미터는 인증 문제 확인 트리거에 대한 Lambda 함수에 사용자 지정 입력으로 제공될 수 있는 하나 이상의 키-값 페어를 포함합니다. 이 데이터를 Lambda 함수에 전달하려면 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 및 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) API 작업에서 ClientMetadata 파라미터를 사용합니다. Amazon Cognito는 승인 문제 확인 함수에 전달하는 요청에 있는 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 및 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API 작업의 ClientMetadata 파라미터에서 전달된 데이터는 포함하지 않습니다.

### 인증 챌린지 확인 응답 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge-response"></a>

**answerCorrect**  
사용자가 문제를 성공적으로 완료한 경우 Amazon Cognito는 이 파라미터를 `true`로 설정합니다. 사용자가 문제를 성공적으로 완료하지 못한 경우 Amazon Cognito는 이 파라미터를 `false`로 설정합니다.

## 인증 챌린지 확인 응답 예제
<a name="aws-lambda-triggers-verify-auth-challenge-response-example"></a>

이 인증 확인 문제 기능은 사용자의 문제 응답이 예상 응답과 일치하는지 확인합니다. 사용자의 답변은 애플리케이션의 입력에 따라 정의되고, 선호하는 답변은 `privateChallengeParameters.answer`가 [인증 문제 트리거 응답 생성](user-pool-lambda-create-auth-challenge.md#aws-lambda-triggers-create-auth-challenge-example)의 응답에서 정의합니다. 정답과 주어진 답변 모두이 함수에 대한 입력 이벤트의 일부입니다.

이 예에서, 사용자의 응답과 예상 응답이 일치하는 경우 Amazon Cognito는 `answerCorrect` 파라미터를 `true`로 설정합니다.

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (
    event.request.privateChallengeParameters.answer ===
    event.request.challengeAnswer
  ) {
    event.response.answerCorrect = true;
  } else {
    event.response.answerCorrect = false;
  }

  return event;
};

export { handler };
```

------