"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
AWS 의 S3 서비스에서 Pre Signed URL 을 HTTPS 로만 접근하게 하려면 어떻게 해야 하는지 간략히 알아보았습니다.

질문 >
AWS 의 S3 서비스에서 Pre Signed URL 을 HTTPS 로만 접근하게 하려면 어떻게 해야 하나요?
답변 >
AWS S3의 Pre-Signed URL을 HTTPS로만 접근하도록 제한하는 방법은 S3 자체 기능만으로는 어렵습니다. 하지만 몇 가지 방법을 조합하면 가능해집니다.
1️⃣ 방법 1: CloudFront + OAC(Origin Access Control) 사용 (권장)
S3에 직접 접근하는 대신 CloudFront를 사용하여 HTTPS만 허용하고, S3는 CloudFront를 통해서만 접근하도록 제한하는 방법입니다.
✅ 설정 방법
- S3 버킷 정책에서 퍼블릭 액세스 차단
- 모든 퍼블릭 액세스를 차단하고, CloudFront에서만 접근하도록 설정
- CloudFront 배포 생성
- 원본(Origin)으로 S3 버킷을 설정
- Origin Access Control (OAC) 활성화 → CloudFront만 S3에 접근 가능
- Pre-Signed URL을 CloudFront 경로로 생성
- S3 도메인이 아닌 CloudFront 도메인 (https://your-cloudfront-url/...)을 사용하여 Pre-Signed URL을 생성
- CloudFront에서는 HTTP 요청을 자동으로 HTTPS로 리디렉션 가능
- S3 버킷 정책 수정 (CloudFront만 접근 허용)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::YOUR_ACCOUNT_ID:distribution/YOUR_CLOUDFRONT_ID"
}
}
}
]
}
🚀 CloudFront Pre-Signed URL 생성 (Python, Boto3)
from botocore.signers import CloudFrontSigner
import rsa
import datetime
key_id = "your-cloudfront-key-id"
private_key_path = "your-private-key.pem"
cloudfront_url = "<https://your-cloudfront-url/path/to/file>"
def rsa_signer(message):
with open(private_key_path, "rb") as key_file:
private_key = rsa.PrivateKey.load_pkcs1(key_file.read())
return rsa.sign(message, private_key, "SHA-1")
def generate_signed_url(url, expiration=3600):
cf_signer = CloudFrontSigner(key_id, rsa_signer)
signed_url = cf_signer.generate_presigned_url(url, date_less_than=datetime.datetime.utcnow() + datetime.timedelta(seconds=expiration))
return signed_url
signed_url = generate_signed_url(cloudfront_url)
print(f"Signed URL: {signed_url}")
2️⃣ 방법 2: S3 버킷 정책에서 HTTP 차단
CloudFront를 사용하지 않고 S3 버킷 정책에서 HTTP 접근을 차단하는 방법도 있지만, Pre-Signed URL을 사용할 때 HTTPS 여부를 직접 제한하는 것은 어렵습니다.
✅ S3 버킷 정책에서 HTTP 차단
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*",
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
🚀 설명:
- aws:SecureTransport: false인 경우 접근을 차단 → HTTP 요청은 거부됨
- HTTPS 요청만 허용됨
❗️주의사항:
이 방법은 Pre-Signed URL을 생성하는 단계에서는 적용되지 않음.
즉, Pre-Signed URL을 생성할 때는 제한을 걸 수 없고, S3에서 최종적으로 HTTP 요청을 차단하는 방식입니다.
🔹 어떤 방법을 선택해야 할까요?
방법 | 보안 강도 | HTTPS 강제 적용 | 성능 |
CloudFront + OAC (방법 1) | 🔥🔥🔥 | ✅ 가능 | ✅ CDN 캐싱 |
S3 버킷 정책 HTTP 차단 (방법 2) | 🔥🔥 | 🚫 Pre-Signed URL 생성 단계에서는 불가 | ❌ CDN 캐싱 |
✅ CloudFront + OAC를 사용하면 Pre-Signed URL이 HTTPS를 강제하도록 설정할 수 있으므로 권장됩니다.
✅ S3 버킷 정책에서 HTTP 차단도 가능하지만, HTTP로 요청이 전달된 후 차단되므로 완벽한 HTTPS 강제 적용은 불가능합니다.
💡 결론: HTTPS 강제 적용을 원한다면 CloudFront + OAC 사용이 가장 안전한 방법입니다. 🚀
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com