Cognito Identity Id와 User Pool Id 매핑하기

Cognito User Pool을 사용해 사용자를 관리하고, Identity Pool을 통해 AWS 리소스를 보호하는 경우 흥미로운 문제에 직면할 수 있습니다. Lambda 함수에서 사용자의 User Pool User Id를 어떻게 찾을 수 있을까요?

Identity Pool 사용자 ID vs User Pool 사용자 ID

Lambda 함수를 다룬 챕터에서 event.requestContext.identity.cognitoIdentityId를 사용자 ID로 사용한 것을 기억할 것입니다. 이 ID는 Identity Pool을 통해 사용자에게 할당된 ID입니다. 하지만 이 ID를 사용해 User Pool에서 사용자 정보를 조회할 수는 없습니다. Lambda 함수에 접근하려면 사용자가 다음 단계를 거쳐야 하기 때문입니다:

  1. User Pool을 통해 인증
  2. Identity Pool을 통해 신원 연동

두 번째 단계에서 User Pool 정보는 더 이상 사용할 수 없게 됩니다. 이 흐름을 더 잘 이해하려면 Cognito User Pool vs Identity Pool 챕터를 참고하세요. 간단히 말해, 첫 번째 단계에서 여러 인증 프로바이더를 사용할 수 있으며, Identity Pool은 모든 사용자에게 전역적으로 사용할 수 있는 사용자 ID를 제공합니다.

사용자 풀 사용자 ID 찾기

여러분이 Lambda 함수에서 사용자의 User Pool 사용자 ID를 찾아야 할 때가 있을 수 있습니다. 아래 과정은 공식 문서에 나와 있지 않지만, 우리가 사용해 온 방법이며 이 문제를 잘 해결해 줍니다.

아래는 사용자의 User Pool 사용자 ID를 찾는 Lambda 함수 예제입니다.

export async function main(event, context) {
  const authProvider = event.requestContext.authorizer.iam.cognitoIdentity.amr.findLast(ref => ref.includes(':'))
  // Cognito 인증 프로바이더는 다음과 같은 형태입니다:
  // cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx,cognito-idp.us-east-1.amazonaws.com/us-east-1_aaaaaaaaa:CognitoSignIn:qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr
  // 여기서 us-east-1_aaaaaaaaa는 User Pool ID입니다
  // 그리고 qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr는 User Pool 사용자 ID입니다
  const parts = authProvider.split(':');
  const userPoolIdParts = parts[parts.length - 3].split('/');

  const userPoolId = userPoolIdParts[userPoolIdParts.length - 1];
  const userPoolUserId = parts[parts.length - 1];

  ...
}

event.requestContext.identity.cognitoAuthenticationProvider는 User Pool에서 가져온 인증 정보를 담고 있는 문자열을 제공합니다. 이 정보는 사용하는 인증 프로바이더에 따라 다를 수 있습니다. 이 문자열은 다음과 같은 형식을 가집니다:

cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx,cognito-idp.us-east-1.amazonaws.com/us-east-1_aaaaaaaaa:CognitoSignIn:qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr

여기서 us-east-1_aaaaaaaaa는 User Pool ID이고, qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr는 User Pool 사용자 ID입니다. 위에서 설명한 것처럼 간단한 JavaScript를 사용해 이 정보를 추출할 수 있습니다.

이제 여러분은 AWS IAM과 Federated Identities를 사용해 Lambda 함수를 보호하면서도 사용자의 User Pool 사용자 ID에 접근할 수 있습니다.