

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

# 인증 챌린지 정의 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 };
```

------