Cognito Identity Pool 생성하기

이제 백엔드 API를 배포했으므로, 백엔드에 필요한 거의 모든 요소를 갖추게 되었습니다. 사용자 풀(User Pool)은 모든 사용자를 저장하고 로그인 및 회원가입을 도와줍니다. 또한 사용자가 노트에 첨부 파일을 업로드할 수 있도록 도와줄 S3 버킷도 있습니다. 이 모든 서비스를 안전하게 연결해주는 마지막 조각은 Amazon Cognito Federated Identities입니다.

Amazon Cognito Federated Identities는 개발자가 사용자에게 고유한 ID를 생성하고, 연동된 ID 제공자(identity provider)를 통해 사용자를 인증할 수 있게 해줍니다. 연동된 ID를 사용하면 Amazon DynamoDB, Amazon S3, Amazon API Gateway와 같은 다른 AWS 서비스에 안전하게 접근할 수 있는 임시적이고 제한된 권한의 AWS 자격 증명을 얻을 수 있습니다.

이번 장에서는 연동된 Cognito Identity Pool을 생성할 것입니다. 사용자 풀을 ID 제공자로 사용할 예정입니다. 페이스북, 구글 또는 커스텀 ID 제공자를 사용할 수도 있습니다. 사용자가 사용자 풀을 통해 인증되면, Identity Pool은 해당 사용자에게 IAM 역할을 부여합니다. 이 IAM 역할에 대한 정책을 정의하여 S3 버킷과 API에 대한 접근 권한을 부여할 것입니다. 이는 AWS 리소스를 보호하는 아마존의 방식입니다.

시작해봅시다.

풀 생성하기

AWS 콘솔에서 서비스 목록에서 Cognito를 선택합니다.

Cognito 서비스 선택 스크린샷

Manage Federated Identities를 선택합니다.

Manage Federated Identities 선택 스크린샷

Identity pool name을 입력합니다. 기존 Identity Pool이 있다면 Create new identity pool 버튼을 클릭해야 합니다.

Cognito Identity Pool 정보 입력 스크린샷

Authentication providers를 선택합니다. Cognito 탭에서 Cognito 사용자 풀 생성 챕터에서 생성한 User Pool IDApp Client ID를 입력합니다. Create Pool을 선택합니다.

인증 프로바이더 정보 입력 스크린샷

이제 Cognito Identity Pool에서 얻은 임시 자격 증명을 가진 사용자가 접근할 수 있는 AWS 리소스를 지정해야 합니다.

View Details를 선택합니다. 두 개의 Role Summary 섹션이 확장됩니다. 상단 섹션은 인증된 사용자에 대한 권한 정책을 요약하고, 하단 섹션은 인증되지 않은 사용자에 대한 정책을 요약합니다.

상단 섹션에서 View Policy Document를 선택한 후 Edit을 선택합니다.

정책 문서 편집 선택 스크린샷

문서를 읽으라는 경고가 표시됩니다. Ok를 선택하여 편집합니다.

정책 편집 확인 스크린샷

Change indicator 다음 정책을 편집기에 추가합니다. YOUR_S3_UPLOADS_BUCKET_NAME파일 업로드를 위한 S3 버킷 생성 챕터에서 얻은 버킷 이름으로 대체합니다. 그리고 YOUR_API_GATEWAY_REGIONYOUR_API_GATEWAY_IDAPI 배포 챕터에서 얻은 값으로 대체합니다.

이 예제에서 YOUR_S3_UPLOADS_BUCKET_NAMEnotes-app-uploads, YOUR_API_GATEWAY_IDly55wbovq4, YOUR_API_GATEWAY_REGIONus-east-1입니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "mobileanalytics:PutEvents",
        "cognito-sync:*",
        "cognito-identity:*"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::YOUR_S3_UPLOADS_BUCKET_NAME/private/${cognito-identity.amazonaws.com:sub}/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "execute-api:Invoke"
      ],
      "Resource": [
        "arn:aws:execute-api:YOUR_API_GATEWAY_REGION:*:YOUR_API_GATEWAY_ID/*/*/*"
      ]
    }
  ]
}

사용자가 User Pool로 인증되고 Identity Pool로 검증되면 이 IAM 역할이 할당됩니다. 이 역할은 사용자가 AWS 계정에서 접근할 수 있는 리소스를 제한합니다.

S3 버킷과 관련된 부분을 간단히 설명하자면, 위 정책에서 로그인한 사용자에게 private/${cognito-identity.amazonaws.com:sub}/ 경로에 대한 접근 권한을 부여합니다. 여기서 cognito-identity.amazonaws.com:sub는 인증된 사용자의 연합 ID(사용자 ID)입니다. 따라서 사용자는 버킷 내 자신의 폴더에만 접근할 수 있습니다. 이렇게 해서 각 사용자의 업로드를 보호합니다.

요약하면, 인증된 사용자가 두 가지 리소스에 접근할 수 있도록 AWS에 알리고 있습니다.

  1. S3 버킷 내에서 자신의 연합 ID로 이름이 지정된 폴더 안에 있는 파일.
  2. API Gateway를 통해 배포한 API.

또한, 연합 ID는 Identity Pool에서 할당된 UUID입니다. 이 ID는 User Pool에서 할당된 ID와 다릅니다. 이는 여러 인증 프로바이더가 있을 수 있기 때문입니다. Identity Pool은 이러한 ID를 _연합_하여 각 사용자에게 고유한 ID를 제공합니다.

다음으로 Allow을 선택합니다.

Cognito Identity Pool 정책 제출 스크린샷

이제 Cognito Identity Pool이 생성되었습니다. Identity Pool ID를 확인해 보겠습니다.

왼쪽 패널에서 Dashboard를 선택한 후 Edit identity pool을 선택합니다.

Cognito Identity Pool 생성 완료 스크린샷

Identity pool ID를 기록해 둡니다. 이 ID는 이후 챕터에서 필요합니다.

Cognito Identity Pool ID 스크린샷

이제 우리가 지금까지 생성한 것을 사용하여 API에 대한 접근을 보호할 준비가 되었습니다.