본문 바로가기
클라우드

CloudFront + S3, 그 경고 메시지 무시해도 될까? 🤔 — 엔드포인트 선택이 서비스 품질을 결정한다

by gasbugs 2026. 4. 14.

"이 S3 버킷은 웹사이트로 구성됩니다. 버킷 엔드포인트 대신 웹사이트 엔드포인트를 사용하는 것이 좋습니다."
이 한 줄 경고, 그냥 넘기면 나중에 꼭 후회한다.

 


🎯 이 글에서 다루는 것

  • CloudFront 오리진 설정 시 나타나는 경고 메시지의 정확한 의미
  • S3 버킷 엔드포인트 vs 웹사이트 엔드포인트의 핵심 차이
  • 각 엔드포인트를 선택해야 하는 상황별 기준
  • OAC(Origin Access Control) 사용 시 반드시 알아야 할 제약
  • 실무에서 바로 쓸 수 있는 CloudFront + S3 구성 패턴

📌 도입 / 배경

AWS 콘솔에서 CloudFront 배포를 생성하고 S3 버킷을 오리진으로 지정하면, 다음과 같은 노란색 경고가 뜰 때가 있다.

이 S3 버킷은 S3 웹 사이트로 구성됩니다.
이 배포를 웹 사이트로 사용하려는 경우 버킷 엔드포인트 대신 S3 웹 사이트 엔드포인트를 사용하는 것이 좋습니다.

 

처음 보는 사람은 "뭔가 문제가 있나?" 싶어 당황하고, 익숙해진 사람은 습관적으로 그냥 넘긴다. 그런데 이 경고를 무시해도 되는지 여부는 상황에 따라 완전히 달라진다.

 

이 글에서는 경고의 의미부터, 각 엔드포인트의 차이, 그리고 어떤 상황에서 무엇을 선택해야 하는지를 명확하게 정리한다.


🔍 S3 오리진 엔드포인트, 두 가지가 있다

S3 버킷을 CloudFront 오리진으로 설정할 때 선택할 수 있는 엔드포인트는 두 종류다.

1️⃣ S3 버킷 엔드포인트 (REST API 엔드포인트)

bucket-name.s3.ap-northeast-2.amazonaws.com
  • S3의 기본 API 엔드포인트
  • CloudFront 콘솔에서 버킷 이름으로 자동 완성되는 바로 그 주소
  • OAC(Origin Access Control) 또는 OAI(Origin Access Identity) 적용 가능 → 버킷을 완전히 비공개로 유지 가능
  • 서브디렉터리 인덱스 문서 미지원 → /blog/ 요청 시 blog/index.html을 자동으로 반환하지 않음

2️⃣ S3 웹사이트 엔드포인트

bucket-name.s3-website.ap-northeast-2.amazonaws.com
  • S3의 정적 웹사이트 호스팅 기능 활성화 시 사용하는 엔드포인트
  • 인덱스 문서(index.html), 에러 문서(404.html) 자동 처리
  • 서브디렉터리 인덱스 지원 → /about/ 요청 시 about/index.html 자동 응답
  • OAC/OAI 미지원 → 버킷 퍼블릭 액세스 차단을 해제해야만 동작
  • HTTPS 미지원 (엔드포인트 자체는 HTTP만 지원, CloudFront에서 HTTPS 처리)

🤔 경고 메시지, 무시해도 될까?

결론부터 말하면: "상황에 따라 다르다"

상황 권장 선택 경고 무시 여부
정적 웹사이트 (React, Vue, Next.js 정적 빌드 등) 웹사이트 엔드포인트 ❌ 무시 금지
버킷 비공개 유지 + OAC 보안 구성 버킷 엔드포인트 ✅ 무시 가능
단순 파일 배포 (이미지, CSS, JS CDN 용도) 버킷 엔드포인트 ✅ 무시 가능
SPA (Single Page Application) + 서브경로 라우팅 버킷 엔드포인트 + CF Functions ✅ 무시 가능 (단, 추가 작업 필요)

💡 핵심 차이: 서브디렉터리 인덱스 처리

경고를 무시했을 때 가장 흔하게 발생하는 문제가 바로 이것이다.

예를 들어 S3에 다음 구조로 파일이 있다고 가정한다.

/index.html
/about/index.html
/blog/index.html

 

버킷 엔드포인트를 사용했을 때:

웹사이트 엔드포인트를 사용했을 때:

이 차이 때문에 Next.js, Gatsby, Hugo 같은 정적 사이트 생성기로 만든 사이트를 배포할 때 버킷 엔드포인트를 그냥 사용하면 서브 페이지 접근 시 오류가 발생한다.


🔐 보안 우선이라면: OAC + 버킷 엔드포인트

보안을 중요시하는 환경(대부분의 프로덕션)에서는 버킷을 퍼블릭으로 열어두는 것이 부담스럽다. 이럴 때는 OAC를 사용해 버킷을 완전히 비공개로 유지하면서 CloudFront만 접근 허용할 수 있다.

 

OAC 설정 흐름:

사용자 → CloudFront → (OAC 서명 요청) → S3 버킷 (비공개)

 

이 경우 반드시 버킷 엔드포인트를 사용해야 하며, 웹사이트 엔드포인트로는 OAC가 동작하지 않는다.

 

S3 버킷 정책 예시 (OAC 허용):

{
  "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::123456789012:distribution/DISTRIBUTION_ID"
        }
      }
    }
  ]
}

💻 서브디렉터리 문제 해결: CloudFront Functions 활용

OAC를 쓰면서도 서브디렉터리 인덱스를 처리하고 싶다면? CloudFront Functions로 해결할 수 있다.

// CloudFront Functions — Viewer Request 트리거에 연결
function handler(event) {
  var request = event.request;
  var uri = request.uri;

  // 경로가 /로 끝나면 index.html 추가
  if (uri.endsWith('/')) {
    request.uri += 'index.html';
  }
  // 확장자가 없는 경로면 /index.html 추가
  else if (!uri.includes('.')) {
    request.uri += '/index.html';
  }

  return request;
}

 

이 함수를 CloudFront 배포의 Viewer Request 이벤트에 연결하면, 버킷 엔드포인트를 사용하면서도 /about/ → about/index.html 처리가 가능해진다.


⚠️ 주의사항 / 흔한 실수

1. 웹사이트 엔드포인트 = 버킷 퍼블릭 공개 필수 웹사이트 엔드포인트로 CloudFront를 구성하면 버킷의 퍼블릭 액세스 차단을 해제해야 한다. OAC가 동작하지 않기 때문에 버킷이 외부에 직접 노출될 수 있다. CloudFront를 통해서만 접근하게 강제하려면 Referer 헤더 기반 버킷 정책을 별도로 구성해야 하는데, 이는 완전한 보안이 아니다.

 

2. SPA 라우팅 오류 React Router, Vue Router 등 클라이언트 사이드 라우팅을 사용하는 SPA는 새로고침 시 서버에 직접 경로를 요청하게 된다. 이때 S3에 해당 경로의 파일이 없으면 403/404가 발생한다. CloudFront의 오류 페이지 설정에서 403/404를 index.html로 리다이렉트하도록 구성해야 한다.

 

3. HTTPS 설정 혼동 웹사이트 엔드포인트 자체는 HTTPS를 지원하지 않는다. 하지만 CloudFront ↔ 오리진 간 통신에서 HTTP로 설정해두고, 사용자 ↔ CloudFront 구간만 HTTPS로 처리하면 된다. Origin Protocol Policy를 HTTP Only로 지정하면 정상 동작한다.


✅ 정리 / 마무리

경고 메시지를 무시해도 되는지 여부는 단순히 "예/아니오"가 아니라 사용 목적과 보안 요구사항에 따라 결정해야 한다.

목적 선택
정적 사이트 (서브디렉터리 라우팅 필요) 웹사이트 엔드포인트
보안 강화 (OAC 적용, 버킷 비공개 유지) 버킷 엔드포인트 + CF Functions
단순 파일 CDN 배포 버킷 엔드포인트 (경고 무시 가능)

 

실무에서는 OAC + 버킷 엔드포인트 + CloudFront Functions 조합이 보안과 기능성을 모두 챙길 수 있는 가장 권장되는 패턴이다. 경고 메시지는 "무시하지 말고 이해하라"는 신호로 받아들이는 것이 좋다.