클라우드 SPA 환경에서 CloudFront 403 오류 해결 - 100-hours-a-week/16-Hot6-wiki GitHub Wiki

05/10 SPA 환경에서 CloudFront 403 오류 해결 가이드

alt text

SPA 환경에서 CloudFront 403 오류 해결 가이드

1. SPA란?

SPA (Single Page Application) 는 말 그대로 "하나의 HTML 파일로 구성된 웹앱"입니다.

  • 프론트엔드는 index.html 하나만 있고
  • 나머지 라우팅(/login, /mypage, /oauth-success)은 자바스크립트가 브라우저 안에서 처리합니다.
  • 대표적으로 React, Vue, Angular, Vite 기반 프로젝트들이 다 SPA입니다.

⠀🔁 즉, 실제로는 모든 경로가 index.html 하나를 기준으로 동작합니다.

2. 문제의 원인

CloudFront/S3는 "정적 파일 서버"입니다.

  • 브라우저가 /oauth-success에 직접 접근하면→ CloudFront는 S3에 oauth-success라는 정적 파일을 찾으려고 합니다.
  • 근데 S3에는 그런 파일이 없죠 → 403 또는 404 오류

3. EC2 환경에서는 왜 문제가 없었을까?

EC2 + Nginx에서는 아래 설정이 있었기 때문입니다:

location / {

try_files $uri /index.html;

}

  • 즉, 실제 파일이 없으면 → index.html을 대신 리턴
  • React 앱이 그걸 받아서 클라이언트에서 페이지 전환 처리

이것이 바로 SPA가 정상 작동하는 핵심 트릭입니다.

4. CloudFront에서 해결하는 방법

👉 CloudFront에서도 동일한 로직을 설정해주면 문제 해결!

🔧 방법: Custom Error Response 설정

1 AWS 콘솔 → CloudFront → 해당 배포 선택 2 상단 탭 [Error pages] 클릭 3 [Create custom error response] 클릭 4 아래처럼 설정

항목 | |:-:|---| | HTTP Error Code | 403 | | Customize Response | Yes | | Response Page Path | /index.html | | HTTP Response Code | 200 |

alt text

필요시 404도 같은 방식으로 추가

결과

alt text

5. 요청 흐름 비교

경로 원래 동작 (403) 변경 후 동작 (200 + index.html)
/oauth-success S3에 없음 → 403 index.html 리턴 → React가 라우팅
/login 404 → 에러 index.html 리턴 → React가 처리

6. 적용 후 캐시 삭제 (중요!)

CloudFront는 이전 오류 응답을 캐시할 수 있으므로, Invalidation 해주세요:

aws cloudfront create-invalidation \

--distribution-id YOUR_DIST_ID \

--paths "/*"

요약

항목 설명
왜 에러가 났나? SPA는 경로를 프론트에서 처리하는데, CloudFront는 파일을 찾으려 해서 403
EC2에서는 왜 괜찮았나? try_files 설정으로 index.html을 항상 리턴했기 때문
해결법은? CloudFront에서 403(또는 404)일 때 index.html을 대신 리턴하도록 설정
언제 적용되나? 설정 후 수 분 내 반영되며, Invalidation으로 즉시 확인 가능

필요하시면 해당 설정을 Terraform, AWS CLI, 콘솔 순서대로 정리해서 드릴 수 있어요.적용 도와드릴까요?