본문 바로가기
컴퓨터

👨‍💻 [AWS] AWS 의 S3 서비스에서 Pre Signed URL 을 HTTPS 로만 접근하게 하려면 어떻게 해야 하나요?

by 밝음의기둥 2025. 4. 1.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

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를 통해서만 접근하도록 제한하는 방법입니다.

✅ 설정 방법

  1. S3 버킷 정책에서 퍼블릭 액세스 차단
    • 모든 퍼블릭 액세스를 차단하고, CloudFront에서만 접근하도록 설정
  2. CloudFront 배포 생성
    • 원본(Origin)으로 S3 버킷을 설정
    • Origin Access Control (OAC) 활성화 → CloudFront만 S3에 접근 가능
  3. Pre-Signed URL을 CloudFront 경로로 생성
    • S3 도메인이 아닌 CloudFront 도메인 (https://your-cloudfront-url/...)을 사용하여 Pre-Signed URL을 생성
    • CloudFront에서는 HTTP 요청을 자동으로 HTTPS로 리디렉션 가능
  4. 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


반응형