본문 바로가기
개발 환경/AWS

[AWS] Amazon Cognito ID 토큰을 사용하여 프론트엔드에서 Private S3 직접 접근하기

by 우주다람쥐 2025. 2. 25.
반응형

 

AWS S3는 기본적으로 인증되지 않은 사용자의 접근을 차단하지만, Cognito와 IAM 정책을 활용하면 특정 사용자에게 권한을 부여할 수 있습니다. 이번 글에서는 Cognito ID 토큰을 사용하여 프론트엔드에서 Private S3 버킷에 직접 접근하는 방법을 다룹니다. 예제는 Node.js와 AWS SDK v3을 사용합니다.

 

 

1. 아키텍처 개요

프론트엔드에서 사용자가 로그인하면 Cognito User Pool이 ID 토큰을 반환합니다. 이 토큰을 이용해 Cognito Identity Pool을 통해 임시 AWS 자격 증명을 얻고, 이를 사용하여 S3 버킷에 접근합니다.

  1. 사용자가 Cognito User Pool을 통해 로그인
  2. 로그인 후 ID 토큰을 프론트엔드에서 가져옴
  3. Cognito Identity Pool을 사용하여 AWS 임시 자격 증명 획득
  4. 획득한 자격 증명으로 S3 객체 직접 업로드/다운로드

 

2. Cognito User Pool & Identity Pool 설정

2.1 User Pool 생성

  1. AWS 콘솔에서 Cognito > User Pool을 생성합니다.
  2. 기본 설정으로 진행하되, ID 토큰을 발급받도록 설정합니다.
  3. 사용자 로그인 방법으로 이메일 또는 사용자 이름을 선택합니다.

2.2 Identity Pool 생성

  1. AWS 콘솔에서 Cognito > Identity Pool을 생성합니다.
  2. "자격 증명 공급자로 Cognito User Pool 추가" 옵션을 활성화하고, User Pool ID 및 App Client ID를 입력합니다.
  3. 기본 IAM 역할을 생성하고, S3에 접근할 수 있도록 권한을 부여합니다.

2.3 IAM 정책 추가

Identity Pool을 통해 생성된 역할에 S3 접근 권한을 추가합니다.

 

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": "arn:aws:s3:::your-bucket-name/*"
    }
  ]
}

 

 

3. 프론트엔드에서 ID 토큰을 사용하여 S3 접근

3.1 AWS SDK v3 설치

npm install @aws-sdk/client-s3 @aws-sdk/credential-provider-cognito-identity

 

3.2 AWS 임시 자격 증명 얻기

import { fromCognitoIdentityPool } from "@aws-sdk/credential-provider-cognito-identity";
import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity";
import { S3Client, GetObjectCommand, PutObjectCommand } from "@aws-sdk/client-s3";

// Cognito 설정
const REGION = "us-east-1";
const IDENTITY_POOL_ID = "us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

// ID 토큰을 사용하여 Cognito 자격 증명 얻기
async function getCognitoCredentials(idToken) {
  return fromCognitoIdentityPool({
    client: new CognitoIdentityClient({ region: REGION }),
    identityPoolId: IDENTITY_POOL_ID,
    logins: {
      [`cognito-idp.${REGION}.amazonaws.com/YOUR_USER_POOL_ID`]: idToken,
    },
  });
}

 

3.3 S3에서 파일 업로드/다운로드

async function uploadFile(idToken, file) {
  const credentials = await getCognitoCredentials(idToken);
  const s3 = new S3Client({ region: REGION, credentials });

  const uploadParams = {
    Bucket: "your-bucket-name",
    Key: file.name,
    Body: file,
  };

  await s3.send(new PutObjectCommand(uploadParams));
  console.log("파일 업로드 성공!");
}

async function downloadFile(idToken, fileName) {
  const credentials = await getCognitoCredentials(idToken);
  const s3 = new S3Client({ region: REGION, credentials });

  const downloadParams = {
    Bucket: "your-bucket-name",
    Key: fileName,
  };

  const { Body } = await s3.send(new GetObjectCommand(downloadParams));
  const fileData = await Body.transformToByteArray();
  console.log("파일 다운로드 성공!", fileData);
}

 

4. 정리

이제 Cognito를 통해 로그인한 사용자가 ID 토큰을 사용하여 Private S3 버킷에 직접 접근할 수 있습니다. IAM 정책을 조정하여 업로드/다운로드 권한을 세부적으로 설정할 수 있으며, 필요에 따라 Lambda 등으로 추가 보안 조치를 적용할 수도 있습니다.

🔹 주요 포인트 정리

  • Cognito User Pool을 통해 ID 토큰 발급
  • Identity Pool을 사용해 AWS 임시 자격 증명 획득
  • AWS SDK v3을 활용하여 S3 접근

이제 위 코드를 활용하여 안전하게 S3를 사용할 수 있습니다! 🚀

반응형

댓글