사용자가 파일을 다운로드할 수 있는 URL이 다음과 같이 생성되고, 그대로 사용자에게 노출됨
https://test-bucket.s3.ap-northeast-2.amazonaws.com/2025-03-27/uuid-파일명.pdf
이 URL에는 S3 버킷명, 리전 정보, 파일 경로가 그대로 노출됨
s3.amazonaws.com
이라는 AWS 내부 주소가 박혀 있으면, 사용자나 클라이언트가 "외부 클라우드에 던져진 파일인가?" 하는 불안감을 가짐 → 회사 브랜드의 신뢰도에도 악영향기존 버킷 정책은 다음과 같음
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::test-bucket/*"
}
]
}
방식 | 설명 | 장점 | 단점 |
---|---|---|---|
① S3 Pre-signed URL | 서버에서 임시 URL 발급 (10분~1시간 등) | 보안 우수/ 만료 가능/ 사용자 제어 용이 | 속도 느림/ CDN 없음/ 복잡한 구현 |
② CloudFront Signed URL | CloudFront에서 서명 기반 접근 제어 | 고속 + 보안/ 만료 + 경로 제어 가능 | 구현 복잡/ 키 관리 필요 |
③ CloudFront 정적 URL (공개 접근) | CloudFront + OAC + 커스텀 도메인 | 빠름/ CDN 활용/ URL 고정/ 퍼블릭 URL | 접근 제어는 별도로 없음 (공개 URL로 사용 시) |
요구사항:
문제점 :
https://media.test.com/abc.jpg
요청/static
이라고 적으면:https://media.test.com/images/logo.png
https://test-bucket.s3.ap-northeast-2.amazonaws.com/static/images/logo.png
/cdn-files/
, /prod-assets/
등)만 CloudFront로 연결하고 싶을 때 사용Principal: Service cloudfront.amazonaws.com
+ Condition: SourceArn
을 통해 오직 해당 배포만 허용 가능[Edge - 서울] ────→ S3
[Edge - 도쿄] ────→ S3
[Edge - 프랑크푸르트] ──→ S3
요청이 각 Edge → S3로 분산됨. 동일 파일에 대한 중복 요청이 S3에 몰릴 수 있음
[Edge - 도쿄] ────→ Origin Shield (서울) ─→ S3
[Edge - 부산] ────→ Origin Shield (서울) ─→ S3
[Edge - 미국] ────→ Origin Shield (서울) ─→ S3
모든 요청이 Origin Shield(서울)로 집중 → 오리진(S3) 요청 수 최소화
https://d1234abcd.cloudfront.net/my-image.png
us-east-1
리전에서 해당 도메인용 SSL 발급해야함CloudFront에서 사용자 도메인(대체 도메인, CNAME)을 쓰려면, 해당 도메인에 대한 SSL 인증서를 반드시
us-east-1
에서 발급받아야 한다.CloudFront의 글로벌 특성과 ACM 리전 제약 때문
- CloudFront는 "글로벌 서비스"
- CloudFront는 AWS 리전에 종속되지 않음 (예: 서울 리전 없음)
- 전 세계 엣지 로케이션에서 작동함
ACM은 "리전 기반 서비스"
- AWS Certificate Manager(ACM)는 리전별 리소스
즉,ap-northeast-2
(서울)에서 발급한 인증서는 서울에서만 사용됨- CloudFront는 자체적으로 인증서를 복제/전파하지 않음. 오직
us-east-1
리전에 있는 인증서만 CloudFront와 연결 가능
이건 CloudFront의 글로벌 배포 구조와ACM이 리전마다 독립적으로 동작하는 구조가 서로 충돌하지 않게 하기 위한 아키텍처적 제한.
test.com
도메인 클릭test.cloudfront.net
)"Principal": "*"
넣어도 외부에서는 접근 불가{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test-bucket/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/TESTDISTRIBUTIONID"
}
}
}
]
}
https://media.test.com/{object-key}
변경 항목
Client
↓
CloudFront (media.test.com)
↓
S3 (비공개, CloudFront만 접근 가능)
항목 | 개선 전 | 개선 후 |
---|---|---|
S3 퍼블릭 접근 | 열려 있었음 (완전 공개) | 완전 차단 (Block all public access ) |
URL | s3.amazonaws.com/버킷명/파일 | 대체도메인/파일 |
버킷 정책 | 누구나 접근 | CloudFront만 접근 가능 |
보호 계층 | 없음 | CloudFront 경유 (OAC + 도메인 + HTTPS) |
로그 추적 | 어려움 | CloudFront 로그 추적 가능 |
확장성 | 제한적 | 캐시, 압축, 보안, 확장 구조 사용 가능 |
이 문제를 해결함으로써 얻은 효과
효과 | 설명 |
---|---|
보안 향상 | S3 버킷명, 리전 정보 완전 비공개. 구조 노출 없음 |
브랜딩 강화 | media.test.com 도메인 사용 → 신뢰감 증가 |
성능 향상 | 전 세계 CloudFront 엣지에서 캐싱 → 빠른 다운로드 |
유지보수 용이 | S3 오리진 변경해도 URL은 그대로 → 서비스 URL 안정성 확보 |
파일 URL이 S3 버킷 주소로 노출되어 보안과 유지보수에 문제가 있었지만,
CloudFront + 커스텀 도메인을 사용함으로써 안정적이고 확장성 높은 파일 전달 구조를 확보.