AWS S3와 CloudFront CORS 에러 완벽 해결: 헤더 포워딩 아키텍처
[Troubleshooting] AWS S3와 CloudFront CORS 에러 완벽 해결: 헤더 포워딩 아키텍처
"S3에 폰트와 이미지를 올리고 CORS 정책에 AllowedOrigins: ["*"]까지 완벽하게 세팅했습니다. 그런데 S3 앞단에 CloudFront(CDN)를 붙이자마자, 리액트 프론트엔드에서 No 'Access-Control-Allow-Origin' header is present 에러가 뜨며 리소스가 싹 다 차단됩니다."
정적 리소스를 글로벌 캐시 엣지(Edge)에 태우기 위해 CloudFront를 도입한 데브옵스 엔지니어들이 가장 깊은 절망에 빠지는 3중 네트워크 병목 현상입니다. S3 콘솔에서 아무리 정책을 열어줘도 브라우저는 매몰차게 에러를 뿜어냅니다.
이 에러의 본질은 S3가 아니라 'CloudFront가 중간에서 요청을 가로채고 헤더를 깎아먹는 메커니즘'에 있습니다. 본 가이드에서는 CDN 캐싱 계층과 오리진 스토리지 사이의 단절된 네트워크 컨텍스트를 해체하고, 보안 통행증(Origin 헤더)을 목적지까지 무사히 전달하는 헤더 포워딩(Header Forwarding) 아키텍처를 단호하게 제시합니다.
📌 이 글의 핵심 포인트
- 헤더 증발의 본질: 캐시 히트율을 높이기 위해 CloudFront가 브라우저의
Origin헤더를 S3로 넘기지 않고 삭제해 버리는 기본 동작 원리- S3의 응답 거부: Origin 헤더를 받지 못한 S3가 CORS 요청이 아니라고 판단하여 Allow-Origin 응답 헤더를 주지 않는 현상
- 완벽한 해결책: CloudFront 캐시 동작(Cache Behavior)에서
Origin,Access-Control-Request-Headers등을 허용하는 요청 정책(Origin Request Policy) 설정
1단계: 핵심 원인 분석 - 똑똑하지만 융통성 없는 CDN
웹 브라우저는 리소스를 요청할 때 "나 https://my-website.com에서 왔어"라는 Origin 헤더를 보냅니다. S3는 이 헤더를 보고 자신의 CORS 설정과 비교한 뒤, 통과시켜 줍니다.
문제는 중간에 낀 CloudFront입니다. CloudFront는 전 세계의 요청을 똑같은 캐시 파일 하나로 퉁치기 위해, 사용자의 잡다한 헤더(Origin 포함)를 싹 다 지우고 알맹이(URL)만 S3로 보냅니다. S3 입장에서는 Origin 헤더가 안 오니까 그냥 일반적인 요청인 줄 알고 CORS 관련 응답 헤더(Access-Control-Allow-Origin)를 내려주지 않습니다. 이 응답이 그대로 브라우저로 전달되니 에러가 터지는 것입니다.
2단계: 완벽한 트러블슈팅 - Origin Request Policy (헤더 포워딩)
해결책은 CloudFront에게 "Origin 헤더만큼은 지우지 말고 S3까지 배달해 줘"라고 명시적으로 지시하는 것입니다.
- AWS CloudFront 콘솔에 접속하여 해당 배포(Distribution)를 클릭합니다.
- [동작(Behaviors)] 탭을 클릭하고, 기본 캐시 동작을 선택해 [편집]을 누릅니다.
- 스크롤을 내려
캐시 키 및 원본 요청(Cache key and origin requests)섹션을 찾습니다. 원본 요청 정책(Origin request policy)드롭다운을 열고, AWS가 미리 만들어둔 CORS-S3Origin 정책을 선택합니다.- [변경 사항 저장]을 누릅니다.
이 설정을 마치면, CloudFront는 브라우저가 보낸 Origin 헤더를 S3에 고스란히 전달합니다. S3는 정상적으로 CORS 응답 헤더를 반환하며, 붉은색 차단 에러는 완벽하게 소멸됩니다.
3단계: 아키텍트의 추가 튜닝 - Invalidation (캐시 무효화)
위 설정을 완료했는데도 여전히 에러가 난다면? 그것은 헤더가 빠진 과거의 '에러 응답' 자체가 CloudFront 엣지에 캐싱되어 있기 때문입니다. 설정 변경 후에는 반드시 CloudFront의 [무효화(Invalidations)] 탭으로 가서 /* 경로로 캐시를 시원하게 날려주어야 변경된 정책이 전 세계 엣지 서버에 즉시 적용됩니다.
💡 핵심 정리 및 마무리
분산 클라우드 아키텍처에서 네트워크 계층이 늘어난다는 것은, 패킷이 목적지까지 도달하는 과정에 수많은 검문소가 추가됨을 의미합니다. S3의 권한만 열어두고 안심하는 1차원적인 시각을 버리십시오. 클라이언트부터 CDN, 그리고 오리진 서버까지 이어지는 데이터의 흐름과 헤더의 생존 여부를 완벽하게 통제하여 멈춤 없는 글로벌 미디어 인프라를 구축하시기 바랍니다.
댓글
댓글 쓰기