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를 업데이트(?)
👉 이벤트 노티피케이션은 S3에서 동작이 끝난 뒤 발생함
-> 이미 끝났는데 검증해도 의미가 없다.
B.
- Dynamo DB 테이블 사용
- 업로드한 파일에 대한 디테일 정보를 저장
- UI에 표시된 파일들을 필터링한다.
- 현재 유저 ID와 테이블에 저장된 파일의 user ID 비교
👉 UI에서 ownerId를 안다면 쉽게 탈취 가능
C.
- Amazon API 게이트 웨이와 Lambda function을 사용한다.
- 파일 업로드 및 다운로드
- 각 요청을 실행하기 전 Lambda에서 검증한다.
👉
사용자 요청 -> API Gateway -> Lambda function(검증 후)
- 안정적인 솔루션이긴 하지만 최대 300MB 업로드 시 Lambda 직접 전송은 성능/비용 부담이 크다.
D.
- IAM 정챆 사용
- Cognito Identity Prefix
- S3내 부에 있는 개인 폴더에 대한 사용 제한
📌
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 인증된 사용자만 접근 가능
성능 오베허드 없음
요구 지식
- 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 정책에 동적으로 사용자별 변수를 적용하는 법
"Resource": [
"arn:aws:s3:::mybucket/${cognito-identity.amazonaws.com:sub}/*"
]
- Presigned URL 개념
- S3 객체에 대한 임시 접근 URL을 생성
- 해당 URL 보유자는 일정 시간 동안 S3 객체를 업로드/다운로드 가능
- 접근 권한이 없어도 URL만 있으면 가능
- 장점
- 서버 부하 감소 (파일이 서버를 거치지 않는다)
- AWS IAM 자격 증명을 직접 노출할 필요가 없다.
- 대용량 처리에 최적
📌 Cognito Identity Pool 발급 임시 자격증명 + IAM 정책으로 S3 키 prefix를 사용자별로 제한
개념 정리
문제 이해를 위한 상황 설명
📌 예시
서비스: 사진 공유 앱
요구사항: 로그인한 사용자는 오직 자신의 사진만 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에서 발급하는 사용자 고유 식별자이다.
흐름 정리
- 앱에서 로그인 -> Cognito User Pool
- 성공시 idToken/accessToken 획득
- AWS 접근 권한 발급
- 앱이 Cognito Idnetity Pool에 토큰을 전달
- Identity Pool이 사용자에게 임시 AWS 자격 증명(Access Key, Secret Key, Session Token) 발급
- IAM 정책 자동 적용
- Identity Pool 설정에 따라, 임시 자격 증명에는 아래와 같은 S3접근 제한 정책이 포함된다.
{
"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
]
}
]
}
- 사용자가 S3에 업로드 시도
- 사용자 A가 my-photo-app/1111-aaaa-2222-bbbb/profile.jpg 업로드
- 정책의 prefix와 일치하므로 허용
- 다른 접근자 폴더 접근 시도
- 사용자 A가 my-photo-app/3333-cccc-4444-dddd/cat.png 다운로드 시도
- prefix 불일치로 Access Denied
📌 장점
- 서버 코드 없이 AWS 레벨에서 강제 접근 제어 (UI에서 숨겨도 서버 쪽 제어가 필요하지만, 이 방식은 IAM 정책으로 강제)
- S3 URL을 직접 안다고 해도 권한 없으면 접근 불가
- 대용량 파일도 Presigned URL 발급 없이 바로 SDK로 업/다운로드 가능(단, HTTPS 필요)