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 조합이 보안과 기능성을 모두 챙길 수 있는 가장 권장되는 패턴이다. 경고 메시지는 "무시하지 말고 이해하라"는 신호로 받아들이는 것이 좋다.