

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

# Lambda 트리거를 사용하여 사용자 풀 워크플로 사용자 정의
<a name="cognito-user-pools-working-with-lambda-triggers"></a>

Amazon Cognito는 AWS Lambda 함수와 함께 작동하여 사용자 풀의 인증 동작을 수정합니다. 처음 가입하기 전, 인증을 완료한 후, 그리고 그 사이의 여러 단계에서 Lambda 함수를 자동으로 호출하도록 사용자 풀을 구성할 수 있습니다. 함수는 인증 흐름의 기본 동작을 수정하고, API 요청을 통해 사용자 풀 또는 기타 AWS 리소스를 수정하고, 외부 시스템과 통신할 수 있습니다. Lambda 함수의 코드는 사용자 고유의 것입니다. Amazon Cognito는 이벤트 데이터를 함수로 전송하고, 함수가 데이터를 처리할 때까지 기다리며, 대부분의 경우 세션에 적용하려는 변경 사항이 반영된 응답 이벤트를 예상합니다.

요청 및 응답 이벤트 시스템 내에서 자체 인증 챌린지를 도입하고, 사용자 풀과 다른 자격 증명 스토어 간에 사용자를 마이그레이션하고, 메시지를 사용자 지정하고, JSON 웹 토큰(JWT)을 수정할 수 있습니다.

Lambda 트리거는 사용자가 사용자 풀에서 작업을 시작한 후 Amazon Cognito가 사용자에게 전달하는 응답을 사용자 지정할 수 있습니다. 예를 들어, 다른 방법으로는 성공할 수 있는 사용자의 로그인을 막을 수 있습니다. 또한 AWS 환경, 외부 API, 데이터베이스 또는 자격 증명 스토어에 대해 런타임 작업을 수행할 수도 있습니다. 예를 들어 사용자 마이그레이션 트리거는 외부 작업과 Amazon Cognito의 변경을 결합할 수 있습니다. 즉, 외부 디렉터리에서 사용자 정보를 조회한 다음 해당 외부 정보를 기반으로 새 사용자의 속성을 설정할 수 있습니다.

사용자 풀에 Lambda 트리거를 할당하면 Amazon Cognito는 기본 흐름을 중단하여 함수에서 정보를 요청합니다. Amazon Cognito는 JSON 이벤트를 생성하여 함수에 전달합니다.** 해당 이벤트에는 사용자 계정 생성, 로그인, 암호 재설정 또는 속성 업데이트를 위한 사용자의 요청 관련 정보가 포함됩니다. 그러면 함수에서 조치를 취하거나 수정되지 않은 상태로 이벤트를 다시 보낼 수 있습니다. 수정되지 않은 상태로 반환된 이벤트는 사용자 풀에 이벤트의 기본 작업을 진행하도록 알립니다. 예를 들어 사전 가입 트리거는 `PreSignUp_SignUp` 트리거 소스의 사용자를 자동으로 확인할 수 있지만 외부 및 관리자가 생성한 사용자에 대해서는 변경되지 않은 이벤트를 반환할 수 있습니다.

다음 표에는 Lambda 트리거를 사용하여 사용자 풀 작업을 사용자 지정할 수 있는 방법 중 일부가 요약되어 있습니다.


****  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html)

**Topics**
+ [Lambda 트리거에 대해 알아야 할 사항](#important-lambda-considerations)
+ [사용자 풀 Lambda 트리거 추가](#triggers-working-with-lambda)
+ [사용자 풀 Lambda 트리거 이벤트](#cognito-user-pools-lambda-trigger-event-parameter-shared)
+ [사용자 풀 Lambda 트리거 공통 파라미터](#cognito-user-pools-lambda-trigger-syntax-shared)
+ [클라이언트 메타데이터](#working-with-lambda-trigger-client-metadata)
+ [API 작업을 Lambda 트리거에 연결](#lambda-triggers-by-event)
+ [Lambda 트리거를 사용자 풀 기능 작업에 연결](#working-with-lambda-trigger-sources)
+ [사전 가입 Lambda 트리거](user-pool-lambda-pre-sign-up.md)
+ [사후 확인 Lambda 트리거](user-pool-lambda-post-confirmation.md)
+ [사전 인증 Lambda 트리거](user-pool-lambda-pre-authentication.md)
+ [사후 인증 Lambda 트리거](user-pool-lambda-post-authentication.md)
+ [인바운드 페더레이션 Lambda 트리거](user-pool-lambda-inbound-federation.md)
+ [사용자 정의 인증 챌린지 Lambda 트리거](user-pool-lambda-challenge.md)
+ [사전 토큰 생성 Lambda 트리거](user-pool-lambda-pre-token-generation.md)
+ [사용자 마이그레이션 Lambda 트리거](user-pool-lambda-migrate-user.md)
+ [사용자 정의 메시지 Lambda 트리거](user-pool-lambda-custom-message.md)
+ [사용자 지정 발신자 Lambda 트리거](user-pool-lambda-custom-sender-triggers.md)

## Lambda 트리거에 대해 알아야 할 사항
<a name="important-lambda-considerations"></a>

Lambda 함수를 위한 사용자 풀을 준비할 때는 다음을 고려하세요.
+ Amazon Cognito가 Lambda 트리거로 전송하는 이벤트는 새 기능에 따라 변경될 수 있습니다. JSON 계층 구조에서 응답 및 요청 요소의 위치가 변경되거나 요소 이름이 추가될 수 있습니다. Lambda 함수에서 이 가이드에 설명된 입력 요소 키-값 페어를 수신할 것으로 예상할 수 있지만 입력 검증이 엄격해지면 함수가 실패할 수 있습니다.
+ Amazon Cognito가 일부 트리거에 전송하는 여러 버전의 이벤트 중 하나를 선택할 수 있습니다. 일부 버전에서는 Amazon Cognito 요금 변경을 수락해야 할 수 있습니다. 요금에 대한 자세한 내용은 [Amazon Cognito 요금](https://aws.amazon.com/cognito/pricing/) 섹션을 참조하세요. [사전 토큰 생성 Lambda 트리거](user-pool-lambda-pre-token-generation.md)에서 액세스 토큰을 사용자 지정하려면 *Lite*가 아닌 다른 기능 플랜으로 사용자 풀을 구성하고 Lambda 트리거 구성을 업데이트하여 이벤트 버전 2를 사용해야 합니다.
+ [사용자 지정 발신자 Lambda 트리거](user-pool-lambda-custom-sender-triggers.md)를 제외하고, Amazon Cognito는 Lambda 함수를 동기적으로 간접 호출합니다. Amazon Cognito에서 Lambda 함수를 호출하면 5초 내에 응답해야 합니다. 그렇지 않고 호출을 재시도할 수 있는 경우 Amazon Cognito는 호출을 재시도할 수 있습니다. 모든 재시도가 실패하면 함수가 시간 초과됩니다. 이 5초 제한 시간 값은 변경할 수 없습니다. 자세한 내용은 AWS Lambda 개발자 안내서의 [Lambda 프로그래밍 모델을](https://docs.aws.amazon.com/lambda/latest/dg/foundation-progmodel.html) 참조하세요.

  Amazon Cognito는 HTTP 상태 코드가 500-599인 [호출 오류](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_Errors)를 반환하는 함수 호출을 재시도하지 않습니다. 이러한 코드는 Lambda가 함수를 시작할 수 없게 만드는 구성 문제를 나타냅니다. 자세한 내용은 [오류 처리 및 자동 재시도를 참조하세요 AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/invocation-retries.html).
+ Lambda 트리거 구성에서는 함수 버전을 선언할 수 없습니다. Amazon Cognito 사용자 풀은 기본적으로 최신 버전의 함수를 호출합니다. 하지만 [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 요청에서 함수 버전을 별칭과 연결하고 트리거 `LambdaArn`을 별칭 ARN으로 설정할 수 있습니다. AWS Management Console에서는 이 옵션을 사용할 수 없습니다. 별칭에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*의 [Lambda 함수 별칭](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html)을 참조하세요.
+ Lambda 트리거를 삭제하는 경우 사용자 풀의 해당 트리거를 업데이트해야 합니다. 예를 들어 사후 인증 트리거를 삭제하면 해당 사용자 풀의 **사후 인증** 트리거를 **없음**으로 설정해야 합니다.
+ Lambda 함수가 Amazon Cognito에 요청 및 응답 파라미터를 반환하지 않거나 오류를 반환하는 경우 인증 이벤트는 성공하지 못합니다. 함수에서 오류를 반환하여 사용자의 가입, 인증, 토큰 생성 또는 Lambda 트리거를 호출하는 인증 흐름의 다른 단계를 방지할 수 있습니다.

  관리형 로그인은 Lambda 트리거가 생성한 오류를 로그인 프롬프트 위에 오류 텍스트로 반환합니다. Amazon Cognito 사용자 풀 API는 `[trigger] failed with error [error text from response]` 형식으로 트리거 오류를 반환합니다. Lambda 함수에서 사용자에게 표시하려는 오류만 생성하는 것이 좋습니다. `print()`와 같은 출력 방법을 사용하여 민감한 정보나 디버깅 정보를 CloudWatch Logs에 로깅합니다. 예제는 [사전 가입 예: 사용자 이름이 5자 미만인 경우 가입 거부](user-pool-lambda-pre-sign-up.md#aws-lambda-triggers-pre-registration-example-3) 섹션을 참조하세요.
+ 다른의 Lambda 함수를 사용자 풀의 트리거 AWS 계정 로 추가할 수 있습니다. [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 및 [UpdateUserPool](https://docs.aws.amazon.com/) API 작업 또는 CloudFormation 및에서 이에 상응하는 작업을 사용하여 교차 계정 트리거를 추가해야 합니다 AWS CLI. 에서는 교차 계정 함수를 추가할 수 없습니다 AWS Management Console.
+ Amazon Cognito 콘솔에서 Lambda 트리거를 추가하면 Amazon Cognito는 사용자 풀이 함수를 호출하도록 허용하는 리소스 기반 정책을 함수에 추가합니다. Amazon Cognito 콘솔 외부에서 교차 계정 함수를 비롯한 Lambda 트리거를 생성하는 경우, Lambda 함수의 리소스 기반 정책에 권한을 추가해야 합니다. 추가한 권한은 Amazon Cognito가 사용자 풀을 대신하여 함수를 호출하도록 허용해야 합니다. [Lambda 콘솔에서 권한을 추가](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)하거나 Lambda [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html) API 작업을 사용할 수 있습니다.

**Lambda 리소스 기반 정책 예제**  
다음 Lambda 리소스 기반 정책 예제는 Amazon Cognito에 Lambda 함수를 호출할 수 있는 제한적인 권한을 부여합니다. Amazon Cognito는 `aws:SourceArn` 조건의 사용자 풀과 `aws:SourceAccount` 조건의 계정을 둘 다 대신하는 경우에만 함수를 호출할 수 있습니다.

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Id": "default",
      "Statement": [
          {
              "Sid": "LambdaCognitoIdpTrust",
              "Effect": "Allow",
              "Principal": {
                  "Service": "cognito-idp.amazonaws.com"
              },
              "Action": "lambda:InvokeFunction",
              "Resource": "arn:aws:lambda:us-east-1:111122223333:function:MyFunction",
              "Condition": {
                  "StringEquals": {
                      "AWS:SourceAccount": "111122223333"
                  },
                  "ArnLike": {
                      "AWS:SourceArn": "arn:aws:cognito-idp:us-east-1:111122223333:userpool/us-east-1_EXAMPLE"
                  }
              }
          }
      ]
  }
  ```

------

## 사용자 풀 Lambda 트리거 추가
<a name="triggers-working-with-lambda"></a>

**콘솔을 사용하여 사용자 풀 Lambda 트리거를 추가하려면**

1. [Lambda 콘솔](https://console.aws.amazon.com/lambda/home)을 사용하여 Lambda 함수를 생성합니다. Lambda 함수에 대한 자세한 내용은 [AWS Lambda 개발자 가이드](https://docs.aws.amazon.com/lambda/latest/dg/)를 참조하세요.

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)로 이동한 다음 **사용자 풀(User Pools)**을 선택합니다.

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

1. **확장** 메뉴를 선택하고 **Lambda 트리거**를 찾습니다.

1. **Lambda 트리거 추가(Add a Lambda trigger)**를 선택합니다.

1. 사용자 지정할 인증 스테이지에 따라 Lambda 트리거 **범주(Category)**를 선택합니다.

1. **Lambda 함수 할당**을 선택하고 AWS 리전 사용자 풀과 동일한에서 함수를 선택합니다.
**참고**  
 AWS Identity and Access Management (IAM) 자격 증명에 Lambda 함수를 업데이트할 수 있는 권한이 있는 경우 Amazon Cognito는 Lambda 리소스 기반 정책을 추가합니다. 이 정책을 사용하면 선택한 함수를 Amazon Cognito에서 호출할 수 있습니다. 로그인한 자격 증명에 충분한 IAM 권한이 없는 경우 리소스 기반 정책을 별도로 업데이트해야 합니다. 자세한 내용은 [Lambda 트리거에 대해 알아야 할 사항](#important-lambda-considerations) 섹션을 참조하세요.

1. **변경 사항 저장(Save changes)**을 선택합니다.

1. Lambda 콘솔에서 CloudWatch를 사용하여 Lambda 함수를 로그할 수 있습니다. 자세한 내용은 [Lambda에 대한 CloudWatch Logs 액세스](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions-logs.html)를 참조하세요.

## 사용자 풀 Lambda 트리거 이벤트
<a name="cognito-user-pools-lambda-trigger-event-parameter-shared"></a>

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. Lambda 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. 함수가 수정 없이 입력 이벤트를 반환하면 Amazon Cognito는 기본 동작을 진행합니다. 다음은 모든 Lambda 트리거 입력 이벤트에 공통적인 파라미터를 보여줍니다. 트리거별 이벤트 구문의 경우 각 트리거에 대해 이 가이드의 섹션에 있는 이벤트 스키마를 검토합니다.

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

```
{
    "version": "string",
    "triggerSource": "string",
    "region": AWSRegion,
    "userPoolId": "string",
    "userName": "string",
    "callerContext": 
        {
            "awsSdkVersion": "string",
            "clientId": "string"
        },
    "request":
        {
            "userAttributes": {
                "string": "string",
                ....
            }
        },
    "response": {}
}
```

------

## 사용자 풀 Lambda 트리거 공통 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-shared"></a>

**버전**  
Lambda 함수의 버전 번호입니다.

**triggerSource**  
Lambda 함수를 트리거한 이벤트의 이름입니다. 각 triggerSource의 설명은 [Lambda 트리거를 사용자 풀 기능 작업에 연결](#working-with-lambda-trigger-sources) 섹션을 참조하세요.

**리전**  
`AWSRegion` 인스턴스 AWS 리전 로서의 .

**userPoolId**  
사용자 풀의 ID입니다.

**userName**  
현재 사용자의 사용자 이름입니다.

**callerContext**  
요청 및 코드 환경에 대한 메타데이터입니다. 여기에는 **awsSdkVersion** 및 **clientId** 필드가 포함됩니다.    
**awsSdkVersion**  
요청을 생성한 AWS SDK의 버전입니다.  
****clientId****  
사용자 풀 앱 클라이언트의 ID입니다.

**request**  
사용자의 API 요청 세부 정보입니다. 여기에는 다음 필드와 해당 트리거에 해당하는 모든 요청 파라미터가 포함됩니다. 예를 들어 Amazon Cognito가 사전 인증 트리거에 전송하는 이벤트에는 `userNotFound` 파라미터도 포함됩니다. 사용자가 등록되지 않은 사용자 이름으로 로그인하려고 할 때 이 파라미터의 값을 처리하여 사용자 지정 작업을 수행할 수 있습니다.    
**userAttributes**  
사용자 속성 이름 및 값의 키 값 페어(1개 이상)입니다. 예: `"email": "john@example.com"`.

**response**  
이 파라미터는 원래 요청의 정보를 포함하지 않습니다. Lambda 함수는 전체 이벤트를 Amazon Cognito에 반환하고 모든 반환 파라미터를 `response`에 추가해야 합니다. 함수에 포함할 수 있는 반환 파라미터를 보려면 사용하려는 트리거에 대한 설명서를 참조하세요.

## 클라이언트 메타데이터
<a name="working-with-lambda-trigger-client-metadata"></a>

API 작업 및 [Token 엔드포인트](token-endpoint.md) 요청에서 Lambda 트리거 함수에 사용자 지정 파라미터를 제출할 수 있습니다. 클라이언트 메타데이터를 사용하면 애플리케이션이 요청이 발생한 환경에 대한 추가 정보를 수집할 수 있습니다. Lambda 함수에 클라이언트 메타데이터를 전달하면 추가 데이터를 처리하고 인증 흐름의 로깅 또는 사용자 지정에 사용할 수 있습니다. 클라이언트 메타데이터는 JSON 키-값 형식의 선택 및 설계 문자열 페어입니다.

**클라이언트 메타데이터 사용 사례 예시**
+ 가입 시 지리 위치 데이터를 [사전 가입 트리거](user-pool-lambda-pre-sign-up.md)에 전달하고 원치 않는 위치에서 로그인하지 않도록 합니다.
+ 테넌트 ID 데이터를 [사용자 지정 문제 트리거](user-pool-lambda-challenge.md)에 전달하고 다양한 사업부의 고객에게 다양한 문제를 발행합니다.
+ 사용자의 토큰을 [사전 토큰 생성 트리거](user-pool-lambda-pre-token-generation.md)에 전달하고 M2M 요청이 대신 수행된 보안 주체의 로그를 생성합니다. 요청 예시는 [기본 권한이 있는 클라이언트 자격 증명POST 본문 권한이 있는 클라이언트 자격 증명](token-endpoint.md#exchanging-client-credentials-for-an-access-token-in-request-body) 섹션을 참조하세요.

다음은 클라이언트 메타데이터를 사전 가입 트리거에 전달하는 예입니다.

------
#### [ SignUp request ]

다음은 Amazon Cognito가 사전 가입 트리거에 전달하는 클라이언트 메타데이터가 있는 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html#CognitoUserPools-SignUp-request-ValidationData) 요청의 예입니다.

```
POST HTTP/1.1
Host: cognito-idp.us-east-1.amazonaws.com
X-Amz-Date: 20230613T200059Z
Accept-Encoding: gzip, deflate, br
X-Amz-Target: AWSCognitoIdentityProviderService.SignUp
User-Agent: <UserAgentString>
Authorization: AWS4-HMAC-SHA256 Credential=<Credential>, SignedHeaders=<Headers>, Signature=<Signature>
Content-Length: <PayloadSizeBytes>

{
    "ClientId": "1example23456789",
    "Username": "mary_major",
    "Password": "<Password>",
    "SecretHash": "<Secret hash>",
    "ClientMetadata": { 
        "IpAddress" : "192.0.2.252",
        "GeoLocation" : "Netherlands (Kingdom of the) [NL]"
    }
    "UserAttributes": [
        {
            "Name": "name",
            "Value": "Mary"
        },
        {
            "Name": "email",
            "Value": "mary_major@example.com"
        },
        {
            "Name": "phone_number",
            "Value": "+12065551212"
        }
    ],
}
```

------
#### [ Lambda trigger input event ]

그러면 사전 가입 함수에 다음과 같은 요청 본문이 생성됩니다.

```
{
    "callerContext": {
        "awsSdkVersion": "aws-sdk-unknown-unknown",
        "clientId": "1example23456789"
    },
    "region": "us-west-2",
    "request": {
        "clientMetadata": {
            "GeoLocation": "Netherlands (Kingdom of the) [NL]",
            "IpAddress": "192.0.2.252"
        },
        "userAttributes": {
            "email": "mary_major@example.com",
            "name": "Mary",
            "phone_number": "+12065551212"
        },
        "validationData": null
    },
    "response": {
        "autoConfirmUser": false,
        "autoVerifyEmail": false,
        "autoVerifyPhone": false
    },
    "triggerSource": "PreSignUp_SignUp",
    "userName": "mary_major2",
    "userPoolId": "us-west-2_EXAMPLE",
    "version": "1"
}
```

------

**M2M(머신 간) 클라이언트 자격 증명을 위한 클라이언트 메타데이터**  
M2M 요청에서 [클라이언트 메타데이터](#working-with-lambda-trigger-client-metadata)를 전달할 수 있습니다. 클라이언트 메타데이터는 [사전 토큰 생성 Lambda 트리거](user-pool-lambda-pre-token-generation.md)의 결과에 기여할 수 있는 사용자 또는 애플리케이션 환경의 추가 정보입니다. 사용자 보안 주체를 사용한 인증 작업에서 [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 요청 본문의 사전 토큰 생성 트리거에 클라이언트 메타데이터를 전달할 수 있습니다. 애플리케이션은 [Token 엔드포인트](token-endpoint.md)에 대한 직접 요청으로 M2M에 대한 액세스 토큰 생성을 위한 흐름을 수행하므로 모델이 다릅니다. 클라이언트 자격 증명에 대한 토큰 요청의 POST 본문에서 클라이언트 메타데이터 객체 URL 인코딩(`x-www-form-urlencoded`)이 포함된 `aws_client_metadata` 파라미터를 문자열에 전달합니다. 요청 예시는 [기본 권한이 있는 클라이언트 자격 증명POST 본문 권한이 있는 클라이언트 자격 증명](token-endpoint.md#exchanging-client-credentials-for-an-access-token-in-request-body) 섹션을 참조하세요. 다음은 키-값 페어 `{"environment": "dev", "language": "en-US"}`를 전달하는 예제 파라미터입니다.

```
aws_client_metadata=%7B%22environment%22%3A%20%22dev%22,%20%22language%22%3A%20%22en-US%22%7D
```

**임시 사용자 속성: `validationData`**  
일부 인증 작업에는 `validationData` 파라미터도 있습니다. 클라이언트 메타데이터와 마찬가지로 Amazon Cognito가 자동으로 Lambda 트리거에 수집하지 않는 외부 정보를 전달할 수 있는 기회입니다. 검증 데이터 필드는 가입 및 로그인 작업에서 추가 사용자 컨텍스트와 함께 Lambda 함수를 제공하기 위한 것입니다. [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html#CognitoUserPools-SignUp-request-ValidationData) 및 [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html#CognitoUserPools-AdminCreateUser-request-ValidationData)는 `validationData`를 [사전 가입 트리거](user-pool-lambda-pre-sign-up.md)에 전달합니다. [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-ClientMetadata) 및 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-ClientMetadata)는 입력 이벤트의 `validationData`와 같이 API 요청 본문의 `ClientMetadata`을 [사전 인증](user-pool-lambda-pre-authentication.md) 및 [마이그레이션 사용자](user-pool-lambda-migrate-user.md) 트리거에 전달합니다.

API 작업을 클라이언트 메타데이터를 전달할 수 있는 함수에 매핑하려면 다음 트리거 소스 섹션을 참조하세요.

## API 작업을 Lambda 트리거에 연결
<a name="lambda-triggers-by-event"></a>

다음 섹션에서는 Amazon Cognito가 사용자 풀의 활동에서 호출하는 Lambda 트리거를 설명합니다.

앱이 Amazon Cognito 사용자 풀 API, 관리형 로그인 또는 사용자 풀 엔드포인트를 통해 사용자를 로그인하면 Amazon Cognito는 세션 컨텍스트를 기반으로 Lambda 함수를 호출합니다. Amazon Cognito 사용자 풀 API와 사용자 풀 엔드포인트에 대한 자세한 내용은 [API, OIDC 및 관리형 로그인 페이지 인증 이해](authentication-flows-public-server-side.md#user-pools-API-operations)을 참조하세요. 다음 섹션의 표에서는 Amazon Cognito가 함수를 호출하도록 하는 이벤트와 Amazon Cognito가 요청에 포함하는 `triggerSource` 문자열을 설명합니다.

**Topics**
+ [Amazon Cognito API의 Lambda 트리거](#lambda-triggers-native-users-native-api)
+ [관리형 로그인에서 Amazon Cognito 로컬 사용자를 위한 Lambda 트리거](#lambda-triggers-native-users-hosted-UI)
+ [페더레이션 사용자를 위한 Lambda 트리거](#lambda-triggers-for-federated-users)

### Amazon Cognito API의 Lambda 트리거
<a name="lambda-triggers-native-users-native-api"></a>

다음 표에서는 앱이 사용자 풀 로컬 사용자를 생성, 로그인 또는 업데이트할 때 Amazon Cognito가 호출할 수 있는 Lambda 트리거의 소스 문자열을 설명합니다.


**Amazon Cognito API의 로컬 사용자 트리거 소스**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html)

### 관리형 로그인에서 Amazon Cognito 로컬 사용자를 위한 Lambda 트리거
<a name="lambda-triggers-native-users-hosted-UI"></a>

다음 표에서는 로컬 사용자가 관리형 로그인을 사용하여 사용자 풀에 로그인할 때 Amazon Cognito가 호출할 수 있는 Lambda 트리거의 소스 문자열을 설명합니다.


**관리형 로그인의 로컬 사용자 트리거 소스**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html)

### 페더레이션 사용자를 위한 Lambda 트리거
<a name="lambda-triggers-for-federated-users"></a>

다음 Lambda 트리거를 사용하여 페더레이션 공급자로 로그인하는 사용자에 대한 사용자 풀 워크플로를 사용자 지정할 수 있습니다.

**참고**  
페더레이션 사용자는 관리형 로그인을 사용하여 로그인할 수 있습니다. 또는 자격 증명 공급자 로그인 페이지로 해당 사용자를 자동 리디렉션하는 [권한 부여 엔드포인트](authorization-endpoint.md)에 대한 요청을 귀하가 생성하는 방법도 있습니다. Amazon Cognito 사용자 풀 API를 사용하여 페더레이션 사용자를 로그인할 수 없습니다.


**페더레이션 사용자 트리거 소스**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html)

페더레이션 로그인은 사용자 풀에서 [사용자 정의 인증 챌린지 Lambda 트리거](user-pool-lambda-challenge.md), [사용자 마이그레이션 Lambda 트리거](user-pool-lambda-migrate-user.md), [사용자 정의 메시지 Lambda 트리거](user-pool-lambda-custom-message.md) 또는 [사용자 지정 발신자 Lambda 트리거](user-pool-lambda-custom-sender-triggers.md)를 호출하지 않습니다.

## Lambda 트리거를 사용자 풀 기능 작업에 연결
<a name="working-with-lambda-trigger-sources"></a>

각 Lambda 트리거는 사용자 풀에서 기능적 역할을 수행합니다. 예를 들어 트리거는 가입 흐름을 수정하거나 사용자 지정 인증 문제를 추가할 수 있습니다. Amazon Cognito가 Lambda 함수로 보내는 이벤트는 해당 기능적 역할을 구성하는 여러 작업 중 하나를 반영할 수 있습니다. 예를 들어, Amazon Cognito는 사용자가 가입할 때와 귀하가 사용자를 생성할 때 가입 전 트리거를 호출합니다. 동일한 기능적 역할에 대해 서로 다른 이러한 사례는 각각 고유한 `triggerSource` 값을 지닙니다. Lambda 함수는 해당 함수를 호출한 작업에 따라 수신 이벤트를 다르게 처리할 수 있습니다.

또한 Amazon Cognito는 이벤트가 트리거 소스에 해당하는 경우 할당된 모든 함수를 호출합니다. 예를 들어, 마이그레이션 사용자 및 인증 전 트리거를 할당한 사용자 풀에 사용자가 로그인하면 두 가지가 모두 활성화됩니다.


**가입, 확인 및 로그인(인증) 트리거**  

| 트리거 | triggerSource 값 | Event | 
| --- | --- | --- | 
| 사전 가입 | PreSignUp\$1SignUp | 사전 가입. | 
| 사전 가입 | PreSignUp\$1AdminCreateUser | 관리자가 새 사용자를 만들면 사전 가입. | 
| 사전 가입 | PreSignUp\$1ExternalProvider | 외부 자격 증명 공급자에 대한 사전 가입. | 
| 게시 확인 | PostConfirmation\$1ConfirmSignUp | 사후 가입 확인. | 
| 게시 확인 | PostConfirmation\$1ConfirmForgotPassword | 사후 암호 분실 확인. | 
| 사전 인증 | PreAuthentication\$1Authentication | 사전 인증. | 
| 사후 인증 | PostAuthentication\$1Authentication | 사후 인증. | 


**사용자 지정 인증 문제 트리거**  

| 트리거 | triggerSource 값 | Event | 
| --- | --- | --- | 
| 인증 문제 정의 | DefineAuthChallenge\$1Authentication | 인증 문제 정의. | 
| 인증 문제 생성 | CreateAuthChallenge\$1Authentication | 인증 문제 생성. | 
| 인증 문제 확인 | VerifyAuthChallengeResponse\$1Authentication | 인증 문제 응답 확인. | 


**페더레이션 트리거**  

| 트리거 | triggerSource 값 | Event | 
| --- | --- | --- | 
| 인바운드 페더레이션 | InboundFederation\$1ExternalProvider | 인바운드 페더레이션. | 


**사전 토큰 생성 트리거**  

| 트리거 | triggerSource 값 | Event | 
| --- | --- | --- | 
| 사전 토큰 생성 | TokenGeneration\$1HostedAuth |  Amazon Cognito는 관리형 로그인 페이지에서 사용자를 인증합니다. | 
| 사전 토큰 생성 | TokenGeneration\$1Authentication | 사용자 인증 또는 토큰 새로 고침이 완료되었습니다. | 
| 사전 토큰 생성 | TokenGeneration\$1NewPasswordChallenge | 관리자가 사용자를 생성합니다. Amazon Cognito는 사용자가 임시 암호를 변경해야 할 때 이를 호출합니다. | 
| 사전 토큰 생성 | TokenGeneration\$1AuthenticateDevice | 사용자 디바이스 인증의 끝입니다. | 
| 사전 토큰 생성 | TokenGeneration\$1RefreshTokens | 사용자가 자격 증명 및 액세스 토큰을 새로 고치려고 합니다. | 


**사용자 트리거 마이그레이션**  

| 트리거 | triggerSource 값 | Event | 
| --- | --- | --- | 
| 사용자 마이그레이션 | UserMigration\$1Authentication | 로그인 시 사용자 마이그레이션입니다. | 
| 사용자 마이그레이션 | UserMigration\$1ForgotPassword | 암호 찾기 흐름 도중 사용자 마이그레이션. | 


**사용자 지정 메시지 트리거**  

| 트리거 | triggerSource 값 | Event | 
| --- | --- | --- | 
| 사용자 지정 메시지 | CustomMessage\$1SignUp | 사용자가 사용자 풀에 가입할 때 사용자 지정 메시지입니다. | 
| 사용자 지정 메시지 | CustomMessage\$1AdminCreateUser | 관리자로서의 사용자가 생성되고 Amazon Cognito에서 이 사용자에게 임시 암호를 보낼 때 사용자 지정 메시지입니다. | 
| 사용자 지정 메시지 | CustomMessage\$1ResendCode | 기존 사용자가 새 확인 코드를 요청할 때 사용자 지정 메시지입니다. | 
| 사용자 지정 메시지 | CustomMessage\$1ForgotPassword | 사용자가 암호 재설정을 요청할 때 사용자 지정 메시지입니다. | 
| 사용자 지정 메시지 | CustomMessage\$1UpdateUserAttribute | 사용자가 이메일 주소 또는 전화 번호를 변경하고 Amazon Cognito에서 확인 코드를 보낼 때 사용자 지정 메시지입니다. | 
| 사용자 지정 메시지 | CustomMessage\$1VerifyUserAttribute | 사용자가 이메일 주소 또는 전화 번호를 추가하고 Amazon Cognito에서 확인 코드를 보낼 때 사용자 지정 메시지입니다. | 
| 사용자 지정 메시지 | CustomMessage\$1Authentication | SMS MFA를 구성한 사용자가 로그인할 때 사용자 지정 메시지입니다. | 


**사용자 지정 발신자 트리거**  

| 트리거 | triggerSource 값 | Event | 
| --- | --- | --- | 
| 사용자 지정 발신자 |  `CustomEmailSender_SignUp` `CustomSmsSender_SignUp`  | 사용자가 사용자 풀에 가입하는 경우. | 
| 사용자 지정 발신자 |  `CustomEmailSender_AdminCreateUser` `CustomSmsSender_AdminCreateUser`  | 사용자를 관리자로 생성하면 Amazon Cognito에서 해당 사용자에게 임시 암호를 보냅니다. | 
| 사용자 지정 발신자 |  `CustomEmailSender_ForgotPassword` `CustomSmsSender_ForgotPassword`  | 사용자가 암호 재설정을 요청하는 경우. | 
| 사용자 지정 발신자 |  `CustomEmailSender_UpdateUserAttribute` `CustomSmsSender_UpdateUserAttribute`  | 사용자가 이메일 주소 또는 전화 번호를 변경하고 Amazon Cognito에서 확인 코드를 보낼 때. | 
| 사용자 지정 발신자 |  `CustomEmailSender_VerifyUserAttribute` `CustomSmsSender_VerifyUserAttribute`  | 사용자가 이메일 주소 또는 전화 번호를 추가하고 Amazon Cognito에서 확인 코드를 보내는 경우. | 
| 사용자 지정 발신자 |  `CustomEmailSender_Authentication` `CustomSmsSender_Authentication`  | SMS 또는 이메일을 구성한 사용자가 로그인하는 경우. | 
| 사용자 지정 발신자 | CustomEmailSender\$1AccountTakeOverNotification | 위협 방지 설정이 사용자의 로그인 시도에 대해 자동화된 조치를 취하고 위험 수준에 대한 조치에 알림이 포함된 경우. | 

# 사전 가입 Lambda 트리거
<a name="user-pool-lambda-pre-sign-up"></a>

셀프 서비스 가입 옵션이 있는 사용자 풀에서 가입 프로세스를 사용자 지정할 수 있습니다. 가입 전 트리거의 몇 가지 일반적인 용도는 새 사용자의 사용자 지정 분석 및 기록을 수행하거나, 보안 및 거버넌스 표준을 적용하거나, 타사 IdP의 사용자를 [통합 사용자 프로필](cognito-user-pools-identity-federation-consolidate-users.md)에 연결하는 것입니다. [검증 및 확인](signing-up-users-in-your-app.md)을 거치지 않아도 되는 신뢰할 수 있는 사용자가 있을 수도 있습니다.

Amazon Cognito가 새로운 [로컬](cognito-terms.md#terms-localuser) 또는 [페더레이션](cognito-terms.md#terms-federateduser) 사용자 생성을 완료하기 직전에 사전 가입 Lambda 함수를 활성화합니다. 이 함수로 전송된 요청 객체의 `userAttributes`에는 로컬 사용자 가입에서 제공하거나 페더레이션 사용자의 공급자 속성에서 성공적으로 매핑된 속성이 포함되어 있습니다. 사용자 풀은 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html)을 사용한 셀프 서비스 가입 또는 신뢰할 수 있는 [ID 공급업체](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-federated)를 사용한 최초 로그인과 [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html)를 사용한 사용자 생성 시이 트리거를 호출합니다. 가입 프로세스의 일환으로 이 함수를 사용하여 사용자 지정 로직으로 로그인 이벤트를 분석하고 새 사용자를 수정하거나 거부할 수 있습니다.

**Topics**
+ [사전 가입 Lambda 트리거 파라미터](#cognito-user-pools-lambda-trigger-syntax-pre-signup)
+ [사전 가입 예제: 등록된 도메인의 사용자 자동 확인](#aws-lambda-triggers-pre-registration-example)
+ [사전 가입 예제: 모든 사용자 자동 확인 및 자동 검증](#aws-lambda-triggers-pre-registration-example-2)
+ [사전 가입 예: 사용자 이름이 5자 미만인 경우 가입 거부](#aws-lambda-triggers-pre-registration-example-3)

## 사전 가입 Lambda 트리거 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-pre-signup"></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",
            . . .
        },
        "validationData": {
            "string": "string",
            . . .
         },
        "clientMetadata": {
            "string": "string",
            . . .
         }
    },

    "response": {
        "autoConfirmUser": "boolean",
        "autoVerifyPhone": "boolean",
        "autoVerifyEmail": "boolean"
    }
}
```

------

### 사전 가입 요청 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-pre-signup-request"></a>

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

**validationData**  
새 사용자 생성 요청 시 앱이 Amazon Cognito에 전달한 사용자 속성 데이터가 포함된 하나 이상의 키-값 페어입니다. [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html) 또는 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) API 요청의 ValidationData 파라미터를 통해 Lambda 함수에 이 정보를 보냅니다.  
Amazon Cognito는 ValidationData 데이터를 생성된 사용자의 속성으로 설정하지 않습니다. ValidationData는 사전 가입 Lambda 트리거 목적으로 제공하는 임시 사용자 정보입니다.

**clientMetadata**  
사전 가입 트리거에 지정하는 Lambda 함수에 사용자 지정 입력으로 제공할 수 있는 하나 이상의 키-값 페어입니다. 다음 API 작업에서 ClientMetadata 파라미터를 사용하여 이 데이터를 Lambda 함수에 전달할 수 있습니다. [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html), [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html), [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) 및 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html).

### 사전 가입 응답 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-pre-signup-response"></a>

사용자를 자동으로 확인하려면 응답에서 `autoConfirmUser`를 `true`로 설정하면 됩니다. `autoVerifyEmail`을 `true`로 설정하여 사용자 이메일을 자동으로 확인할 수 있습니다. `autoVerifyPhone`을 `true`로 설정하여 사용자 전화 번호를 자동으로 확인할 수 있습니다.

**참고**  
응답 파라미터 `autoVerifyPhone`, `autoVerifyEmail` 및 `autoConfirmUser`는 `AdminCreateUser` API에 의해 사전 가입 Lambda 함수가 트리거될 때 Amazon Cognito에서 무시됩니다.

**autoConfirmUser**  
사용자를 자동으로 확인하려면 `true`로 설정하고 그렇지 않으면 `false`로 설정합니다.

**autoVerifyEmail**  
가입 중인 사용자의 이메일 주소를 확인한 것으로 설정하려면 `true`로 설정하고 그렇지 않으면 `false`로 설정합니다. `autoVerifyEmail`이 `true`로 설정되면 `email` 속성에 null이 아닌 유효한 값이 있어야 합니다. 그렇지 않으면 오류가 발생하고 사용자가 가입을 완료할 수 없습니다.  
`email` 속성이 별칭으로 선택된 경우 `autoVerifyEmail`이 설정되면 사용자 이메일 주소의 별칭이 생성됩니다. 해당 이메일 주소의 별칭이 이미 있으면 별칭이 새 사용자로 이동하고 이전 사용자의 이메일 주소는 확인되지 않은 것으로 표시됩니다. 자세한 내용은 [로그인 속성 사용자 지정](user-pool-settings-attributes.md#user-pool-settings-aliases) 섹션을 참조하세요.

**autoVerifyPhone**  
가입 중인 사용자의 전화 번호를 확인한 것으로 설정하려면 `true`로 설정하고 그렇지 않으면 `false`로 설정합니다. `autoVerifyPhone`이 `true`로 설정되면 `phone_number` 속성에 null이 아닌 유효한 값이 있어야 합니다. 그렇지 않으면 오류가 발생하고 사용자가 가입을 완료할 수 없습니다.  
`phone_number` 속성이 별칭으로 선택될 경우 `autoVerifyPhone`이 설정되면 사용자 전화 번호의 별칭이 생성됩니다. 해당 전화 번호의 별칭이 이미 있으면 별칭이 새 사용자로 이동하고 이전 사용자의 전화번호는 확인되지 않은 것으로 표시됩니다. 자세한 내용은 [로그인 속성 사용자 지정](user-pool-settings-attributes.md#user-pool-settings-aliases) 단원을 참조하십시오.

## 사전 가입 예제: 등록된 도메인의 사용자 자동 확인
<a name="aws-lambda-triggers-pre-registration-example"></a>

다음은 Lambda 트리거 코드의 예입니다. Amazon Cognito가 가입 요청을 처리하기 직전에 사전 가입 트리거가 호출됩니다. 이 트리거는 사용자 지정 속성 **custom:domain**을 사용하여 특정 이메일 도메인의 신규 사용자를 자동으로 확인할 수 있습니다. 사용자 지정 도메인에 없는 모든 신규 사용자가 사용자 풀에 추가되지만 자동으로 확인되지는 않습니다.

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

```
export const handler = async (event, context, callback) => {
  // Set the user pool autoConfirmUser flag after validating the email domain
  event.response.autoConfirmUser = false;

  // Split the email address so we can compare domains
  var address = event.request.userAttributes.email.split("@");

  // This example uses a custom attribute "custom:domain"
  if (event.request.userAttributes.hasOwnProperty("custom:domain")) {
    if (event.request.userAttributes["custom:domain"] === address[1]) {
      event.response.autoConfirmUser = true;
    }
  }

  // Return to Amazon Cognito
  callback(null, event);
};
```

------
#### [ Python ]

```
def lambda_handler(event, context):
    # It sets the user pool autoConfirmUser flag after validating the email domain
    event['response']['autoConfirmUser'] = False

    # Split the email address so we can compare domains
    address = event['request']['userAttributes']['email'].split('@')

    # This example uses a custom attribute 'custom:domain'
    if 'custom:domain' in event['request']['userAttributes']:
        if event['request']['userAttributes']['custom:domain'] == address[1]:
            event['response']['autoConfirmUser'] = True

    # Return to Amazon Cognito
    return event
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
    "request": {
        "userAttributes": {
            "email": "testuser@example.com",
            "custom:domain": "example.com"
        }
    },
    "response": {}
}
```

------

## 사전 가입 예제: 모든 사용자 자동 확인 및 자동 검증
<a name="aws-lambda-triggers-pre-registration-example-2"></a>

이 예에서는 모든 사용자를 자동으로 컨펌하고, 속성이 있는 경우에 확인된 것으로 사용자의 `email` 및 `phone_number` 속성을 설정합니다. 그리고 별칭 기능이 활성화되어 있으면 자동 확인이 설정될 때 `phone_number` 및 `email`에 대한 별칭이 생성됩니다.

**참고**  
해당 전화 번호의 별칭이 이미 있으면 별칭이 새 사용자로 이동하고 이전 사용자의 `phone_number`는 확인되지 않은 것으로 표시됩니다. 이메일 주소도 마찬가지입니다. 사용자 풀 [ListUsers API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html)를 사용하여 기존 사용자가 신규 사용자의 전화 번호나 이메일 주소를 이미 별칭으로 사용하고 있는지 확인하여 이를 방지할 수 있습니다.

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

```
exports.handler = (event, context, callback) => {
  // Confirm the user
  event.response.autoConfirmUser = true;

  // Set the email as verified if it is in the request
  if (event.request.userAttributes.hasOwnProperty("email")) {
    event.response.autoVerifyEmail = true;
  }

  // Set the phone number as verified if it is in the request
  if (event.request.userAttributes.hasOwnProperty("phone_number")) {
    event.response.autoVerifyPhone = true;
  }

  // Return to Amazon Cognito
  callback(null, event);
};
```

------
#### [ Python ]

```
def lambda_handler(event, context):
    # Confirm the user
    event['response']['autoConfirmUser'] = True

    # Set the email as verified if it is in the request
    if 'email' in event['request']['userAttributes']:
        event['response']['autoVerifyEmail'] = True

    # Set the phone number as verified if it is in the request
    if 'phone_number' in event['request']['userAttributes']:
        event['response']['autoVerifyPhone'] = True

    # Return to Amazon Cognito
    return event
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
  "request": {
    "userAttributes": {
      "email": "user@example.com",
      "phone_number": "+12065550100"
    }
  },
  "response": {}
}
```

------

## 사전 가입 예: 사용자 이름이 5자 미만인 경우 가입 거부
<a name="aws-lambda-triggers-pre-registration-example-3"></a>

이 예에서는 가입 요청에서 사용자 이름의 길이를 확인합니다. 이 예에서는 사용자가 5자 미만의 이름을 입력한 경우 오류를 반환합니다.

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

```
export const handler = (event, context, callback) => {
    // Impose a condition that the minimum length of the username is 5 is imposed on all user pools.
    if (event.userName.length < 5) {
        var error = new Error("Cannot register users with username less than the minimum length of 5");
        // Return error to Amazon Cognito
        callback(error, event);
    }
    // Return to Amazon Cognito
    callback(null, event);
};
```

------
#### [ Python ]

```
def lambda_handler(event, context):
    if len(event['userName']) < 5:
        raise Exception("Cannot register users with username less than the minimum length of 5")
    # Return to Amazon Cognito
    return event
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
  "userName": "rroe",
  "response": {}
}
```

------

# 사후 확인 Lambda 트리거
<a name="user-pool-lambda-post-confirmation"></a>

Amazon Cognito는 가입한 사용자가 사용자 계정을 확인한 후 이 트리거를 호출합니다. 사후 확인 Lambda 함수에서 사용자 지정 메시지를 보내거나 사용자 지정 API 요청을 추가할 수 있습니다. 예를 들어 외부 시스템을 쿼리하고 사용자에게 추가 속성을 채울 수 있습니다. Amazon Cognito는 사용자 풀에 등록한 사용자에 대해서만 이 트리거를 호출하고 관리자 보안 인증 정보로 생성한 사용자 계정에 대해서는 호출하지 않습니다.

요청에는 확인된 사용자의 현재 속성이 포함됩니다. 사용자 풀은 [ConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html), [AdminConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminConfirmSignUp.html) 및 [ConfirmForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html)에서 사후 확인 함수를 호출합니다. 이 트리거는 사용자가 [관리형 로그인](cognito-user-pools-managed-login.md)에서 가입 또는 암호 재설정을 확인할 때도 실행됩니다.

**Topics**
+ [사후 확인 Lambda 트리거 파라미터](#cognito-user-pools-lambda-trigger-syntax-post-confirmation)
+ [사후 확인 예제](#aws-lambda-triggers-post-confirmation-example)

## 사후 확인 Lambda 트리거 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-post-confirmation"></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",
                . . .
            },
            "clientMetadata": {
            	"string": "string",
            	. . .
            }
        },
    "response": {}
}
```

------

### 사후 확인 요청 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-post-confirmation-request"></a>

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

**clientMetadata**  
사후 확인 트리거에 지정하는 Lambda 함수에 사용자 지정 입력으로 제공할 수 있는 하나 이상의 키-값 페어입니다. 다음 API 작업에서 ClientMetadata 파라미터를 사용하여 이 데이터를 Lambda 함수에 전달할 수 있습니다. [AdminConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminConfirmSignUp.html), [ConfirmForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html), [ConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html) 및 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html).

### 사후 확인 응답 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-post-confirmation-response"></a>

응답에는 추가적인 반환 정보가 없습니다.

## 사후 확인 예제
<a name="aws-lambda-triggers-post-confirmation-example"></a>

이 예에서 Lambda 함수는 Amazon SES를 사용하여 사용자에게 확인 이메일 메시지를 전송합니다. 자세한 내용은 [Amazon Simple Storage Service 개발자 가이드](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/)를 참조하세요.

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

```
// Import required AWS SDK clients and commands for Node.js. Note that this requires
// the `@aws-sdk/client-ses` module to be either bundled with this code or included
// as a Lambda layer.
import { SES, SendEmailCommand } from "@aws-sdk/client-ses";
const ses = new SES();

const handler = async (event) => {
  if (event.request.userAttributes.email) {
    await sendTheEmail(
      event.request.userAttributes.email,
      `Congratulations ${event.userName}, you have been confirmed.`,
    );
  }
  return event;
};

const sendTheEmail = async (to, body) => {
  const eParams = {
    Destination: {
      ToAddresses: [to],
    },
    Message: {
      Body: {
        Text: {
          Data: body,
        },
      },
      Subject: {
        Data: "Cognito Identity Provider registration completed",
      },
    },
    // Replace source_email with your SES validated email address
    Source: "<source_email>",
  };
  try {
    await ses.send(new SendEmailCommand(eParams));
  } catch (err) {
    console.log(err);
  }
};

export { handler };
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
    "request": {
        "userAttributes": {
            "email": "user@example.com",
            "email_verified": true
        }
    },
    "response": {}
}
```

------

# 사전 인증 Lambda 트리거
<a name="user-pool-lambda-pre-authentication"></a>

예비 작업을 수행하는 사용자 지정 검증을 생성할 수 있도록 사용자가 로그인을 시도할 때 Amazon Cognito가 이 트리거를 호출합니다. 예를 들어 인증 요청을 거부하거나 세션 데이터를 외부 시스템에 기록할 수 있습니다.

**참고**  
이 Lambda 트리거는 사용자 풀 앱 클라이언트의 `PreventUserExistenceErrors` 설정이 `ENABLED`로 설정되어 있지 않으면 사용자가 존재하지 않는 경우 활성화되지 않습니다. 기존 인증 세션을 갱신해도 이 트리거가 활성화되지 않습니다.

**Topics**
+ [흐름 개요](#user-pool-lambda-pre-authentication-1)
+ [사전 인증 Lambda 트리거 파라미터](#cognito-user-pools-lambda-trigger-syntax-pre-auth)
+ [사전 인증 예제](#aws-lambda-triggers-pre-authentication-example)

## 흐름 개요
<a name="user-pool-lambda-pre-authentication-1"></a>

![\[사전 인증 Lambda 트리거 - 클라이언트 흐름\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/lambda-pre-authentication-1.png)


요청에는 앱이 사용자 풀 `InitiateAuth` 및 `AdminInitiateAuth` API 작업에 전달하는 `ClientMetadata` 값에 있는 클라이언트 검증 데이터가 포함됩니다.

자세한 내용은 [인증 세션의 예](authentication.md#amazon-cognito-user-pools-authentication-flow) 단원을 참조하십시오.

## 사전 인증 Lambda 트리거 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-pre-auth"></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",
            . . .
        },
        "validationData": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {}
}
```

------

### 사전 인증 요청 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-pre-auth-request"></a>

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

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

**validationData**  
사용자 로그인 요청에 검증 데이터를 포함하는 하나 이상의 키-값 페어입니다. 이 데이터를 Lambda 함수에 전달하려면 [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 작업에서 ClientMetadata 파라미터를 사용합니다.

### 사전 인증 응답 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-pre-auth-response"></a>

Amazon Cognito는 함수가 응답에서 반환하는 추가 정보를 처리하지 않습니다. 함수가 오류를 반환하여 로그인 시도를 거부하거나 API 작업을 사용하여 리소스를 쿼리하고 수정할 수 있습니다.

## 사전 인증 예제
<a name="aws-lambda-triggers-pre-authentication-example"></a>

이 예제 함수는 사용자가 특정 앱 클라이언트로 사용자 풀에 로그인하지 못하도록 합니다. 사전 인증 Lambda 함수는 사용자에게 기존 세션이 있을 때는 호출하지 않기 때문에 이 함수는 차단하려는 앱 클라이언트 ID가 있는 *새* 세션만 방지합니다.

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

```
const handler = async (event) => {
  if (
    event.callerContext.clientId === "user-pool-app-client-id-to-be-blocked"
  ) {
    throw new Error("Cannot authenticate users from this user pool app client");
  }

  return event;
};

export { handler };
```

------
#### [ Python ]

```
def lambda_handler(event, context):
    if event['callerContext']['clientId'] == "<user pool app client id to be blocked>":
        raise Exception("Cannot authenticate users from this user pool app client")

    # Return to Amazon Cognito
    return event
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
    "callerContext": {
        "clientId": "<user pool app client id to be blocked>"
    },
    "response": {}
}
```

------

# 사후 인증 Lambda 트리거
<a name="user-pool-lambda-post-authentication"></a>

사후 인증 트리거는 사용자의 인증 흐름을 변경하지 않습니다. Amazon Cognito는 인증이 완료된 후 사용자가 토큰을 수신하기 전에 이 Lambda를 호출합니다. 다음 로그인 시 반영될 로깅 또는 사용자 프로필 조정과 같은 인증 이벤트의 사용자 지정 후 처리를 추가하려는 경우 인증 후 트리거를 추가합니다.

요청 본문을 Amazon Cognito에 반환하지 않는 사후 인증 Lambda를 사용하면 여전히 인증이 완료되지 않을 수 있습니다. 자세한 내용은 [Lambda 트리거에 대해 알아야 할 사항](cognito-user-pools-working-with-lambda-triggers.md#important-lambda-considerations) 단원을 참조하십시오.

**Topics**
+ [인증 흐름 개요](#user-pool-lambda-post-authentication-1)
+ [사후 인증 Lambda 트리거 파라미터](#cognito-user-pools-lambda-trigger-syntax-post-auth)
+ [사후 인증 예제](#aws-lambda-triggers-post-authentication-example)

## 인증 흐름 개요
<a name="user-pool-lambda-post-authentication-1"></a>

![\[사후 인증 Lambda 트리거 - 클라이언트 흐름\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/lambda-post-authentication-1.png)


자세한 내용은 [인증 세션의 예](authentication.md#amazon-cognito-user-pools-authentication-flow) 단원을 참조하십시오.

## 사후 인증 Lambda 트리거 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-post-auth"></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",
             . . .
         },
         "newDeviceUsed": boolean,
         "clientMetadata": {
             "string": "string",
             . . .
            }
        },
    "response": {}
}
```

------

### 사후 인증 요청 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-post-auth-request"></a>

**newDeviceUsed**  
이 플래그는 사용자가 새로운 디바이스에 로그인했는지 여부를 표시합니다. 기억된 사용자 풀의 디바이스 값이 `Always` 또는 `User Opt-In`으로 설정된 경우에만 Amazon Cognito에서 이 플래그를 설정합니다.

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

**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-post-auth-response"></a>

Amazon Cognito는 응답에서 추가 반환 정보를 기대하지 않습니다. 함수는 API 작업을 사용하여 리소스를 쿼리 및 수정하거나 이벤트 메타데이터를 외부 시스템에 기록할 수 있습니다.

## 사후 인증 예제
<a name="aws-lambda-triggers-post-authentication-example"></a>

이 사후 인증 Lambda 함수 샘플은 CloudWatch Logs에 성공적으로 로그인하여 데이터를 전송합니다.

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

```
const handler = async (event) => {
  // Send post authentication data to Amazon CloudWatch logs
  console.log("Authentication successful");
  console.log("Trigger function =", event.triggerSource);
  console.log("User pool = ", event.userPoolId);
  console.log("App client ID = ", event.callerContext.clientId);
  console.log("User ID = ", event.userName);

  return event;
};

export { handler };
```

------
#### [ Python ]

```
import os
def lambda_handler(event, context):

    # Send post authentication data to Cloudwatch logs
    print ("Authentication successful")
    print ("Trigger function =", event['triggerSource'])
    print ("User pool = ", event['userPoolId'])
    print ("App client ID = ", event['callerContext']['clientId'])
    print ("User ID = ", event['userName'])

    # Return to Amazon Cognito
    return event
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
  "triggerSource": "testTrigger",
  "userPoolId": "testPool",
  "userName": "testName",
  "callerContext": {
      "clientId": "12345"
  },
  "response": {}
}
```

------

# 인바운드 페더레이션 Lambda 트리거
<a name="user-pool-lambda-inbound-federation"></a>

인바운드 페더레이션 트리거는 외부 자격 증명 공급자와의 인증 프로세스 중에 페더레이션 사용자 속성을 변환합니다. 사용자가 구성된 자격 증명 공급자를 통해 인증하면이 트리거를 사용하면 인증 프로세스의 데이터를 가로채고 변환하여 외부 SAML 및 OIDC 공급자의 응답을 수정할 수 있으므로 Amazon Cognito 사용자 풀이 페더레이션 사용자 및 해당 속성을 처리하는 방법을 프로그래밍 방식으로 제어할 수 있습니다.

새 사용자를 생성하거나 기존 페더레이션 사용자 프로필을 업데이트하기 전에이 트리거를 사용하여 속성을 추가, 재정의 또는 억제합니다. 이 트리거는 원시 자격 증명 공급자 속성을 입력으로 수신하고 Amazon Cognito가 사용자 프로필에 적용하는 수정된 속성을 반환합니다.

**Topics**
+ [흐름 개요](#cognito-user-pools-lambda-trigger-inbound-federation-flow)
+ [인바운드 페더레이션 Lambda 트리거 파라미터](#cognito-user-pools-lambda-trigger-syntax-inbound-federation)
+ [인바운드 페더레이션 예제: 그룹 멤버십 관리](#aws-lambda-triggers-inbound-federation-example-groups)
+ [인바운드 페더레이션 예제: 큰 속성 잘라내기](#aws-lambda-triggers-inbound-federation-example-truncate)
+ [인바운드 페더레이션 예제: 페더레이션 이벤트 로깅](#aws-lambda-triggers-inbound-federation-example-logging)

## 흐름 개요
<a name="cognito-user-pools-lambda-trigger-inbound-federation-flow"></a>

사용자가 외부 자격 증명 공급자로 인증하면 Amazon Cognito는 사용자 프로필을 생성하거나 업데이트하기 전에 인바운드 페더레이션 트리거를 호출합니다. 트리거는 자격 증명 공급자로부터 원시 속성을 수신하고 Amazon Cognito가 저장하기 전에 변환할 수 있습니다. 이 흐름은 새 페더레이션 사용자와 페더레이션을 통해 다시 로그인하는 기존 사용자 모두에게 발생합니다.

![\[인바운드 페더레이션 Lambda 트리거 흐름\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/images/lambda-inbound-federation.png)


## 인바운드 페더레이션 Lambda 트리거 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation"></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 ]

```
{
    "version": "string",
    "triggerSource": "InboundFederation_ExternalProvider",
    "region": AWSRegion,
    "userPoolId": "string",
    "userName": "string",
    "callerContext": {
        "awsSdkVersion": "string",
        "clientId": "string"
    },
    "request": {
        "providerName": "string",
        "providerType": "string",
        "attributes": {
            "tokenResponse": {
                "access_token": "string",
                "token_type": "string",
                "expires_in": "string"
            },
            "idToken": {
                "sub": "string",
                "email": "string",
                "email_verified": "string"
            },
            "userInfo": {
                "email": "string",
                "given_name": "string",
                "family_name": "string"
            },
            "samlResponse": {
                "string": "string"
            }
        }
    },
    "response": {
        "userAttributesToMap": {
            "string": "string"
        }
    }
}
```

------

### 인바운드 페더레이션 요청 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation-request"></a>

**providerName**  
외부 자격 증명 공급자의 이름입니다.

**providerType**  
외부 자격 증명 공급자의 유형입니다. 유효한 값: `OIDC`, `SAML`, `Facebook`, `Google`, `SignInWithApple`, `LoginWithAmazon`.

**attributes**  
처리 전에 자격 증명 공급자로부터 받은 원시 속성입니다. 구조는 공급자 유형에 따라 다릅니다.

**attributes.tokenResponse**  
`/token` 엔드포인트의 OAuth 토큰 응답 데이터입니다. OIDC 및 소셜 공급자만 사용할 수 있습니다. `access_token`, `id_token`, `refresh_token`, `token_type`, 및 `expires_in`를 포함합니다`scope`.

**attributes.idToken**  
디코딩되고 검증된 ID 토큰 JWT 클레임. OIDC 및 소셜 공급자만 사용할 수 있습니다. `sub` (고유 사용자 식별자), `email`, `name`, `iss` (발급자), `aud` (대상), `exp` (만료), `iat` (발급된 시간) 등 확인된 사용자 자격 증명 정보를 포함합니다.

**attributes.userInfo**  
UserInfo 엔드포인트의 확장 사용자 프로필 정보입니다. OIDC 및 소셜 공급자만 사용할 수 있습니다. `given_name`, , `family_name`, 및 기타 공급자별 필드`picture``address`와 같은 세부 프로필 속성을 포함합니다. IdP가 UserInfo 엔드포인트를 지원하지 않거나 엔드포인트 호출이 실패하는 경우 비어 있을 수 있습니다.

**attributes.samlResponse**  
SAML 어설션 속성. SAML 공급자만 사용할 수 있습니다. SAML 응답의 속성을 포함합니다.

### 인바운드 페더레이션 응답 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-inbound-federation-response"></a>

**userAttributesToMap**  
사용자 프로필에 적용할 사용자 속성입니다.

**중요**  
수정하지 않는 속성을 포함하여 응답에 유지하려는 모든 사용자 속성을 포함해야 합니다. `userAttributesToMap` 응답에 포함되지 않은 속성은 삭제되고 사용자 프로필에 저장되지 않습니다. 이는 수정된 속성과 수정되지 않은 속성 모두에 적용됩니다.

**빈 응답 동작**  
에 `{}` 대해 빈 객체를 반환하면 `userAttributesToMap`자격 증명 공급자의 모든 원래 속성이 변경되지 않고 유지됩니다. 이는 Lambda 함수가 실행되지 않은 것처럼 no-op 역할을 합니다. 이는 속성을 생략하여 속성을 삭제하는 것과 다릅니다.

**공급자별 속성**  
의 구조는에 따라 `request.attributes` 달라집니다`providerType`. OIDC 및 소셜 공급자에는 `tokenResponse`, `idToken`및 `userInfo` 객체가 포함됩니다. SAML 공급자는 `samlResponse` 객체만 포함합니다.

## 인바운드 페더레이션 예제: 그룹 멤버십 관리
<a name="aws-lambda-triggers-inbound-federation-example-groups"></a>

이 예제에서는 페더레이션 ID 제공업체 그룹을 Amazon Cognito 사용자 풀 그룹에 매핑하는 방법을 보여줍니다. 이 함수는 페더레이션 응답에서 그룹 멤버십을 추출하고 해당 Amazon Cognito 그룹에 사용자를 자동으로 추가하므로 인증 후 트리거가 필요하지 않습니다.

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

```
exports.handler = async (event) => {
    const { providerType, attributes } = event.request;
    
    // Extract user attributes based on provider type
    let userAttributesFromIdp = {};
    if (providerType === 'SAML') {
        userAttributesFromIdp = attributes.samlResponse || {};
    } else {
        // For OIDC and Social providers, merge userInfo and idToken
        userAttributesFromIdp = {
            ...(attributes.userInfo || {}),
            ...(attributes.idToken || {})
        };
    }
    
    // Extract groups from federated response
    const federatedGroups = userAttributesFromIdp.groups?.split(',') || [];
    
    // Map federated groups to Cognito groups
    const groupMapping = {
        'Domain Admins': 'Administrators',
        'Engineering': 'Developers',
        'Sales': 'SalesTeam'
    };
    
    // Filter to only in-scope groups
    const mappedGroups = federatedGroups
        .map(group => groupMapping[group.trim()])
        .filter(group => group); // Remove undefined values
    
    // Pass through attributes with mapped groups as custom attribute
    const attributesToMap = {
        ...userAttributesFromIdp,
        'custom:user_groups': mappedGroups.join(',')
    };
    
    // Remove original groups attribute
    delete attributesToMap.groups;
    
    event.response.userAttributesToMap = attributesToMap;
    return event;
};
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
    "userPoolId": "us-east-1_XXXXXXXXX",
    "request": {
        "providerName": "CorporateAD",
        "providerType": "SAML",
        "attributes": {
            "samlResponse": {
                "email": "jane.smith@company.com",
                "given_name": "Jane",
                "family_name": "Smith",
                "groups": "Engineering,Domain Admins",
                "department": "Engineering"
            }
        }
    },
    "response": {
        "userAttributesToMap": {}
    }
}
```

------

## 인바운드 페더레이션 예제: 큰 속성 잘라내기
<a name="aws-lambda-triggers-inbound-federation-example-truncate"></a>

이 예제에서는 Amazon Cognito의 스토리지 제한을 초과하는 속성 값을 자르는 방법을 보여줍니다. 이 함수는 자격 증명 공급자의 각 속성을 확인합니다. 속성 값이 2048자를 초과하는 경우 값을 잘라내고 줄임표를 추가하여 잘림을 나타냅니다. 다른 모든 속성은 변경되지 않고 통과합니다.

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

```
exports.handler = async (event) => {
    const MAX_ATTRIBUTE_LENGTH = 2048;
    
    // Get the identity provider attributes based on provider type
    const { providerType, attributes } = event.request;
    let idpAttributes = {};
    
    if (providerType === 'SAML') {
        idpAttributes = attributes.samlResponse || {};
    } else {
        // For OIDC and Social providers, merge userInfo and idToken
        idpAttributes = {
            ...(attributes.userInfo || {}),
            ...(attributes.idToken || {})
        };
    }
    
    const userAttributes = {};
    
    // Process each attribute
    for (const [key, value] of Object.entries(idpAttributes)) {
        if (typeof value === 'string' && value.length > MAX_ATTRIBUTE_LENGTH) {
            // Truncate the value and add ellipsis
            userAttributes[key] = value.substring(0, MAX_ATTRIBUTE_LENGTH - 3) + '...';
            console.log(`Truncated attribute ${key} from ${value.length} to ${userAttributes[key].length} characters`);
        } else {
            // Keep the original value
            userAttributes[key] = value;
        }
    }
    
    // Return the modified attributes
    event.response.userAttributesToMap = userAttributes;
    return event;
};
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
    "version": "string",
    "triggerSource": "InboundFederation_ExternalProvider",
    "region": "us-east-1",
    "userPoolId": "us-east-1_XXXXXXXXX",
    "userName": "ExampleProvider_12345",
    "callerContext": {
        "awsSdkVersion": "string",
        "clientId": "string"
    },
    "request": {
        "providerName": "ExampleProvider",
        "providerType": "OIDC",
        "attributes": {
            "tokenResponse": {
                "access_token": "abcDE...",
                "token_type": "Bearer",
                "expires_in": "3600"
            },
            "idToken": {
                "sub": "12345",
                "email": "user@example.com"
            },
            "userInfo": {
                "email": "user@example.com",
                "given_name": "Example",
                "family_name": "User",
                "bio": "This is a very long biography that contains more than 2048 characters..."
            }
        }
    },
    "response": {
        "userAttributesToMap": {}
    }
}
```

------

## 인바운드 페더레이션 예제: 페더레이션 이벤트 로깅
<a name="aws-lambda-triggers-inbound-federation-example-logging"></a>

이 예제에서는 모니터링 및 디버깅을 위해 페더레이션 인증 이벤트를 로깅하는 방법을 보여줍니다. 이 예제 함수는 페더레이션 사용자 및 해당 속성에 대한 자세한 정보를 캡처하여 인증 프로세스에 대한 가시성을 제공합니다.

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

```
exports.handler = async (event) => {
    const { providerName, providerType, attributes } = event.request;
    
    // Extract user attributes based on provider type
    let userAttributesFromIdp = {};
    if (providerType === 'SAML') {
        userAttributesFromIdp = attributes.samlResponse || {};
    } else {
        // For OIDC and Social providers, merge userInfo and idToken
        userAttributesFromIdp = {
            ...(attributes.userInfo || {}),
            ...(attributes.idToken || {})
        };
    }
    
    // Log federated authentication details
    console.log(JSON.stringify({
        timestamp: new Date().toISOString(),
        providerName,
        providerType,
        userEmail: userAttributesFromIdp.email,
        attributeCount: Object.keys(userAttributesFromIdp).length,
        attributes: userAttributesFromIdp
    }));
    
    // Pass through all attributes unchanged
    event.response.userAttributesToMap = userAttributesFromIdp;
    return event;
};
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
    "version": "string",
    "triggerSource": "InboundFederation_ExternalProvider",
    "region": "us-east-1",
    "userPoolId": "us-east-1_XXXXXXXXX",
    "userName": "CorporateAD_john.doe",
    "callerContext": {
        "awsSdkVersion": "string",
        "clientId": "string"
    },
    "request": {
        "providerName": "CorporateAD",
        "providerType": "SAML",
        "attributes": {
            "samlResponse": {
                "email": "john.doe@company.com",
                "given_name": "John",
                "family_name": "Doe",
                "department": "Engineering",
                "employee_id": "EMP12345"
            }
        }
    },
    "response": {
        "userAttributesToMap": {}
    }
}
```

------

예상 CloudWatch Logs 출력:

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

```
{
    "timestamp": "2025-01-14T21:17:40.153Z",
    "providerName": "CorporateAD",
    "providerType": "SAML",
    "userEmail": "john.doe@company.com",
    "attributeCount": 5,
    "attributes": {
        "email": "john.doe@company.com",
        "given_name": "John",
        "family_name": "Doe",
        "department": "Engineering",
        "employee_id": "EMP12345"
    }
}
```

------

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

------

# 사전 토큰 생성 Lambda 트리거
<a name="user-pool-lambda-pre-token-generation"></a>

토큰 생성 전에 Amazon Cognito가 이 트리거를 간접 호출하기 때문에 사용자 풀 토큰 신청을 사용자 지정할 수 있습니다. 버전 1 또는 `V1_0` 사전 토큰 생성 트리거 이벤트의 **기본 기능**을 사용하여 ID 토큰을 사용자 지정할 수 있습니다. Essentials 또는 Plus 기능 플랜이 있는 사용자 풀에서는 액세스 토큰 사용자 지정을 통해 버전 2 또는 `V2_0` 트리거 이벤트를 생성하고 M2M(머신 간) 클라이언트 자격 증명 부여를 위한 액세스 토큰 사용자 지정을 통해 버전 3 또는 `V3_0` 트리거 이벤트를 생성할 수 있습니다.

Amazon Cognito는 ID 토큰에 쓸 데이터와 함께 `V1_0` 이벤트를 요청으로서 함수에 보냅니다. `V2_0` 또는 `V3_0` 이벤트는 Amazon Cognito가 ID 및 액세스 토큰 모두에 쓸 데이터가 포함된 단일 요청입니다. 두 토큰을 모두 사용자 지정하려면 트리거 버전 2 또는 3을 사용하도록 함수를 업데이트하고 동일한 응답에서 두 토큰에 대한 데이터를 전송해야 합니다.

Amazon Cognito는 인간 사용자가 사용자 풀에 자격 증명을 제공한 사용자 인증의 액세스 토큰에 버전 2 이벤트 응답을 적용합니다. 버전 3 이벤트 응답은 사용자 인증 및 시스템 인증의 액세스 토큰에 적용되며, 자동 시스템은 앱 클라이언트 보안 암호로 액세스 토큰 요청을 승인합니다. 결과 액세스 토큰의 상황을 제외하면 버전 2와 3 이벤트는 동일합니다.

이 Lambda 트리거는 Amazon Cognito가 앱에 클레임을 발행하기 전에 ID 및 액세스 토큰의 일부 클레임을 추가, 제거 및 수정할 수 있습니다. 이 기능을 사용하려면 Amazon Cognito 사용자 풀 콘솔에서 Lambda 함수를 연결하거나 AWS Command Line Interface (AWS CLI)를 통해 사용자 풀 `LambdaConfig`를 업데이트합니다.

## 이벤트 버전
<a name="user-pool-lambda-pre-token-generation-event-versions"></a>

사용자 풀은 다양한 버전의 사전 토큰 생성 트리거 이벤트를 Lambda 함수에 전달할 수 있습니다. `V1_0` 트리거는 ID 토큰 수정을 위한 파라미터를 제공합니다. `V2_0` 또는 `V3_0` 트리거는 다음에 대한 파라미터를 제공합니다.

1. `V1_0` 트리거의 함수.

1. 액세스 토큰을 사용자 지정하는 기능.

1. 복잡한 데이터 유형을 ID 및 액세스 토큰 클레임 값에 전달하는 기능:
   + 문자열
   + 숫자
   + 부울
   + 문자열, 숫자, 부울 또는 이러한 문자열의 조합 배열
   + JSON

**참고**  
ID 토큰에서 `phone_number_verified`, `email_verified`, `updated_at` 및 `address`를 제외한 복잡한 개체를 클레임 값에 채울 수 있습니다.

사용자 풀은 기본적으로 `V1_0` 이벤트를 전달합니다. `V2_0` 이벤트를 보내도록 사용자 풀을 구성하려면 Amazon Cognito 콘솔에서 트리거를 구성할 때 사용자 ID에 대한 **기본 기능 \$1 액세스 토큰 사용자 지정**의 **이벤트 트리거 버전**을 선택합니다. `V3_0` 이벤트를 생성하려면 ****사용자 및 머신 ID에 대한 기본 기능 \$1 액세스 토큰 사용자 지정****을 선택합니다. [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) 또는 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) API 요청의 [LambdaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html#CognitoUserPools-UpdateUserPool-request-LambdaConfig) 파라미터에서 `LambdaVersion` 값을 설정할 수도 있습니다. 이벤트 버전 1, 2, 3은 **Essentials** 및 **Plus** 기능 플랜에서 사용할 수 있습니다. 버전 3 이벤트에 대한 M2M 작업에는 월간 활성 사용자(MAU) 공식과 별도의 요금 구조가 있습니다. 자세한 내용은 [Amazon Cognito 요금](https://aws.amazon.com/cognito/pricing/)을 참조하세요.

**참고**  
2024년 11월 22일 18:00 GMT 이전에 **고급 보안 기능** 옵션으로 작동하고 **Lite** 기능 계층에 남아 있는 사용자 풀은 사전 토큰 생성 트리거의 이벤트 버전 1 및 2에 액세스할 수 있습니다. 고급 보안 기능이 *없는* 이 레거시 계층의 사용자 풀은 이벤트 버전 1에 액세스할 수 있습니다. 버전 3은 Essentials 및 Plus*에서만* 사용할 수 있습니다.

## 클레임 및 범위 참조
<a name="user-pool-lambda-pre-token-generation-excluded-claims"></a>

Amazon Cognito는 액세스 및 자격 증명 토큰에서 추가, 수정 또는 억제할 수 있는 클레임 및 범위를 제한합니다. 다음 표에서는 Lambda 함수가 수정할 수 있는 클레임과 수정할 수 없는 클레임 및 클레임의 존재 또는 값에 영향을 미치는 트리거 이벤트 파라미터를 설명합니다.


| Claim | 기본 토큰 유형 | 추가할 수 있나요? | 수정할 수 있나요? | 억제할 수 있나요? | 이벤트 파라미터 - 추가 또는 수정 | 이벤트 파라미터 - 억제 | 자격 증명 유형 | 이벤트 버전 | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | 
| 사용자 풀 토큰 스키마에 없는 클레임 | 없음 | 예 | 예 | 해당 사항 없음 | claimsToAddOrOverride | claimsToSuppress | 사용자, 머신[1](#cognito-pretoken-machine-ids-tier-note) | 모두[2](#cognito-pretoken-id-access-versions-note) | 
| scope | 액세스 | 예 | 예 | 예 | scopesToAdd | scopesToSuppress | 사용자, 머신[1](#cognito-pretoken-machine-ids-tier-note) | v2\$10, v3\$10 | 
| cognito:groups | ID, 액세스 | 예 | 예 | 예 | groupsToOverride | claimsToSuppress | User | 모두[2](#cognito-pretoken-id-access-versions-note) | 
| cognito:preferred\$1role | ID | 예 | 예 | 예 | preferredRole | claimsToSuppress[3](#cognito-pretoken-suppress-groups-note) | User | 모두 | 
| cognito:roles | ID | 예 | 예 | 예 | iamRolesToOverride | claimsToSuppress[3](#cognito-pretoken-suppress-groups-note) | User | 모두 | 
| cognito:username | ID | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | User | 해당 사항 없음 | 
| cognito: 접두사가 있는 기타 모든 클레임 | 없음 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 해당 사항 없음 | 해당 사항 없음 | 
| username | 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | User | v2\$10, v3\$10 | 
| sub | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | User | 해당 사항 없음 | 
| 표준 OIDC 속성 | ID | 예 | 예 | 예 | claimsToAddOrOverride | claimsToSuppress | User | 모두 | 
| custom: 속성 | ID | 예 | 예 | 예 | claimsToAddOrOverride | claimsToSuppress | User | 모두 | 
| dev: 속성 | ID | 아니요 | 아니요 | 예 | 해당 사항 없음 | claimsToSuppress | User | 모두 | 
| identities | ID | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | User | 해당 사항 없음 | 
| aud[4](#cognito-pretoken-aud-note) | ID | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| client\$1id | 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| event\$1id | 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| device\$1key | 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | User | 해당 사항 없음 | 
| version | 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| acr | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| amr | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| at\$1hash | ID | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| auth\$1time | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| azp | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| exp | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| iat | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| iss | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| jti | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| nbf | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| nonce | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| origin\$1jti | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 
| token\$1use | ID, 액세스 | 아니요 | 아니요 | 아니요 | 해당 사항 없음 | 해당 사항 없음 | 사용자, 머신 | 해당 사항 없음 | 

 1 머신 ID에 대한 액세스 토큰은 트리거 입력 이벤트의 `v3_0`에서만 사용할 수 있습니다. 이벤트 버전 3은 **Essentials** 및 **Plus** 기능 계층에서만 사용할 수 있습니다. **Lite** 계층의 사용자 풀은 `v1_0` 이벤트를 수신할 수 있습니다. 고급 보안 기능이 있는 **Lite** 계층의 사용자 풀은 `v1_0` 및 `v2_0` 이벤트를 수신할 수 있습니다.

2 ID 토큰만을 위한 이벤트 버전 `v1_0`, ID 및 액세스 토큰을 위한 이벤트 버전 `v2_0`, 머신 ID에 대한 기능이 있는 ID 및 액세스 토큰을 위한 이벤트 버전 `v3_0`으로 사전 토큰 생성 트리거를 구성합니다.

 3 `cognito:preferred_role` 및 `cognito:roles` 클레임을 억제하려면 `claimsToSuppress`에 `cognito:groups`를 추가합니다.

 4 액세스 토큰에 `aud` 클레임을 추가할 수 있지만 해당 값은 현재 세션의 앱 클라이언트 ID와 일치해야 합니다. `event.callerContext.clientId`의 요청 이벤트에서 클라이언트 ID를 파생할 수 있습니다.

## 자격 증명 토큰 사용자 지정
<a name="user-pool-lambda-pre-token-generation-idtoken"></a>

사전 토큰 생성 Lambda 트리거의 모든 이벤트 버전을 사용하면 사용자 풀에서 ID 토큰의 내용을 사용자 지정할 수 있습니다. ID 토큰은 웹 또는 모바일 앱에 로그인하기 위한 신뢰할 수 있는 ID 소스의 사용자 속성을 제공합니다. ID 토큰에 대한 자세한 내용은 [자격 증명(ID) 토큰 이해](amazon-cognito-user-pools-using-the-id-token.md) 섹션을 참조하세요.

사전 토큰 생성 Lambda 트리거를 ID 토큰과 함께 사용하는 방법은 다음과 같습니다.
+ 사용자가 자격 증명 풀에서 요청하는 IAM 역할을 런타임에서 변경합니다.
+ 외부 소스의 사용자 속성을 추가합니다.
+ 기존 사용자 속성 값을 추가하거나 바꿉니다.
+ 사용자의 승인된 범위와 앱 클라이언트에 부여한 속성에 대한 읽기 액세스 권한으로 인해 앱에 달리 전달될 수 있는 사용자 속성의 공개를 차단합니다.

## 액세스 토큰 사용자 지정
<a name="user-pool-lambda-pre-token-generation-accesstoken"></a>

사전 토큰 생성 Lambda 트리거의 이벤트 버전 2와 3을 사용하면 사용자 풀에서 액세스 토큰의 내용을 사용자 지정할 수 있습니다. 액세스 토큰은 Amazon Cognito 토큰 인증 API 작업 및 서드 파티 API와 같은 액세스 보호 리소스에서 정보를 검색할 수 있는 권한을 사용자에게 부여합니다. 클라이언트 자격 증명 부여를 사용한 M2M(머신 간) 권한 부여의 경우 Amazon Cognito는 사용자 풀이 버전 3(`V3_0`) 이벤트에 대해 구성된 경우에만 사전 토큰 생성 트리거를 호출합니다. 액세스 토큰에 대한 자세한 내용은 [액세스 토큰 이해](amazon-cognito-user-pools-using-the-access-token.md) 섹션을 참조하세요.

사전 토큰 생성 Lambda 트리거를 액세스 토큰과 함께 사용하는 방법은 다음과 같습니다.
+ `scope` 클레임에 범위를 추가하거나 억제합니다. 예를 들어 범위 `aws.cognito.signin.user.admin`만 할당하는 Amazon Cognito 사용자 풀 API 인증을 통해 생성된 액세스 토큰에 범위를 추가할 수 있습니다.
+ 사용자 풀 그룹의 사용자 멤버십을 변경합니다.
+ Amazon Cognito 액세스 토큰에 아직 존재하지 않는 클레임을 추가합니다.
+ 앱으로 달리 전달될 수 있는 클레임의 공개를 차단합니다.

사용자 풀의 액세스 사용자 지정을 지원하려면 트리거 요청의 업데이트된 버전을 생성하도록 사용자 풀을 구성해야 합니다. 다음 절차에 나오는 대로 사용자 풀을 업데이트합니다.

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

**사전 토큰 생성 Lambda 트리거에서 액세스 토큰 사용자 지정의 지원**

1. [Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/home)로 이동한 다음 **사용자 풀(User Pools)**을 선택합니다.

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

1. **확장** 메뉴를 선택하고 **Lambda 트리거**를 찾습니다.

1. **사전 토큰 생성 트리거**를 추가 또는 편집합니다.

1. **Lambda 함수 할당**에서 Lambda 함수를 선택합니다.

1. **사용자 ID에 대한 기본 기능 \$1 액세스 토큰 사용자 지정** 또는 **사용자 및 머신 ID에 대한 기본 기능 \$1 액세스 토큰 사용자 지정**의 **트리거 이벤트 버전**을 선택합니다. 이 설정은 Amazon Cognito가 함수에 보내는 요청 파라미터를 업데이트하여 액세스 토큰 사용자 지정을 위한 필드를 포함합니다.

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

**사전 토큰 생성 Lambda 트리거에서 액세스 토큰 사용자 지정의 지원**

[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 요청을 생성합니다. 기본값으로 설정하지 않으려는 모든 파라미터의 값을 지정해야 합니다. 자세한 내용은 [사용자 풀 및 앱 클라이언트 구성 업데이트](cognito-user-pool-updating.md) 단원을 참조하십시오.

요청의 `LambdaVersion` 파라미터에 다음 콘텐츠를 포함합니다. `V2_0`의 `LambdaVersion` 값은 사용자 풀이 액세스 토큰에 대한 파라미터를 추가하고 변경 사항을 적용하도록 합니다. `V3_0`의 `LambdaVersion` 값은 `V2_0`과 동일한 이벤트를 생성하지만 *또한* 사용자 풀이 M2M 액세스 토큰에 변경 사항을 적용하도록 합니다. 특정 함수 버전을 간접 호출하려면 함수 버전을 `LambdaArn`의 값으로 포함하는 Lambda 함수 ARN을 사용하세요.

```
"PreTokenGenerationConfig": { 
   "LambdaArn": "arn:aws:lambda:us-west-2:123456789012:function:MyFunction",
   "LambdaVersion": "V3_0"
},
```

------

**M2M(머신 간) 클라이언트 자격 증명을 위한 클라이언트 메타데이터**  
M2M 요청에서 [클라이언트 메타데이터](cognito-user-pools-working-with-lambda-triggers.md#working-with-lambda-trigger-client-metadata)를 전달할 수 있습니다. 클라이언트 메타데이터는 [사전 토큰 생성 Lambda 트리거](#user-pool-lambda-pre-token-generation)의 결과에 기여할 수 있는 사용자 또는 애플리케이션 환경의 추가 정보입니다. 사용자 보안 주체를 사용한 인증 작업에서 [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 요청 본문의 사전 토큰 생성 트리거에 클라이언트 메타데이터를 전달할 수 있습니다. 애플리케이션은 [Token 엔드포인트](token-endpoint.md)에 대한 직접 요청으로 M2M에 대한 액세스 토큰 생성을 위한 흐름을 수행하므로 모델이 다릅니다. 클라이언트 자격 증명에 대한 토큰 요청의 POST 본문에서 클라이언트 메타데이터 객체 URL 인코딩(`x-www-form-urlencoded`)이 포함된 `aws_client_metadata` 파라미터를 문자열에 전달합니다. 요청 예시는 [기본 권한이 있는 클라이언트 자격 증명POST 본문 권한이 있는 클라이언트 자격 증명](token-endpoint.md#exchanging-client-credentials-for-an-access-token-in-request-body) 섹션을 참조하세요. 다음은 키-값 페어 `{"environment": "dev", "language": "en-US"}`를 전달하는 예제 파라미터입니다.

```
aws_client_metadata=%7B%22environment%22%3A%20%22dev%22,%20%22language%22%3A%20%22en-US%22%7D
```

**추가 리소스**
+ [Amazon Cognito 사용자 풀에서 액세스 토큰을 사용자 지정하는 방법](https://aws.amazon.com/blogs/security/how-to-customize-access-tokens-in-amazon-cognito-user-pools/)

**Topics**
+ [이벤트 버전](#user-pool-lambda-pre-token-generation-event-versions)
+ [클레임 및 범위 참조](#user-pool-lambda-pre-token-generation-excluded-claims)
+ [자격 증명 토큰 사용자 지정](#user-pool-lambda-pre-token-generation-idtoken)
+ [액세스 토큰 사용자 지정](#user-pool-lambda-pre-token-generation-accesstoken)
+ [사전 토큰 생성 Lambda 트리거 소스](#user-pool-lambda-pre-token-generation-trigger-source)
+ [사전 토큰 생성 Lambda 트리거 파라미터](#cognito-user-pools-lambda-trigger-syntax-pre-token-generation)
+ [사전 토큰 트리거 이벤트 버전 2 예시: 클레임, 범위 및 그룹 추가 및 억제](#aws-lambda-triggers-pre-token-generation-example-version-2-overview)
+ [사전 토큰 생성 이벤트 버전 2 예제: 복잡한 개체로 클레임 추가](#aws-lambda-triggers-pre-token-generation-example-version-2-complex-objects)
+ [사전 토큰 생성 이벤트 버전 1 예시: 새 클레임 추가 및 기존 클레임 억제](#aws-lambda-triggers-pre-token-generation-version-1-add-claim)
+ [사전 토큰 생성 이벤트 버전 1 예시: 사용자의 그룹 멤버십 수정](#aws-lambda-triggers-pre-token-generation-version-1-change-group)

## 사전 토큰 생성 Lambda 트리거 소스
<a name="user-pool-lambda-pre-token-generation-trigger-source"></a>


| triggerSource 값 | Event | 
| --- | --- | 
| TokenGeneration\$1HostedAuth | Amazon Cognito 관리 로그인 페이지에서 인증 중에 호출됩니다. | 
| TokenGeneration\$1Authentication | 사용자 인증 흐름이 완료된 이후 호출됩니다. | 
| TokenGeneration\$1NewPasswordChallenge | 사용자가 관리자에 의해 생성된 후 호출됩니다. 이 흐름은 사용자가 임시 비밀번호를 변경해야 할 때 호출됩니다. | 
| TokenGeneration\$1ClientCredentials | M2M 클라이언트 자격 증명 부여 후 호출됩니다. 사용자 풀은 이벤트 버전이 V3\$10인 경우에만 이 이벤트를 전송합니다. | 
| TokenGeneration\$1AuthenticateDevice | 사용자 디바이스 인증 마지막에 호출됩니다. | 
| TokenGeneration\$1RefreshTokens | 사용자가 자격 증명 및 액세스 토큰을 새로 고치려 할 때 호출됩니다. | 

## 사전 토큰 생성 Lambda 트리거 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-pre-token-generation"></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)의 조합입니다. 사전 토큰 생성 Lambda 트리거를 사용자 풀에 추가할 때 트리거 버전을 선택할 수 있습니다. 이 버전은 Amazon Cognito가 액세스 토큰 사용자 지정을 위한 추가 파라미터와 함께 Lambda 함수에 요청을 전달할지 여부를 결정합니다.

------
#### [ Version one ]

버전 1 토큰은 ID 토큰에서 그룹 멤버십, IAM 역할 및 새 클레임을 설정할 수 있습니다. 그룹 멤버십 재정의는 액세스 토큰의 `cognito:groups` 클레임에도 적용됩니다.

```
{
    "request": {
        "userAttributes": {"string": "string"},
        "groupConfiguration": {
                "groupsToOverride": [
                    "string",
                    "string"
                ],
                "iamRolesToOverride": [
                    "string",
                    "string"
                ],
                "preferredRole": "string"
        },
        "clientMetadata": {"string": "string"}
    },
    "response": {
        "claimsOverrideDetails": {
            "claimsToAddOrOverride": {"string": "string"},
            "claimsToSuppress": [
                "string",
                "string"
            ],
            "groupOverrideDetails": {
                "groupsToOverride": [
                    "string",
                    "string"
                ],
                "iamRolesToOverride": [
                    "string",
                    "string"
                ],
                "preferredRole": "string"
            }
        }
    }
}
```

------
#### [ Versions two and three ]

버전 2와 3 요청 이벤트는 액세스 토큰을 사용자 지정하는 필드를 추가합니다. 사용자 풀은 버전 3 이벤트의 변경 사항을 시스템 ID에 대한 액세스 토큰에 적용합니다. 이러한 버전에서는 응답 객체에서 복잡한 `claimsToOverride` 데이터 유형에 대한 지원도 추가되었습니다. Lambda 함수는 값 `claimsToOverride`에서 다음 형식의 데이터를 반환할 수 있습니다.
+ 문자열
+ 숫자
+ 부울
+ 문자열, 숫자, 부울 또는 이러한 문자열의 조합 배열
+ JSON

```
{
    "request": {
        "userAttributes": {
            "string": "string"
        },
        "scopes": ["string", "string"],
        "groupConfiguration": {
            "groupsToOverride": ["string", "string"],
            "iamRolesToOverride": ["string", "string"],
            "preferredRole": "string"
        },
        "clientMetadata": {
            "string": "string"
        }
    },
    "response": {
        "claimsAndScopeOverrideDetails": {
            "idTokenGeneration": {
                "claimsToAddOrOverride": {
                    "string": [accepted datatype]
                },
                "claimsToSuppress": ["string", "string"]
            },
            "accessTokenGeneration": {
                "claimsToAddOrOverride": {
                    "string": [accepted datatype]
                },
                "claimsToSuppress": ["string", "string"],
                "scopesToAdd": ["string", "string"],
                "scopesToSuppress": ["string", "string"]
            },
            "groupOverrideDetails": {
                "groupsToOverride": ["string", "string"],
                "iamRolesToOverride": ["string", "string"],
                "preferredRole": "string"
            }
        }
    }
}
```

------

### 사전 토큰 생성 요청 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-pre-token-generation-request"></a>


| 이름 | 설명 | 최소 트리거 이벤트 버전 | 
| --- |--- |--- |
| userAttributes |  사용자 풀에 있는 사용자의 사용자 프로필 속성입니다.  | 1 | 
| groupConfiguration |  현재 그룹 구성을 포함하는 입력 객체입니다. 이 객체에는 `groupsToOverride`, `iamRolesToOverride` 및 `preferredRole`이 포함됩니다.  | 1 | 
| groupsToOverride |  사용자가 속한 [사용자 풀 그룹](cognito-user-pools-user-groups.md#cognito-user-pools-user-groups.title)입니다.  | 1 | 
| iamRolesToOverride |  사용자 풀 그룹을 AWS Identity and Access Management (IAM) 역할과 연결할 수 있습니다. 이 요소는 사용자가 속한 그룹의 모든 IAM 역할 목록입니다.  | 1 | 
| preferredRole |  사용자 풀 그룹의 [우선 순위](cognito-user-pools-user-groups.md#assigning-precedence-values-to-groups.title)를 설정할 수 있습니다. 이 요소에는 `groupsToOverride` 요소에서 우선 순위가 가장 높은 그룹의 IAM 역할 이름이 포함됩니다.  | 1 | 
| 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` 파라미터의 데이터는 포함하지 않습니다.  | 1 | 
| scopes |  액세스 토큰 범위입니다. 액세스 토큰에 표시되는 범위는 사용자가 요청하고 앱 클라이언트에 발급을 승인한 사용자 풀 표준 및 사용자 지정 범위입니다.  | 2 | 

### 사전 토큰 생성 응답 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-pre-token-generation-response"></a>


| 이름 | 설명 | 최소 트리거 이벤트 버전 | 
| --- |--- |--- |
| claimsOverrideDetails | A container for all elements in a V1\$10 trigger event. | 1 | 
| claimsAndScopeOverrideDetails |  `V2_0` 또는 `V3_0` 트리거 이벤트의 모든 요소를 담는 컨테이너입니다.  | 2 | 
| idTokenGeneration |  사용자 ID 토큰에서 재정의, 추가 또는 차단하려는 클레임입니다. 이 상위 ID 토큰 사용자 지정 값은 버전 2 이벤트에만 나타나지만 하위 요소는 버전 1 이벤트에 나타납니다.  | 2 | 
| accessTokenGeneration |  사용자 액세스 토큰에서 재정의, 추가 또는 차단하려는 클레임 및 범위입니다. 토큰 사용자 지정 값에 액세스하는 이 상위 값은 이벤트 버전 2 이상에만 나타납니다.  | 2 | 
| claimsToAddOrOverride |  추가 또는 수정하려는 하나 이상의 클레임 및 해당 값이 표시된 맵입니다. 그룹 관련 클레임의 경우 대신 `groupOverrideDetails`를 사용합니다. 이벤트 버전 2 이상에서 이 요소는 `accessTokenGeneration` 및 `idTokenGeneration`에 모두 나타납니다.  | 1[*](#cognito-pretoken-complex-objects-note) | 
| claimsToSuppress |  Amazon Cognito가 차단하길 원하는 클레임의 목록입니다. 함수가 신청 값을 억제하고 대체하는 경우 Amazon Cognito는 신청을 억제합니다. 이벤트 버전 2 이상에서 이 요소는 `accessTokenGeneration` 및 `idTokenGeneration`에 모두 나타납니다.  | 1 | 
| groupOverrideDetails |  현재 그룹 구성을 포함하는 입력 객체입니다. 이 객체에는 `groupsToOverride`, `iamRolesToOverride` 및 `preferredRole`이 포함됩니다. 함수가 `groupOverrideDetails` 객체를 사용자가 제공하는 객체로 바꿉니다. 응답에서 비어 있는 객체 또는 Null 객체를 제공하면 Amazon Cognito가 그룹을 억제합니다. 기존 그룹 구성을 동일하게 유지하려면 요청의 `groupConfiguration` 객체 값을 응답의 `groupOverrideDetails` 객체로 복사합니다. 그런 다음 해당 객체를 서비스로 다시 전달합니다. Amazon Cognito ID 및 액세스 토큰 둘 다에 `cognito:groups` 클레임이 포함되어 있습니다. `groupOverrideDetails` 객체는 액세스 토큰과 ID 토큰의 `cognito:groups` 클레임을 대체합니다. 그룹 재정의는 버전 1 이벤트가 수행할 수 있는 액세스 토큰에 대한 유일한 변경 사항입니다.  | 1 | 
| scopesToAdd |  사용자의 액세스 토큰의 `scope` 클레임에 추가하려는 범위 목록입니다. 하나 이상의 공백 문자가 포함된 범위 값은 추가할 수 없습니다.  | 2 | 
| scopesToSuppress |  사용자의 액세스 토큰의 `scope` 클레임에서 제거하려는 범위 목록입니다.  | 2 | 

 \$1 버전 1 이벤트에 대한 응답 객체는 문자열을 반환할 수 있습니다. 버전 2 및 3 이벤트에 대한 응답 객체는 [복잡한 객체](#user-pool-lambda-pre-token-generation-event-versions)를 반환할 수 있습니다.

## 사전 토큰 트리거 이벤트 버전 2 예시: 클레임, 범위 및 그룹 추가 및 억제
<a name="aws-lambda-triggers-pre-token-generation-example-version-2-overview"></a>

이 예시에서는 사용자 토큰을 다음과 같이 수정합니다.

1. ID 토큰에서 `family_name`을 `Doe`와 동일하게 설정합니다.

1. ID 토큰에 `email` 및 `phone_number` 클레임이 나타나지 않도록 합니다.

1. ID 토큰 `cognito:roles` 클레임을 `"arn:aws:iam::123456789012:role\/sns_callerA","arn:aws:iam::123456789012:role\/sns_callerC","arn:aws:iam::123456789012:role\/sns_callerB"`로 설정합니다.

1. ID 토큰 `cognito:preferred_role` 클레임을 `arn:aws:iam::123456789012:role/sns_caller`로 설정합니다.

1. 액세스 토큰에 범위 `openid`, `email`, `solar-system-data/asteroids.add`를 추가합니다.

1. 액세스 토큰에서 범위 `phone_number` 및 `aws.cognito.signin.user.admin`을 억제합니다. `phone_number`를 제거하면 `userInfo`에서 사용자 전화 번호를 검색할 수 없습니다. `aws.cognito.signin.user.admin`를 제거하면 Amazon Cognito 사용자 풀 API로 자신의 프로필을 읽고 수정하려는 사용자의 API 요청이 방지됩니다.
**참고**  
액세스 토큰의 나머지 범위에 `openid` 및 하나 이상의 표준 범위가 포함된 경우에만 범위에서 `phone_number`를 제거하면 사용자 전화 번호를 검색할 수 없습니다. 자세한 내용은 [범위에 대한 정보](cognito-user-pools-define-resource-servers.md#cognito-user-pools-define-resource-servers-about-scopes) 단원을 참조하십시오.

1. ID 및 액세스 토큰 `cognito:groups` 클레임을 `"new-group-A","new-group-B","new-group-C"`로 설정합니다.

------
#### [ JavaScript ]

```
export const handler = function(event, context) {
  event.response = {
    "claimsAndScopeOverrideDetails": {
      "idTokenGeneration": {
        "claimsToAddOrOverride": {
          "family_name": "Doe"
        },
        "claimsToSuppress": [
          "email",
          "phone_number"
        ]
      },
      "accessTokenGeneration": {
        "scopesToAdd": [
          "openid",
          "email",
          "solar-system-data/asteroids.add"
        ],
        "scopesToSuppress": [
          "phone_number",
          "aws.cognito.signin.user.admin"
        ]
      },
      "groupOverrideDetails": {
        "groupsToOverride": [
          "new-group-A",
          "new-group-B",
          "new-group-C"
        ],
        "iamRolesToOverride": [
          "arn:aws:iam::123456789012:role/new_roleA",
          "arn:aws:iam::123456789012:role/new_roleB",
          "arn:aws:iam::123456789012:role/new_roleC"
        ],
        "preferredRole": "arn:aws:iam::123456789012:role/new_role",
      }
    }
  };
  // Return to Amazon Cognito
  context.done(null, event);
};
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
    "version": "2",
    "triggerSource": "TokenGeneration_Authentication",
    "region": "us-east-1",
    "userPoolId": "us-east-1_EXAMPLE",
    "userName": "JaneDoe",
    "callerContext": {
        "awsSdkVersion": "aws-sdk-unknown-unknown",
        "clientId": "1example23456789"
    },
    "request": {
        "userAttributes": {
            "sub": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
            "cognito:user_status": "CONFIRMED",
            "email_verified": "true",
            "phone_number_verified": "true",
            "phone_number": "+12065551212",
            "family_name": "Zoe",
            "email": "Jane.Doe@example.com"
        },
        "groupConfiguration": {
            "groupsToOverride": ["group-1", "group-2", "group-3"],
            "iamRolesToOverride": ["arn:aws:iam::123456789012:role/sns_caller1", "arn:aws:iam::123456789012:role/sns_caller2", "arn:aws:iam::123456789012:role/sns_caller3"],
            "preferredRole": ["arn:aws:iam::123456789012:role/sns_caller"]
        },
        "scopes": [
            "aws.cognito.signin.user.admin", "openid", "email", "phone"
        ]
    },
    "response": {
        "claimsAndScopeOverrideDetails": []
    }
}
```

------

## 사전 토큰 생성 이벤트 버전 2 예제: 복잡한 개체로 클레임 추가
<a name="aws-lambda-triggers-pre-token-generation-example-version-2-complex-objects"></a>

이 예시에서는 사용자 토큰을 다음과 같이 수정합니다.

1. ID 토큰에 숫자, 문자열, 부울 및 JSON 유형의 클레임을 추가합니다. 이는 버전 2 트리거 이벤트가 ID 토큰에 사용할 수 있도록 하는 유일한 변경 사항입니다.

1. 번호, 문자열, 부울 및 JSON 유형의 클레임을 액세스 토큰에 추가합니다.

1. 액세스 토큰에 세 가지 범위를 추가합니다.

1. ID 및 액세스 토큰에서 `email` 클레임을 억제합니다.

1. 액세스 토큰에서 `aws.cognito.signin.user.admin` 범위를 억제합니다.

------
#### [ JavaScript ]

```
export const handler = function(event, context) {

    var scopes = ["MyAPI.read", "MyAPI.write", "MyAPI.admin"]
    var claims = {}
    claims["aud"]= event.callerContext.clientId;
    claims["booleanTest"] = false;
    claims["longTest"] = 9223372036854775807;
    claims["exponentTest"] = 1.7976931348623157E308;
    claims["ArrayTest"] = ["test", 9223372036854775807, 1.7976931348623157E308, true];
    claims["longStringTest"] = "\{\
        \"first_json_block\": \{\
            \"key_A\": \"value_A\",\
            \"key_B\": \"value_B\"\
        \},\
        \"second_json_block\": \{\
            \"key_C\": \{\
                \"subkey_D\": [\
                    \"value_D\",\
                    \"value_E\"\
                ],\
                \"subkey_F\": \"value_F\"\
            \},\
            \"key_G\": \"value_G\"\
        \}\
    \}";
    claims["jsonTest"] = {
    	"first_json_block": {
    		"key_A": "value_A",
    		"key_B": "value_B"
    	},
    	"second_json_block": {
    		"key_C": {
    			"subkey_D": [
    				"value_D",
    				"value_E"
    			],
    			"subkey_F": "value_F"
    		},
    		"key_G": "value_G"
    	}
    };
    event.response = {
        "claimsAndScopeOverrideDetails": {
            "idTokenGeneration": {
                "claimsToAddOrOverride": claims,
                "claimsToSuppress": ["email"]
            },
            "accessTokenGeneration": {
                "claimsToAddOrOverride": claims,
                "claimsToSuppress": ["email"],
                "scopesToAdd": scopes,
                "scopesToSuppress": ["aws.cognito.signin.user.admin"]
            }
        }
    };
    console.info("EVENT response\n" + JSON.stringify(event, (_, v) => typeof v === 'bigint' ? v.toString() : v, 2))
    console.info("EVENT response size\n" + JSON.stringify(event, (_, v) => typeof v === 'bigint' ? v.toString() : v).length)
    // Return to Amazon Cognito
    context.done(null, event);
};
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
    "version": "2",
    "triggerSource": "TokenGeneration_HostedAuth",
    "region": "us-west-2",
    "userPoolId": "us-west-2_EXAMPLE",
    "userName": "JaneDoe",
    "callerContext": {
        "awsSdkVersion": "aws-sdk-unknown-unknown",
        "clientId": "1example23456789"
    },
    "request": {
        "userAttributes": {
            "sub": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
            "cognito:user_status": "CONFIRMED"
            "email_verified": "true",
            "phone_number_verified": "true",
            "phone_number": "+12065551212",
            "email": "Jane.Doe@example.com"
        },
        "groupConfiguration": {
            "groupsToOverride": ["group-1", "group-2", "group-3"],
            "iamRolesToOverride": ["arn:aws:iam::123456789012:role/sns_caller1"],
            "preferredRole": ["arn:aws:iam::123456789012:role/sns_caller1"]
        },
        "scopes": [
            "aws.cognito.signin.user.admin",
            "phone",
            "openid",
            "profile",
            "email"
        ]
    },
    "response": {
        "claimsAndScopeOverrideDetails": []
    }
}
```

------

## 사전 토큰 생성 이벤트 버전 1 예시: 새 클레임 추가 및 기존 클레임 억제
<a name="aws-lambda-triggers-pre-token-generation-version-1-add-claim"></a>

이 예시에서는 사전 토큰 생성 Lambda 함수와 버전 1 트리거 이벤트를 사용하여 새 클레임을 추가하고 기존 클레임을 차단합니다.

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

```
const handler = async (event) => {
  event.response = {
    claimsOverrideDetails: {
      claimsToAddOrOverride: {
        my_first_attribute: "first_value",
        my_second_attribute: "second_value",
      },
      claimsToSuppress: ["email"],
    },
  };

  return event;
};

export { handler };
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플에 대한 테스트 이벤트입니다. 이 코드 예에서는 요청 파라미터를 처리하지 않기 때문에 빈 요청에 테스트 이벤트를 사용할 수 있습니다. 공통 요청 파라미터에 대한 자세한 내용은 [사용자 풀 Lambda 트리거 이벤트](cognito-user-pools-working-with-lambda-triggers.md#cognito-user-pools-lambda-trigger-event-parameter-shared) 섹션을 참조하세요.

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

```
{
  "request": {},
  "response": {}
}
```

------

## 사전 토큰 생성 이벤트 버전 1 예시: 사용자의 그룹 멤버십 수정
<a name="aws-lambda-triggers-pre-token-generation-version-1-change-group"></a>

이 예시에서는 사전 토큰 생성 Lambda 함수와 버전 1 트리거 이벤트를 사용하여 사용자의 그룹 멤버십을 수정합니다.

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

```
const handler = async (event) => {
  event.response = {
    claimsOverrideDetails: {
      groupOverrideDetails: {
        groupsToOverride: ["group-A", "group-B", "group-C"],
        iamRolesToOverride: [
          "arn:aws:iam::XXXXXXXXXXXX:role/sns_callerA",
          "arn:aws:iam::XXXXXXXXX:role/sns_callerB",
          "arn:aws:iam::XXXXXXXXXX:role/sns_callerC",
        ],
        preferredRole: "arn:aws:iam::XXXXXXXXXXX:role/sns_caller",
      },
    },
  };

  return event;
};

export { handler };
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
  "request": {},
  "response": {}
}
```

------

# 사용자 마이그레이션 Lambda 트리거
<a name="user-pool-lambda-migrate-user"></a>

사용자가 암호로 로그인할 때 사용자 풀에 존재하지 않는 경우 또는 암호 찾기 흐름에 있는 경우 Amazon Cognito에서 이 트리거를 호출합니다. Lambda 함수가 성공적으로 반환된 이후 Amazon Cognito는 사용자를 사용자 풀에 추가합니다. 사용자 마이그레이션 Lambda 트리거를 사용하는 인증 흐름에 대한 자세한 내용은 [사용자 마이그레이션 Lambda 트리거를 사용하여 사용자 가져오기](cognito-user-pools-import-using-lambda.md)를 참조하세요.

로그인 시 또는 암호 찾기 흐름 동안 기존 사용자 디렉터리에 있는 사용자를 Amazon Cognito 사용자 풀로 마이그레이션하려면 이 Lambda 트리거를 사용합니다.

**Topics**
+ [사용자 마이그레이션 Lambda 트리거 소스](#user-pool-lambda-migrate-user-trigger-source)
+ [사용자 마이그레이션 Lambda 트리거 파라미터](#cognito-user-pools-lambda-trigger-syntax-user-migration)
+ [예제: 기존 암호가 있는 사용자 마이그레이션](#aws-lambda-triggers-user-migration-example-1)

## 사용자 마이그레이션 Lambda 트리거 소스
<a name="user-pool-lambda-migrate-user-trigger-source"></a>


| triggerSource 값 | Event | 
| --- | --- | 
| UserMigration\$1Authentication[1](#cognito-migrate-user-passwordless-note) | 로그인 시 사용자 마이그레이션입니다. | 
| UserMigration\$1ForgotPassword | 암호 찾기 흐름 도중 사용자 마이그레이션. | 

1 Amazon Cognito는 사용자가 [암호 없는 로그인](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)으로 인증할 때 이 트리거를 호출하지 않습니다.

## 사용자 마이그레이션 Lambda 트리거 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-user-migration"></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 ]

```
{
    "userName": "string",
    "request": {
        "password": "string",
        "validationData": {
            "string": "string",
            . . .
        },
        "clientMetadata": {
            "string": "string",
      	. . .
        }
    },
    "response": {
        "userAttributes": {
            "string": "string",
            . . .
        },
        "finalUserStatus": "string",
        "messageAction": "string",
        "desiredDeliveryMediums": [ "string", . . .],
        "forceAliasCreation": boolean,
        "enableSMSMFA": boolean
    }
}
```

------

### 사용자 마이그레이션 요청 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-user-migration-request"></a>

**userName**  
로그인 시 사용자가 입력하는 사용자 이름입니다.

**암호**  
로그인 시 사용자가 입력하는 암호입니다. Amazon Cognito는 암호 찾기 흐름에 의해 시작된 요청에서 이 값을 보내지 않습니다.

**validationData**  
사용자 로그인 요청에 검증 데이터를 포함하는 하나 이상의 키-값 페어입니다. 이 데이터를 Lambda 함수에 전달하려면 [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 작업에서 ClientMetadata 파라미터를 사용합니다.

**clientMetadata**  
사용자 마이그레이션 트리거를 위한 Lambda 함수에 사용자 지정 입력으로 제공할 수 있는 하나 이상의 키-값 페어입니다. 이 데이터를 Lambda 함수에 전달하려면 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 및 [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) API 작업에서 ClientMetadata 파라미터를 사용합니다.

### 사용자 마이그레이션 응답 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-user-migration-response"></a>

**userAttributes**  
이 필드는 필수 항목입니다.  
이 필드는 Amazon Cognito가 사용자 풀의 사용자 프로필에 저장하고 사용자 속성으로 사용하는 이름-값 페어를 하나 이상 포함해야 합니다. 표준 속성과 사용자 지정 속성을 모두 포함할 수 있습니다. 표준 속성과 구별하기 위해 사용자 지정 속성에 `custom:` 접두사가 필요합니다. 자세한 내용은 [사용자 지정 속성](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-attributes.html#user-pool-settings-custom-attributes.html)을 참조하세요.  
암호 찾기 흐름에서 사용자가 암호를 재설정하려면 확인된 이메일 주소 또는 확인된 전화 번호를 입력해야 합니다. Amazon Cognito는 암호 재설정 코드가 포함된 메시지를 사용자 속성에 있는 이메일 주소 또는 전화 번호로 보냅니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/user-pool-lambda-migrate-user.html)

**finalUserStatus**  
사용자가 이전 암호로 로그인할 수 있도록 사용자를 자동 확인하기 위해 이 파라미터를 `CONFIRMED`로 설정할 수 있습니다. 사용자를 `CONFIRMED`로 설정하면 해당 사용자는 사전에 추가 작업을 수행하지 않고도 로그인할 수 있습니다. 이 속성을 `CONFIRMED`로 설정하지 않은 경우 해당 속성이 `RESET_REQUIRED`로 설정됩니다.  
`RESET_REQUIRED`의 `finalUserStatus`는 사용자가 로그인 시 마이그레이션 직후에 자신의 암호를 변경해야 하며 클라이언트 앱은 인증 흐름 동안 `PasswordResetRequiredException`을 처리해야 함을 의미합니다.  
Amazon Cognito는 Lambda 트리거를 사용하여 마이그레이션하는 동안 사용자 풀에 대해 구성된 암호 강도 정책을 적용하지 않습니다. 암호가 구성된 암호 정책에 부합하지 않는 경우에도 Amazon Cognito는 여전히 암호를 수락하여 사용자를 계속 마이그레이션할 수 있습니다. 암호 강도 정책을 적용하고 정책에 부합하지 않는 암호를 거부하려면 코드에서 암호 강도를 검증합니다. 그런 다음 암호가 정책에 부합하지 않는 경우 finalUserStatus를 `RESET_REQUIRED`로 설정합니다.

**messageAction**  
Amazon Cognito가 일반적으로 새 사용자에게 보내는 시작 메시지 보내기를 거부하려면 이 파라미터를 `SUPPRESS`로 설정합니다. 함수가 이 파라미터를 반환하지 않으면 Amazon Cognito가 시작 메시지를 보냅니다.

**desiredDeliveryMediums**  
시작 메시지를 이메일로 보내려면 이 파라미터를 `EMAIL`로 설정하고, 시작 메시지를 SMS로 보내려면 이 파라미터를 `SMS`로 설정합니다. 함수가 이 파라미터를 반환하지 않으면 Amazon Cognito가 시작 메시지를 SMS로 보냅니다.

**forceAliasCreation**  
이 파라미터가 `TRUE`로 설정되고 UserAttributes 파라미터의 전화 번호 또는 이메일 주소가 다른 사용자의 별칭으로 이미 존재하는 경우 API 호출이 이전 사용자의 별칭을 새로 생성된 사용자로 마이그레이션합니다. 이전 사용자는 더 이상 해당 별칭을 사용하여 로그인할 수 없습니다.  
이 파라미터를 `FALSE`로 설정하고 별칭이 존재하는 경우 Amazon Cognito가 사용자를 마이그레이션하지 않고 클라이언트 앱에 오류를 반환합니다.  
이 파라미터를 반환하지 않는 경우 Amazon Cognito는 해당 값이 'false'라고 가정합니다.

**enableSMSMFA**  
이 파라미터를 `true`로 설정하는 경우 마이그레이션된 사용자가 로그인하려면 SMS 문자 메시지 다중 인증(MFA)을 완료해야 합니다. 사용자 풀에 MFA가 활성화되어 있어야 합니다. 요청 파라미터의 사용자 속성에 전화 번호가 포함되어야 합니다. 그렇지 않으면 해당 사용자의 마이그레이션이 실패합니다.

## 예제: 기존 암호가 있는 사용자 마이그레이션
<a name="aws-lambda-triggers-user-migration-example-1"></a>

이 Lambda 함수 예는 기존 암호를 가진 사용자를 마이그레이션하고 Amazon Cognito의 환영 인사 메시지를 억제합니다.

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

```
exports.handler = (event, context, callback) => {
  var user;

  if (event.triggerSource == "UserMigration_Authentication") {
    // authenticate the user with your existing user directory service
    user = authenticateUser(event.userName, event.request.password);
    if (user) {
      event.response.userAttributes = {
        email: user.emailAddress,
        email_verified: "true",
      };
      event.response.finalUserStatus = "CONFIRMED";
      event.response.messageAction = "SUPPRESS";
      context.succeed(event);
    } else {
      // Return error to Amazon Cognito
      callback("Bad password");
    }
  } else if (event.triggerSource == "UserMigration_ForgotPassword") {
    // Lookup the user in your existing user directory service
    user = lookupUser(event.userName);
    if (user) {
      event.response.userAttributes = {
        email: user.emailAddress,
        // required to enable password-reset code to be sent to user
        email_verified: "true",
      };
      event.response.messageAction = "SUPPRESS";
      context.succeed(event);
    } else {
      // Return error to Amazon Cognito
      callback("Bad password");
    }
  } else {
    // Return error to Amazon Cognito
    callback("Bad triggerSource " + event.triggerSource);
  }
};
```

------

# 사용자 정의 메시지 Lambda 트리거
<a name="user-pool-lambda-custom-message"></a>

사용자에게 전송하려는 이메일 및 SMS 메시지에 대한 외부 표준이 있거나 런타임에 사용자 메시지 형식에 자체 로직을 적용하려는 경우 사용자 풀에 사용자 지정 메시지 트리거를 추가합니다. 사용자 지정 메시지 Lambda는 사용자 풀에서 전송하기 전에 모든 이메일 및 SMS 메시지의 내용을 수신합니다. 그러면 Lambda 함수에서 메시지 내용 및 주제를 수정할 수 있습니다.

Amazon Cognito는 이메일이나 전화 확인 메시지 또는 멀티 팩터 인증(MFA) 코드를 보내기 전에 이 트리거를 호출합니다. 사용자 지정 메시지 트리거를 사용하여 메시지를 동적으로 사용자 지정할 수 있습니다.

요청에는 `codeParameter`가 포함됩니다. 이는 Amazon Cognito가 사용자에게 전달하는 코드의 자리 표시자 역할을 하는 문자열입니다. `codeParameter` 문자열을 확인 코드가 나타날 메시지 본문에 삽입합니다. Amazon Cognito에서 응답을 수신하면 Amazon Cognito에서 `codeParameter` 문자열을 실제 확인 코드로 바꿉니다.

**참고**  
`CustomMessage_AdminCreateUser` 트리거 소스가 있는 사용자 지정 메시지 Lambda 함수의 입력 이벤트에는 사용자 이름과 확인 코드가 포함됩니다. 관리자가 생성한 사용자는 사용자 이름과 코드를 모두 수신해야 하므로 함수의 응답에는 사용자 이름과 코드에 대한 자리 표시자 변수가 포함되어야 합니다. 메시지의 자리 표시자는 `request.usernameParameter` 및 `request.codeParameter`의 값입니다. 이러한 값은 일반적으로 `{username}` 및 `{####}`입니다. 가장 좋은 방법은 변수 이름을 하드 코딩하는 대신 입력 값을 참조하는 것입니다.

**Topics**
+ [사용자 정의 메시지 Lambda 트리거 소스](#cognito-user-pools-lambda-trigger-syntax-custom-message-trigger-source)
+ [사용자 정의 메시지 Lambda 트리거 파라미터](#cognito-user-pools-lambda-trigger-syntax-custom-message)
+ [가입용 사용자 지정 메시지의 예](#aws-lambda-triggers-custom-message-example)
+ [관리자로 사용자 생성용 사용자 정의 메시지 예제](#aws-lambda-triggers-custom-message-admin-example)

## 사용자 정의 메시지 Lambda 트리거 소스
<a name="cognito-user-pools-lambda-trigger-syntax-custom-message-trigger-source"></a>


| triggerSource 값 | Event | 
| --- | --- | 
| CustomMessage\$1SignUp | 사용자 지정 메시지 – 가입 후 확인 코드 전송. | 
| CustomMessage\$1AdminCreateUser | 사용자 지정 메시지 – 새 사용자에게 임시 암호 전송. | 
| CustomMessage\$1ResendCode | 사용자 지정 메시지 – 기존 사용자에게 확인 코드 재전송. | 
| CustomMessage\$1ForgotPassword | 사용자 지정 메시지 – 암호 분실 요청을 위한 확인 코드 전송. | 
| CustomMessage\$1UpdateUserAttribute | 사용자 지정 메시지 – 사용자의 이메일 또는 전화 번호가 변경되면 이 트리거가 사용자에게 자동으로 확인 코드를 전송합니다. 다른 속성에는 사용할 수 없습니다. | 
| CustomMessage\$1VerifyUserAttribute | 사용자 지정 메시지 – 사용자가 새 이메일 또는 전화 번호에 대해 수동으로 요청하면 이 트리거가 사용자에게 확인 코드를 전송합니다. | 
| CustomMessage\$1Authentication | 사용자 지정 메시지 – 인증하는 동안 MFA 코드 전송. | 

## 사용자 정의 메시지 Lambda 트리거 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-custom-message"></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",
            . . .
        }
        "codeParameter": "####",
        "usernameParameter": "string",
        "clientMetadata": {
            "string": "string",
            . . .
        }
    },
    "response": {
        "smsMessage": "string",
        "emailMessage": "string",
        "emailSubject": "string"
    }
}
```

------

### 사용자 정의 메시지 요청 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-custom-message-request"></a>

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

**codeParameter**  
사용자 지정 메시지에서 확인 코드의 자리 표시자로 사용할 문자열입니다.

**usernameParameter**  
사용자 이름. Amazon Cognito는 관리자가 생성한 사용자의 요청에 이 파라미터를 포함합니다.

**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 파라미터에 전달된 데이터가 포함되지 않습니다. 이 데이터를 Lambda 함수에 전달하려면 다음 API 작업에 ClientMetadata 파라미터를 사용합니다.  
+  [AdminResetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html) 
+  [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 
+  [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html)
+  [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html)
+  [GetUserAttributeVerificationCode](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserAttributeVerificationCode.html)
+  [ResendConfirmationCode](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ResendConfirmationCode.html)
+  [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html)
+  [UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html)

### 사용자 정의 메시지 응답 파라미터
<a name="cognito-user-pools-lambda-trigger-syntax-custom-message-response"></a>

응답에서는 사용자에게 보낼 메시지에 사용할 사용자 지정 텍스트를 지정합니다. Amazon Cognito가 이러한 파라미터에 적용하는 문자열 제약 조건은 [MessageTemplateType](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_MessageTemplateType.html)을 참조하세요.

**smsMessage**  
사용자에게 보낼 사용자 지정 SMS 메시지입니다. 요청에서 수신한 `codeParameter` 값을 포함해야 합니다.

**emailMessage**  
사용자에게 보낼 사용자 지정 이메일 메시지입니다. `emailMessage` 파라미터에서 HTML 서식을 사용할 수 있습니다. 요청에서 수신한 `codeParameter` 값을 변수 `{####}`으로 포함해야 합니다. Amazon Cognito는 사용자 풀의 `EmailSendingAccount` 속성이 `DEVELOPER`인 경우에만 `emailMessage` 파라미터를 사용할 수 있습니다. 사용자 풀의 `EmailSendingAccount` 속성이 `DEVELOPER`가 아니고 `emailMessage` 파라미터가 반환된 경우 Amazon Cognito에서 400오류 코드 `com.amazonaws.cognito.identity.idp.model.InvalidLambdaResponseException`을 생성합니다. Amazon Simple Email Service(Amazon SES)를 선택하여 이메일 메시지를 보내면 사용자 풀의 `EmailSendingAccount` 속성이 `DEVELOPER`입니다. 그렇지 않으면 이 값은 `COGNITO_DEFAULT`입니다.

**emailSubject**  
사용자 지정 메시지의 제목 줄입니다. 사용자 풀의 EmailSendingAccount 속성이 `DEVELOPER`인 경우에만 `emailSubject` 파라라미터를 사용할 수 있습니다. 사용자 풀의 `EmailSendingAccount` 속성이 `DEVELOPER`가 아니고 Amazon Cognito에서 `emailSubject` 파라미터를 반환하는 경우 Amazon Cognito에서 400 오류 코드 `com.amazonaws.cognito.identity.idp.model.InvalidLambdaResponseException`을 생성합니다. Amazon Simple Email Service(Amazon SES)를 선택하여 이메일 메시지를 보내도록 선택하면 사용자 풀의 `EmailSendingAccount` 속성이 `DEVELOPER`입니다. 그렇지 않으면 이 값은 `COGNITO_DEFAULT`입니다.

## 가입용 사용자 지정 메시지의 예
<a name="aws-lambda-triggers-custom-message-example"></a>

이 Lambda 함수 예는 서비스에서 앱이 사용자에게 확인 코드를 보내야 할 때 이메일 또는 SMS 메시지를 사용자 지정합니다.

Amazon Cognito는 사후 등록, 확인 코드 재전송, 잊어버린 암호 복구 또는 사용자 속성 확인과 같은 여러 이벤트에서 Lambda 트리거를 호출할 수 있습니다. SMS와 이메일 모두의 메시지가 응답에 포함됩니다. 메시지에는 코드 파라미터 `"####"`이 포함되어야 합니다. 이 파라미터는 사용자가 수신하는 확인 코드의 자리 표시자입니다.

이메일 메시지의 최대 길이는 UTF-8 20,000자입니다. 이 길이에는 확인 코드가 포함됩니다. 이러한 이메일 메시지에 HTML 태그를 사용할 수 있습니다.

SMS 메시지의 최대 길이는 UTF-8 140자입니다. 이 길이에는 확인 코드가 포함됩니다.

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

```
const handler = async (event) => {
  if (event.triggerSource === "CustomMessage_SignUp") {
    const message = `Thank you for signing up. Your confirmation code is ${event.request.codeParameter}.`;
    event.response.smsMessage = message;
    event.response.emailMessage = message;
    event.response.emailSubject = "Welcome to the service.";
  }
  return event;
};

export { handler };
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
	"version": "1",
	"region": "us-west-2",
	"userPoolId": "us-west-2_EXAMPLE",
	"userName": "test-user",
	"callerContext": {
		"awsSdkVersion": "aws-sdk-unknown-unknown",
		"clientId": "1example23456789"
	},
	"triggerSource": "CustomMessage_SignUp",
	"request": {
		"userAttributes": {
			"sub": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
			"cognito:user_status": "CONFIRMED",
			"email_verified": "true",
			"phone_number_verified": "true",
			"phone_number": "+12065551212",
			"email": "test-user@example.com"
		},
		"codeParameter": "{####}",
		"linkParameter": "{##Click Here##}",
		"usernameParameter": "None"
	},
	"response": {
		"smsMessage": "None",
		"emailMessage": "None",
		"emailSubject": "None"
	}
}
```

------

## 관리자로 사용자 생성용 사용자 정의 메시지 예제
<a name="aws-lambda-triggers-custom-message-admin-example"></a>

이 예제 사용자 지정 메시지 Lambda 함수에 Amazon Cognito가 전송한 요청에는 `CustomMessage_AdminCreateUser`의 `triggerSource` 값과 사용자 이름 및 임시 비밀번호가 있습니다. 이 함수는 요청의 임시 비밀번호에서 `${event.request.codeParameter}`를 채우고 요청의 사용자 이름에서 `${event.request.usernameParameter}`를 채웁니다.

사용자 지정 메시지는 `codeParameter` 및 `usernameParameter`의 값을 응답 개체의 `smsMessage` 및 `emailMessage`에 삽입해야 합니다. 이 예제에서는 함수가 응답 필드 `event.response.smsMessage` 및 `event.response.emailMessage`에 동일한 메시지를 기록합니다.

이메일 메시지의 최대 길이는 UTF-8 20,000자입니다. 이 길이에는 확인 코드가 포함됩니다. 이러한 이메일에 HTML 태그를 사용할 수 있습니다. SMS 메시지의 최대 길이는 UTF-8 140자입니다. 이 길이에는 확인 코드가 포함됩니다.

SMS와 이메일 모두의 메시지가 응답에 포함됩니다.

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

```
const handler = async (event) => {
  if (event.triggerSource === "CustomMessage_AdminCreateUser") {
    const message = `Welcome to the service. Your user name is ${event.request.usernameParameter}. Your temporary password is ${event.request.codeParameter}`;
    event.response.smsMessage = message;
    event.response.emailMessage = message;
    event.response.emailSubject = "Welcome to the service";
  }
  return event;
};

export { handler };
```

------

Amazon Cognito는 이벤트 정보를 Lambda 함수에 전달합니다. 그런 다음 함수는 응답이 변경되면 동일한 이벤트 객체를 Amazon Cognito에 반환합니다. Lambda 콘솔에서 해당 Lambda 트리거와 관련 있는 데이터로 테스트 이벤트를 설정할 수 있습니다. 다음은 이 코드 샘플의 테스트 이벤트입니다.

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

```
{
  "version": 1,
  "triggerSource": "CustomMessage_AdminCreateUser",
  "region": "<region>",
  "userPoolId": "<userPoolId>",
  "userName": "<userName>",
  "callerContext": {
      "awsSdk": "<calling aws sdk with version>",
      "clientId": "<apps client id>",
      ...
  },
  "request": {
      "userAttributes": {
          "phone_number_verified": false,
          "email_verified": true,
           ...
      },
      "codeParameter": "####",
      "usernameParameter": "username"
  },
  "response": {
      "smsMessage": "<custom message to be sent in the message with code parameter and username parameter>"
      "emailMessage": "<custom message to be sent in the message with code parameter and username parameter>"
      "emailSubject": "<custom email subject>"
  }
}
```

------

# 사용자 지정 발신자 Lambda 트리거
<a name="user-pool-lambda-custom-sender-triggers"></a>

Lambda는 사용자 풀에서 `CustomEmailSender` 및 `CustomSMSSender` 지원 타사 이메일 및 SMS 알림을 트리거합니다. SMS 및 이메일 공급자를 선택하여 Lambda 함수 코드 내에서 사용자에게 알림을 보낼 수 있습니다. Amazon Cognito가 사용자에게 초대, MFA 코드, 확인 코드, 인증 코드 및 임시 비밀번호를 전송하면 이벤트는 구성된 Lambda 함수를 활성화합니다. Amazon Cognito는 코드 및 임시 보안 암호를 활성화된 Lambda에 보냅니다. Amazon Cognito는 AWS KMS 고객 관리형 키와를 사용하여 이러한 보안 암호를 암호화합니다 AWS Encryption SDK. 는 일반 데이터를 암호화하고 해독하는 데 도움이 되는 클라이언트 측 암호화 라이브러리 AWS Encryption SDK 입니다.

**[CustomEmailSender](user-pool-lambda-custom-email-sender.md)**  
Amazon Cognito는 이 트리거를 호출하여 사용자에게 이메일 알림을 전송합니다.

**[CustomSMSSender](user-pool-lambda-custom-sms-sender.md)**  
Amazon Cognito는 이 트리거를 호출하여 사용자에게 SMS 알림을 전송합니다.

## 암호화 개념
<a name="user-pool-lambda-custom-sender-triggers-resources"></a>

Amazon Cognito는 사용자 지정 발신자 트리거에 보내는 이벤트에서 일반 텍스트로 사용자 코드를 보내지 않습니다. Lambda 함수는 이벤트에서 코드를 해독해야 합니다. 다음 개념은 함수가 사용자에게 전달할 수 있는 코드를 가져오는 데 사용해야 하는 암호화 아키텍처입니다.

**AWS KMS**  
AWS KMS 는 AWS KMS 키를 생성하고 제어하는 관리형 서비스입니다. 이러한 키는 데이터를 암호화합니다. 자세한 내용은 [AWS Key Management Service란 무엇입니까?](/kms/latest/developerguide/overview.html)를 참조하세요.

**KMS 키**  
KMS 키는 암호화 키를 논리적으로 표현한 것입니다. KMS 키에는 키 ID, 생성 날짜, 설명 및 키 상태와 같은 메타데이터가 포함됩니다. 또한 KMS 키에는 데이터를 암호화 및 복호화하는 데 사용되는 키 재료도 포함됩니다. 자세한 내용은 [AWS KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)를 참조하세요.

**대칭 KMS 키**  
대칭 KMS 키는 암호화되지 않은 상태로 AWS KMS 를 종료하지 않는 256비트 암호화 키입니다. 대칭 KMS 키를 사용하려면를 호출해야 합니다 AWS KMS. Amazon Cognito는 대칭 키를 사용합니다. 동일한 키가 암호화하고 해독합니다. 자세한 내용은 [대칭 KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)를 참조하세요.

## 사용자 지정 발신자 Lambda 트리거에 대해 알아야 할 사항
<a name="user-pool-lambda-custom-sender-triggers-things-to-know"></a>
+ 사용자 풀에서 이러한 Lambda 트리거를 사용하도록 구성하려면 AWS CLI 또는 SDK를 사용합니다. Amazon Cognito 콘솔에서는 이러한 구성을 사용할 수 없습니다.

  `UpdateUserPool` 작업은 Lambda 구성을 설정합니다. 이 작업에 대한 요청에는 사용자 풀의 모든 파라미터 *및* 변경하려는 파라미터가 필요합니다. 관련 파라미터를 모두 제공하지 않으면 Amazon Cognito에서 누락된 파라미터 값을 기본값으로 설정합니다. 다음 AWS CLI 예제에 설명된 대로 사용자 풀에 추가하거나 유지하려는 모든 Lambda 함수에 대한 항목을 포함합니다. 자세한 내용은 [사용자 풀 및 앱 클라이언트 구성 업데이트](cognito-user-pool-updating.md) 단원을 참조하십시오.

  ```
      #Send this parameter in an 'aws cognito-idp update-user-pool' CLI command, including any existing 
      #user pool configurations. This snippet also includes a pre sign-up trigger for syntax reference. The pre sign-up trigger
      #doesn't have a role in custom sender triggers.
                
        --lambda-config "PreSignUp=lambda-arn, \
                         CustomSMSSender={LambdaVersion=V1_0,LambdaArn=lambda-arn}, \
                         CustomEmailSender={LambdaVersion=V1_0,LambdaArn=lambda-arn}, \
                         KMSKeyID=key-id"
  ```

  `UpdateUserPool`의 JSON 본문을 사용하는 요청의 경우 다음 `LambdaConfig` 스니펫은 사용자 지정 SMS 및 이메일 발신자 함수를 할당합니다.

  ```
  "LambdaConfig": {
     "KMSKeyID": "arn:aws:kms:us-east-1:111122223333:key/a6c4f8e2-0c45-47db-925f-87854bc9e357",
     "CustomEmailSender": {
        "LambdaArn": "arn:aws:lambda:us-east-1:111122223333:function:MyFunction",
        "LambdaVersion": "V1_0"
     },
     "CustomSMSSender": {
        "LambdaArn": "arn:aws:lambda:us-east-1:111122223333:function:MyFunction",
        "LambdaVersion": "V1_0"
     }
  ```
+ `update-user-pool` AWS CLI 명령으로 사용자 지정 발신자 Lambda 트리거를 제거하려면에서 `CustomSMSSender` 또는 `CustomEmailSender` 파라미터를 생략`--lambda-config`하고 사용자 풀에 사용할 다른 모든 트리거를 포함합니다.

  `UpdateUserPool` API 요청이 포함된 사용자 지정 발신자 Lambda 트리거를 제거하려면 나머지 사용자 풀 구성을 포함하는 요청 본문에서 `CustomSMSSender` 또는 `CustomEmailSender` 파라미터를 생략합니다.
+ Amazon Cognito HTML은 사용자의 임시 암호에 있는 `<`(`&lt;`) 및`>`(`&gt;`) 같은 예약 문자를 이스케이프 처리합니다. 이러한 문자는 Amazon Cognito가 사용자 지정 이메일 발신자 함수로 보내는 임시 암호에 표시될 수 있지만, 임시 확인 코드에는 표시되지 않습니다. 임시 암호를 전송하려면 Lambda 함수가 암호를 해독하고 이러한 문자를 이스케이프 해제한 다음 사용자에게 메시지를 전송해야 합니다.

## 사용자 지정 발신자 Lambda 트리거 활성화
<a name="enable-custom-sender-lambda-trigger"></a>

사용자 풀에 SMS 또는 이메일 메시지를 보내기 위해 사용자 지정 로직을 사용하려면 사용자 지정 발신자 트리거를 설정합니다. 다음 절차에서는 사용자 풀에 사용자 지정 SMS 트리거, 사용자 지정 이메일 트리거 또는 둘 다를 할당합니다. 사용자 지정 발신자 트리거를 추가하면 Amazon Cognito는 SMS 또는 이메일 메시지를 보내는 기본 동작 대신 전화번호, 일회용 코드 등의 사용자 속성을 항상 Lambda 함수로 전송합니다.

1.  AWS Key Management Service ()에서 [대칭 암호화 키를](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks) 생성합니다AWS KMS. Amazon Cognito는 보안 암호(임시 암호, 확인 코드, 인증용 일회용 암호, 확인 코드)을 생성한 다음 이 KMS 키를 사용하여 [AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html)로 보안 암호를 암호화합니다. 그런 다음 Lambda 함수 AWS Encryption SDK 의를 사용하여 보안 암호를 해독하고 일반 텍스트로 사용자에게 보낼 수 있습니다.

1. 사용자 풀을 생성하거나 업데이트하는 IAM 보안 주체는 Amazon Cognito가 코드를 암호화하는 데 사용하는 KMS 키에 대해 일회용 권한 부여를 생성합니다. KMS 키에 대한이 보안 주체 `CreateGrant` 권한을 부여합니다. 이 예제 KMS 키 정책이 적용되려면 사용자 풀을 업데이트하는 관리자가 IAM 역할 `arn:aws:iam::111222333444:role/my-example-administrator-role`에 대한 위임된 역할 세션으로 로그인해야 합니다.

   사용자 환경에 맞게 수정된 다음 리소스 기반 정책을 KMS 키에 적용합니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
       {
           "Effect": "Allow",
           "Principal": {
               "AWS": "arn:aws:iam::111122223333:role/my-example-administrator-role"
           },
           "Action": "kms:CreateGrant",
           "Resource": "arn:aws:kms:us-west-2:111122223333:key/1example-2222-3333-4444-999example",
           "Condition": {
               "StringEquals": {
                  "kms:EncryptionContext:userpool-id": "us-west-2_EXAMPLE"
               }
           }
       },
       {
           "Sid": "Allow Lambda to decrypt",
           "Effect": "Allow",
           "Principal": {
               "AWS": "arn:aws:iam::111122223333:role/my-lambda-function-role"
           },
           "Action": "kms:Decrypt",
           "Resource": "*"
       }]
   }
   ```

------

1. 사용자 지정 SMS 발신자 트리거에 대한 Lambda 함수를 생성합니다. Amazon Cognito는 [AWS 암호화 SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html)를 사용하여 보안 암호, 임시 암호 및 사용자의 API 요청을 인증하는 코드를 암호화합니다.

   1. 최소한 KMS 키에 대한 `kms:Decrypt` 권한이 있는 [Lambda 실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)을 할당합니다.

   1. Lambda 함수 코드를 작성하여 메시지를 전송합니다. 함수에 대한 입력 이벤트에는 보안 암호가 포함되어 있습니다. 함수에서를 사용하여 보안 암호를 해독 AWS Encryption SDK 하고 관련 메타데이터를 처리합니다. 그런 다음 코드, 사용자 지정 메시지 및 대상 전화번호를 메시지를 전달하는 사용자 지정 API에 전송합니다.

   1. Lambda 함수 AWS Encryption SDK 에를 추가합니다. 자세한 내용은 [AWS 암호화 SDK 프로그래밍 언어](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/programming-languages.html)를 참조하세요. Lambda 패키지를 업데이트하려면 다음 단계를 완료하세요.

      1. Lambda 함수를 AWS Management Console에 .zip 파일로 내보냅니다.

      1. 함수를 열고를 추가합니다 AWS Encryption SDK. 자세한 내용과 다운로드 링크는 *AWS Encryption SDK 개발자 안내서*의 [AWS Encryption SDK 프로그래밍 언어](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/programming-languages.html)를 참조하세요.

      1. SDK 종속성과 함께 함수를 압축하고 함수를 Lambda에 업로드합니다. 자세한 내용은 *AWS Lambda 개발자 안내서*의 [Lambda 함수를 .zip 파일 아카이브로 배포](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-zip.html#configuration-function-create)를 참조하세요.

1. Amazon Cognito 서비스 보안 주체 `cognito-idp.amazonaws.com`에 Lambda 함수를 호출할 수 있는 권한을 부여합니다.

   다음 AWS CLI 명령은 Amazon Cognito에 Lambda 함수를 호출할 수 있는 권한을 부여합니다.

   ```
   aws lambda add-permission --function-name lambda_arn --statement-id "CognitoLambdaInvokeAccess" --action lambda:InvokeFunction --principal cognito-idp.amazonaws.com
   ```

1. 사용자 지정 발신자 Lambda 트리거를 추가하는 `LambdaConfig` 파라미터를 사용하여 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) API 요청을 생성합니다. Amazon Cognito 콘솔에서는 이 유형의 트리거를 추가할 수 없습니다. 사용자 지정 발신자 트리거에는 `KMSKeyID` 및 `CustomSMSSender` 또는 `CustomEmailSender`(또는 둘 다)의 `LambdaConfig` 파라미터가 필요합니다.

# 사용자 정의 이메일 발신자 Lambda 트리거
<a name="user-pool-lambda-custom-email-sender"></a>

사용자 지정 이메일 발신자 트리거를 사용자 풀에 할당하면 Amazon Cognito가 사용자 이벤트로 인해 이메일 메시지를 전송해야 하는 경우 기본 동작 대신 Lambda 함수를 호출합니다. 사용자 지정 발신자 트리거를 사용하면 AWS Lambda 함수가 선택한 메서드와 공급자를 통해 사용자에게 이메일 알림을 보낼 수 있습니다. 함수의 사용자 지정 코드는 사용자 풀의 모든 이메일 메시지를 처리하고 전달해야 합니다.

이 트리거는 사용자 풀이 이메일 메시지를 보내는 방법을 더 잘 제어하려는 시나리오를 제공합니다. 예를 들어 여러 개의 인증 ID를 관리하거나 AWS 리전간에 사용하려는 경우와 같이 Lambda 함수를 사용하여 Amazon SES API 작업에 대한 호출을 사용자 지정할 수 있습니다. 함수는 메시지를 다른 전송 미디어 또는 타사 서비스로 리디렉션할 수도 있습니다.

사용자 지정 이메일 발신자 트리거를 구성하는 방법은 [사용자 지정 발신자 Lambda 트리거 활성화](user-pool-lambda-custom-sender-triggers.md#enable-custom-sender-lambda-trigger) 섹션을 참조하세요.

## 사용자 정의 이메일 발신자 Lambda 트리거 소스
<a name="trigger-source"></a>

다음 표에는 Lambda 코드의 사용자 지정 이메일 트리거 소스에 대한 트리거 이벤트가 나와 있습니다.


| `TriggerSource value` | Event | 
| --- | --- | 
| CustomEmailSender\$1SignUp | 사용자가 가입하면 Amazon Cognito에서 시작 메시지를 보냅니다. | 
| CustomEmailSender\$1Authentication | 사용자가 로그인하면 Amazon Cognito가 이메일 OTP 또는 MFA 코드를 보냅니다. | 
| CustomEmailSender\$1ForgotPassword | 사용자가 암호를 재설정하는 코드를 요청합니다. | 
| CustomEmailSender\$1ResendCode | 사용자가 대체 계정 확인 코드를 요청합니다. | 
| CustomEmailSender\$1UpdateUserAttribute | 사용자가 이메일 주소 또는 전화 번호 속성을 업데이트하면 Amazon Cognito에서 속성을 확인하는 코드를 보냅니다. | 
| CustomEmailSender\$1VerifyUserAttribute | 사용자가 새 이메일 주소 또는 전화 번호 속성을 생성하면 Amazon Cognito에서 속성을 확인하는 코드를 보냅니다. | 
| CustomEmailSender\$1AdminCreateUser | 사용자 풀에 새 사용자를 생성하면 Amazon Cognito에서 해당 사용자에게 임시 암호를 보냅니다. | 
| CustomEmailSender\$1AccountTakeOverNotification | Amazon Cognito는 사용자 계정을 획득하려는 시도를 감지하고 사용자에게 알림을 보냅니다. | 

## 사용자 지정 이메일 발신자 Lambda 트리거 파라미터
<a name="custom-email-sender-parameters"></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": {
        "type": "customEmailSenderRequestV1",
        "code": "string",
        "clientMetadata": {
            "string": "string",
             . . .
            },
        "userAttributes": {
            "string": "string",
            . . .
         }
}
```

------

### 사용자 지정 이메일 발신자 요청 파라미터
<a name="custom-email-sender-request-parameters"></a>

**type**  
요청 버전입니다. 사용자 지정 이메일 발신자 이벤트의 경우 이 문자열의 값은 항상 `customEmailSenderRequestV1`입니다.

**code**  
함수가 해독하여 사용자에게 보낼 수 있는 암호화된 코드입니다.

**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 파라미터에서 전달된 데이터를 포함하지 않습니다.  
Amazon Cognito는 다음과 같은 트리거 소스가 있는 이벤트에서 사용자 지정 이메일 트리거 함수로 `ClientMetadata`를 전송합니다.  
+ `CustomEmailSender_ForgotPassword`
+ `CustomEmailSender_SignUp`
+ `CustomEmailSender_Authentication`
Amazon Cognito는 소스 `CustomEmailSender_AccountTakeOverNotification`를 사용하여 트리거 이벤트에서 `ClientMetadata`를 전송하지 않습니다.

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

### 사용자 지정 이메일 발신자 응답 파라미터
<a name="custom-email-sender-response-parameters"></a>

Amazon Cognito는 사용자 지정 이메일 발신자 응답에서 추가 반환 정보를 기대하지 않습니다. Lambda 함수는 이벤트를 해석하고 코드를 복호화한 다음 메시지 내용을 전달해야 합니다. 일반적인 함수는 이메일 메시지를 조합하여 타사 SMTP 릴레이로 전달합니다.

## 코드 예제
<a name="custom-email-sender-code-examples"></a>

다음 Node.js 예제에서는 사용자 지정 이메일 발신자 Lambda 함수에서 이메일 메시지 이벤트를 처리합니다. 이 예에서는 함수에 두 개의 환경 변수가 정의되어 있다고 가정합니다.

**`KEY_ID`**  
사용자 코드를 암호화하고 복호화하는 데 사용하려는 KMS 키의 ID입니다.

**`KEY_ARN`**  
사용자 코드를 암호화하고 복호화하는 데 사용하려는 KMS 키의 Amazon 리소스 이름(ARN)입니다.

**이 함수를 배포하려면**

1. 개발자 워크스페이스에 최신 버전의 NodeJS를 설치합니다.

1. 워크스페이스에서 새 NodeJS 프로젝트를 생성합니다.

1. `npm init -y`를 사용하여 프로젝트를 초기화합니다.

1. Lambda 함수 `touch index.mjs`의 스크립트를 생성합니다.

1. 아래 예제의 내용을 `index.mjs`에 붙여 넣습니다.

1. 프로젝트 종속성 다운로드 AWS Encryption SDK: `npm install @aws-crypto/client-node`.

1. 프로젝트 디렉토리를 `zip -r my_deployment_package.zip .`이라는 파일로 압축합니다.

1. [ZIP 파일을 함수에 배포합니다](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html).

이 예제 함수는 코드를 복호화하고, 가입 이벤트의 경우 사용자의 이메일 주소로 이메일 메시지를 보내는 것을 시뮬레이션합니다.

```
import { KmsKeyringNode, buildClient, CommitmentPolicy } from '@aws-crypto/client-node';

// Configure the encryption SDK client with the KMS key from the environment variables
const { encrypt, decrypt } = buildClient(
    CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT
);

const generatorKeyId = process.env.KEY_ID;
const keyIds = [process.env.KEY_ARN];
const keyring = new KmsKeyringNode({ generatorKeyId, keyIds });

// Example function to simulate sending email.
// This example logs message details to CloudWatch Logs from your Lambda function.
// Update this function with custom logic that sends an email message to 'emailaddress' with body 'message'.
const sendEmail = async (emailAddress, message) => {
    // Log the destination with the email address masked.
    console.log(`Simulating email send to ${emailAddress.replace(/[^@.]/g, '*')}`);
    // Log the message with the code masked.
    console.log(`Message content: ${message.replace(/\b\d{6,8}\b/g, '********')}`);
    // Simulate API delay
    await new Promise(resolve => setTimeout(resolve, 100));
    console.log('Email sent successfully');
    return true;
};

export const handler = async (event) => {
    try {
        // Decrypt the secret code using encryption SDK
        let plainTextCode;
        if (event.request.code) {
            const { plaintext, messageHeader } = await decrypt(keyring, Buffer.from(event.request.code, 'base64'));
            plainTextCode = Buffer.from(plaintext).toString('utf-8');
        }

        // Handle different trigger sources
        if (event.triggerSource == 'CustomEmailSender_SignUp') {
            const emailAddress = event.request.userAttributes.email;
            const message = `Welcome! Your verification code is: ${plainTextCode}`;
            await sendEmail(emailAddress, message);
        }
        else if (event.triggerSource == 'CustomEmailSender_ResendCode') {
            // Handle resend code
        }
        else if (event.triggerSource == 'CustomEmailSender_ForgotPassword') {
            // Handle forgot password
        }
        else if (event.triggerSource == 'CustomEmailSender_UpdateUserAttribute') {
            // Handle update attribute
        }
        else if (event.triggerSource == 'CustomEmailSender_VerifyUserAttribute') {
            // Handle verify attribute
        }
        else if (event.triggerSource == 'CustomEmailSender_AdminCreateUser') {
            // Handle admin create user
        }
        else if (event.triggerSource == 'CustomEmailSender_Authentication') {
            // Handle authentication
        }
        else if (event.triggerSource == 'CustomEmailSender_AccountTakeOverNotification') {
            // Handle account takeover notification
        }

        return;
    } catch (error) {
        console.error('Error in custom email sender:', error);
        throw error;
    }
};
```

# 사용자 지정 SMS 발신자 Lambda 트리거
<a name="user-pool-lambda-custom-sms-sender"></a>

사용자 지정 SMS 발신자 트리거를 사용자 풀에 할당하면 Amazon Cognito가 사용자 이벤트로 인해 SMS 메시지를 전송해야 하는 경우 기본 동작 대신 Lambda 함수를 호출합니다. 사용자 지정 발신자 트리거를 사용하면 AWS Lambda 함수가 선택한 메서드와 공급자를 통해 사용자에게 SMS 알림을 보낼 수 있습니다. 함수의 사용자 지정 코드는 사용자 풀의 모든 SMS 메시지를 처리하고 전달해야 합니다.

이 트리거는 사용자 풀이 SMS 메시지를 보내는 방법을 더 잘 제어하려는 시나리오를 제공합니다. 예를 들어 여러 개의 발신 ID를 관리하거나 AWS 리전간에 사용하려는 경우와 같이 Lambda 함수를 사용하여 Amazon SNS API 작업에 대한 호출을 사용자 지정할 수 있습니다. 함수는 메시지를 다른 전송 미디어 또는 타사 서비스로 리디렉션할 수도 있습니다.

사용자 지정 이메일 발신자 트리거를 구성하는 방법은 [사용자 지정 발신자 Lambda 트리거 활성화](user-pool-lambda-custom-sender-triggers.md#enable-custom-sender-lambda-trigger) 섹션을 참조하세요.

## 사용자 지정 SMS 발신자 Lambda 트리거 소스
<a name="trigger-source"></a>

다음 표에는 Lambda 코드의 사용자 지정 SMS 트리거 소스에 대한 트리거 이벤트가 나와 있습니다.


| `TriggerSource value` | Event | 
| --- | --- | 
| CustomSMSSender\$1SignUp | 사용자가 가입하면 Amazon Cognito에서 시작 메시지를 보냅니다. | 
| CustomSMSSender\$1ForgotPassword | 사용자가 암호를 재설정하는 코드를 요청합니다. | 
| CustomSMSSender\$1ResendCode | 사용자가 새 코드를 요청하여 등록을 확인합니다. | 
| CustomSMSSender\$1VerifyUserAttribute | 사용자가 새 이메일 주소 또는 전화 번호 속성을 생성하면 Amazon Cognito에서 속성을 확인하는 코드를 보냅니다. | 
| CustomSMSSender\$1UpdateUserAttribute | 사용자가 이메일 주소 또는 전화 번호 속성을 업데이트하면 Amazon Cognito에서 속성을 확인하는 코드를 보냅니다. | 
| CustomSMSSender\$1Authentication | 사용자가 로그인하면 Amazon Cognito가 SMS OTP 또는 MFA 코드를 전송합니다. | 
| CustomSMSSender\$1AdminCreateUser | 사용자 풀에 새 사용자를 생성하면 Amazon Cognito에서 해당 사용자에게 임시 암호를 보냅니다. | 

## 사용자 지정 SMS 발신자 Lambda 트리거 파라미터
<a name="custom-sms-sender-parameters"></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": {
        "type": "customSMSSenderRequestV1",
        "code": "string",
        "clientMetadata": {
            "string": "string",
             . . .
            },
        "userAttributes": {
            "string": "string",
            . . .
         }
}
```

------

### 사용자 지정 SMS 발신자 요청 파라미터
<a name="custom-sms-sender-request-parameters"></a>

**type**  
요청 버전입니다. 사용자 지정 SMS 발신자 이벤트의 경우 이 문자열의 값은 항상 `customSMSSenderRequestV1`입니다.

**code**  
함수가 해독하여 사용자에게 보낼 수 있는 암호화된 코드입니다.

**clientMetadata**  
사용자 지정 SMS 발신자 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 파라미터에서 전달된 데이터를 포함하지 않습니다.

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

### 사용자 지정 SMS 발신자 응답 파라미터
<a name="custom-sms-sender-response-parameters"></a>

Amazon Cognito는 응답에서 추가 반환 정보를 기대하지 않습니다. 함수는 API 작업을 사용하여 리소스를 쿼리 및 수정하거나 이벤트 메타데이터를 외부 시스템에 기록할 수 있습니다.

## 코드 예제
<a name="custom-sms-sender-code-examples"></a>

다음 Node.js 예제에서는 사용자 지정 SMS 발신자 Lambda 함수에서 SMS 메시지 이벤트를 처리합니다. 이 예에서는 함수에 두 개의 환경 변수가 정의되어 있다고 가정합니다.

**`KEY_ID`**  
사용자 코드를 암호화하고 복호화하는 데 사용하려는 KMS 키의 ID입니다.

**`KEY_ARN`**  
사용자 코드를 암호화하고 복호화하는 데 사용하려는 KMS 키의 Amazon 리소스 이름(ARN)입니다.

**이 함수를 배포하려면**

1. 개발자 워크스페이스에 최신 버전의 NodeJS를 설치합니다.

1. 워크스페이스에서 새 NodeJS 프로젝트를 생성합니다.

1. `npm init -y`를 사용하여 프로젝트를 초기화합니다.

1. Lambda 함수 `touch index.mjs`의 스크립트를 생성합니다.

1. 아래 예제의 내용을 `index.mjs`에 붙여 넣습니다.

1. 프로젝트 종속성 다운로드 AWS Encryption SDK: `npm install @aws-crypto/client-node`.

1. 프로젝트 디렉토리를 `zip -r my_deployment_package.zip .`이라는 파일로 압축합니다.

1. [ZIP 파일을 함수에 배포합니다](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html).

```
import { KmsKeyringNode, buildClient, CommitmentPolicy } from '@aws-crypto/client-node';

// Configure the encryption SDK client with the KMS key from the environment variables
const { encrypt, decrypt } = buildClient(
    CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT
);

const generatorKeyId = process.env.KEY_ID;
const keyIds = [process.env.KEY_ARN];
const keyring = new KmsKeyringNode({ generatorKeyId, keyIds });

// Example function to simulate sending SMS.
// This example logs message details to CloudWatch Logs from your Lambda function.
// Update this function with custom logic that sends an SMS message to 'phoneNumber' with body 'message'.
const sendSMS = async (phoneNumber, message) => {
    // Log the destination with the phone number masked.
    console.log(`Simulating SMS send to ${phoneNumber.replace(/[^+]/g, '*')}`);
    // Log the message with the code masked.
    console.log(`Message content: ${message.replace(/\b\d{6,8}\b/g, '********')}`);    
    // Simulate API delay
    await new Promise(resolve => setTimeout(resolve, 100));
    console.log('SMS sent successfully');
    return true;
};

export const handler = async (event) => {
    try {
        // Decrypt the secret code using encryption SDK
        let plainTextCode;
        if (event.request.code) {
            const { plaintext, messageHeader } = await decrypt(keyring, Buffer.from(event.request.code, 'base64'));
            plainTextCode = Buffer.from(plaintext).toString('utf-8');
        }

        // Handle different trigger sources
        if (event.triggerSource == 'CustomSMSSender_SignUp') {
            const phoneNumber = event.request.userAttributes.phone_number;
            const message = `Welcome! Your verification code is: ${plainTextCode}`;
            await sendSMS(phoneNumber, message);
        }
        else if (event.triggerSource == 'CustomSMSSender_ResendCode') {
            // Handle resend code
        }
        else if (event.triggerSource == 'CustomSMSSender_ForgotPassword') {
            // Handle forgot password
        }
        else if (event.triggerSource == 'CustomSMSSender_UpdateUserAttribute') {
            // Handle update attribute
        }
        else if (event.triggerSource == 'CustomSMSSender_VerifyUserAttribute') {
            // Handle verify attribute
        }
        else if (event.triggerSource == 'CustomSMSSender_AdminCreateUser') {
            // Handle admin create user
        }
        return;
    } catch (error) {
        console.error('Error in custom SMS sender:', error);
        throw error;
    }
};
```

**Topics**
+ [사용자 지정 SMS 발신자 Lambda 트리거 소스](#trigger-source)
+ [사용자 지정 SMS 발신자 Lambda 트리거 파라미터](#custom-sms-sender-parameters)
+ [코드 예제](#custom-sms-sender-code-examples)
+ [사용자 지정 SMS 발신자 함수로 SMS 메시지 기능 평가](#sms-to-email-example)

## 사용자 지정 SMS 발신자 함수로 SMS 메시지 기능 평가
<a name="sms-to-email-example"></a>

사용자 지정 SMS 발신자 Lambda 함수는 사용자 풀이 보낼 SMS 메시지를 수락하고, 함수는 사용자 지정 논리를 기반으로 콘텐츠를 전달합니다. Amazon Cognito는 [사용자 지정 SMS 발신자 Lambda 트리거 파라미터](#custom-sms-sender-parameters)를 사용자의 함수에 보냅니다. 함수는 이 정보로 원하는 것을 할 수 있습니다. 예를 들어, 코드를 Amazon SNS Simple Notification Service(Amazon SNS) 주제에 보낼 수 있습니다. Amazon SNS 주제 구독자는 SMS 메시지, HTTPS 엔드포인트 또는 이메일 주소일 수 있습니다.

사용자 지정 SMS 발신자 Lambda 함수를 사용하여 Amazon Cognito SMS 메시징에 대한 테스트 환경을 생성하려면 [GitHub의 aws-samples 라이브러리](https://github.com/aws-samples)의 [amazon-cognito-user-pool-development-and-testing-with-sms-redirected-to-email](https://github.com/aws-samples/amazon-cognito-user-pool-development-and-testing-with-sms-redirected-to-email)을 참조하세요. 리포지토리에는 새 사용자 풀을 생성하거나 이미 보유한 사용자 풀로 작업할 수 있는 AWS CloudFormation 템플릿이 포함되어 있습니다. 이러한 템플릿은 Lambda 함수와 Amazon SNS 주제를 생성합니다. 템플릿이 사용자 지정 SMS 발신자 트리거로 할당하는 Lambda 함수는 SMS 메시지를 Amazon SNS 주제의 구독자로 리디렉션합니다.

이 솔루션을 사용자 풀에 배포하면 Amazon Cognito가 일반적으로 SMS 메시징을 통해 보내는 모든 메시지, 즉 Lambda 함수는 대신 중앙 이메일 주소로 보냅니다. 이 솔루션을 사용하여 SMS 메시지를 사용자 지정하고 미리 보고 Amazon Cognito에서 SMS 메시지를 보내도록 하는 사용자 풀 이벤트를 테스트할 수 있습니다. 테스트를 완료한 후 CloudFormation 스택을 롤백하거나 사용자 풀에서 사용자 지정 SMS 발신자 함수 할당을 제거합니다.

**중요**  
[amazon-cognito-user-pool-development-and-testing-with-sms-redirected-to-email](https://github.com/aws-samples/amazon-cognito-user-pool-development-and-testing-with-sms-redirected-to-email)의 템플릿을 사용하여 프로덕션 환경을 구축하지 않습니다. 솔루션의 사용자 지정 SMS 발신자 Lambda 함수에서 SMS 메시지를 *시뮬레이션*하지만 Lambda 함수는 이 모든 메시지를 하나의 중앙 이메일 주소로 보냅니다. 프로덕션 Amazon Cognito 사용자 풀에서 SMS 메시지를 보내려면 먼저 [Amazon Cognito 사용자 풀의 SMS 메시지 설정](user-pool-sms-settings.md)에 표시된 요구 사항을 완료해야 합니다.