AWS DVA-C02AWS 허브발행일 2025. 8. 13.원본 https://blog.naver.com/jword_/223969354714 ↗

AWS DVA-C02 #3 Cognito + S3 Presigned URL

AWS DVA-C02 #3 Cognito + S3 Presigned URL — #개발자의도구들 #AWS시험 #AWSDVA-C02 #DVA-c02문제 #DVA-c02덤프 참고: ExamPotic Di...

#DVA-C02#Naver Blog

#개발자의도구들 #AWS시험 #AWSDVA-C02 #DVA-c02문제 #DVA-c02덤프

​

참고: ExamPotic Disscussion

문제 찾는법 : 여기 최하단

요구사항 분석

  • 애플리케이션이 Cognito 사용
  • user, identiy pool 사용
  • 개발자는 파일 업로드 및 다운로드 통합 기능을 원함
  • S3를 사용하여
  • 파일들은 안전한 방법으로 저장 및 회수가 가능하도록 구현 필요
  • 파일 사이즈는 3KB -> 300 MB

​

👉 가장 보안성이 우수한 솔루션을 찾기

보기 분석

A.

  • S3 이벤트 노티피케이션을 사용한다.
  • 파일 업로드 및 다운로드 요청에 대한 검증
  • UI를 업데이트(?)
text 코드 예제
                                    👉 이벤트 노티피케이션은 S3에서 동작이 끝난 뒤 발생함
-> 이미 끝났는데 검증해도 의미가 없다.

​

B.

  • Dynamo DB 테이블 사용
  • 업로드한 파일에 대한 디테일 정보를 저장
  • UI에 표시된 파일들을 필터링한다.
  • 현재 유저 ID와 테이블에 저장된 파일의 user ID 비교
text 코드 예제
                                    👉 UI에서 ownerId를 안다면 쉽게 탈취 가능

C.

  • Amazon API 게이트 웨이와 Lambda function을 사용한다.
  • 파일 업로드 및 다운로드
  • 각 요청을 실행하기 전 Lambda에서 검증한다.
text 코드 예제
                                    👉
사용자 요청 -> API Gateway -> Lambda function(검증 후)

- 안정적인 솔루션이긴 하지만 최대 300MB 업로드 시 Lambda 직접 전송은 성능/비용 부담이 크다.

​

D.

  • IAM 정챆 사용
  • Cognito Identity Prefix
  • S3내 부에 있는 개인 폴더에 대한 사용 제한
text 코드 예제
                                    📌
 Cognito Identity Pool 사용 시, 각 인증된 사용자에게 임시 IAM 자격 증명 발급

IAM 정책에서 s3:prefix 조건을 사용해 **사용자 ID별 폴더(접두사)**에만 접근 가능하게 설정
예시:
{
  "Effect": "Allow",
  "Action": ["s3:GetObject", "s3:PutObject"],
  "Resource": "arn:aws:s3:::mybucket/${cognito-identity.amazonaws.com:sub}/*"
}

👉
S3 권한 수준에서 직접 제한 -> URL을 알아도 다른 사용자의 객체에 접근 불가
cognito 인증된 사용자만 접근 가능
성능 오베허드 없음

요구 지식

  1. Amazon Cognito
  • user pool vs identity pool
  • User Pool은 사용자 인증 담당 - 로그인, 회원가입, 비밀번호 관리 등 앱 사용자 계정 관리
  • 사용자 등록/로그인, 비밀번호 정책, 다중 인증, 토큰 발급
  • Identity Pool은 AWS 리소스 접근 권한 부여
  • 인증된 사용자에게 임시 AWS 자격 증명을 발급
  • AWS 자격 증명 (Access Key, Secret Key, Session Token)
  • IAM 역할과 연결하여 S3, DynamoDB, API Gateway등 접근 제어

​

  • Cognito 자격 증명에 기반한 IAM 정책 적용 방법
  • Identity Pool이 발급한 임시 AWS 자격 증명을 이용하여 IAM 정책에 동적으로 사용자별 변수를 적용하는 법
text 코드 예제
                                    "Resource": [
        "arn:aws:s3:::mybucket/${cognito-identity.amazonaws.com:sub}/*"
      ]

​

  1. Presigned URL 개념
  • S3 객체에 대한 임시 접근 URL을 생성
  • 해당 URL 보유자는 일정 시간 동안 S3 객체를 업로드/다운로드 가능
  • 접근 권한이 없어도 URL만 있으면 가능
  • 장점
  • 서버 부하 감소 (파일이 서버를 거치지 않는다)
  • AWS IAM 자격 증명을 직접 노출할 필요가 없다.
  • 대용량 처리에 최적

​

​

📌 Cognito Identity Pool 발급 임시 자격증명 + IAM 정책으로 S3 키 prefix를 사용자별로 제한

개념 정리

문제 이해를 위한 상황 설명

text 코드 예제
                                    📌 예시
서비스: 사진 공유 앱
요구사항: 로그인한 사용자는 오직 자신의 사진만 S3에서 업로드/다운로드 가능
스토리지 구조

s3://my-photo-app/
    ├── 1111-aaaa-2222-bbbb/      ← 사용자 A의 폴더
    │       photo1.jpg
    │       vacation.png
    ├── 3333-cccc-4444-dddd/      ← 사용자 B의 폴더
            cat.png

👉 여기서 1111-aaaa-2222-bbbb와 같은 값은 Cognito Idnetity Pool에서 발급하는 사용자 고유 식별자이다.

​

흐름 정리

​

  1. 앱에서 로그인 -> Cognito User Pool
  • 성공시 idToken/accessToken 획득

​

  1. AWS 접근 권한 발급
  • 앱이 Cognito Idnetity Pool에 토큰을 전달
  • Identity Pool이 사용자에게 임시 AWS 자격 증명(Access Key, Secret Key, Session Token) 발급

​

  1. IAM 정책 자동 적용
  • Identity Pool 설정에 따라, 임시 자격 증명에는 아래와 같은 S3접근 제한 정책이 포함된다.
text 코드 예제
                                    {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-photo-app/${cognito-identity.amazonaws.com:sub}/*"
        👉 현재 로그인한 사용자의 고유 Cognito Identity ID
      ]
    }
  ]
}
  1. 사용자가 S3에 업로드 시도
  • 사용자 A가 my-photo-app/1111-aaaa-2222-bbbb/profile.jpg 업로드
  • 정책의 prefix와 일치하므로 허용

​

  1. 다른 접근자 폴더 접근 시도
  • 사용자 A가 my-photo-app/3333-cccc-4444-dddd/cat.png 다운로드 시도
  • prefix 불일치로 Access Denied

​

​

📌 장점

  • 서버 코드 없이 AWS 레벨에서 강제 접근 제어 (UI에서 숨겨도 서버 쪽 제어가 필요하지만, 이 방식은 IAM 정책으로 강제)
  • S3 URL을 직접 안다고 해도 권한 없으면 접근 불가
  • 대용량 파일도 Presigned URL 발급 없이 바로 SDK로 업/다운로드 가능(단, HTTPS 필요)