CORS 헤더는 브라우저 노출, 인증정보, 캐시 키를 함께 맞춰야 한다
Allow-Origin만 맞추면 끝나는 문제가 아니다. credentials 요청, 커스텀 헤더, Origin 반사, Vary 캐시 키가 같이 맞아야 운영 오류가 줄어든다.
Browser
요청은 보낼 수 있지만 JavaScript에 응답을 노출할지는 CORS 헤더로 결정한다.
요청 출처를 서버에 전달
https://app.example처럼 scheme, host, port 조합이 기준이다.
허용 목록 검증 뒤 정확한 Origin 반환
허용하지 않은 Origin은 헤더를 생략하거나 거부 응답으로 처리한다.
쿠키 포함 요청은 특정 Origin만 허용
Allow-Credentials: true와
credentials: include가 함께 필요하다.
공유 캐시가 다른 Origin 응답을 섞지 않게 한다
Origin별로 Allow-Origin이 달라지면 캐시 키에도 Origin이 들어가야 한다.
API Server / CDN
브라우저 보안 규칙을 이해하고, 서버 정책을 헤더로 명확히 표현한다.
요청 커스텀 헤더 허용
Authorization, Content-Type 같은 preflight 요청 헤더 이름을 확인한다.
JS가 읽을 응답 헤더 노출
X-Request-Id 같은 응답 헤더를 프론트에서 읽으려면 명시해야 한다.
preflight 결과 캐시
반복 OPTIONS를 줄이되 브라우저별 상한과 정책 변경 지연을 고려한다.
CORS는 CSRF 방어가 아니다
요청 자체는 전송될 수 있으므로 토큰, SameSite, Origin 검증을 따로 둔다.
개발 환경 우회와 운영 정책을 섞지 않는다
개발 중에는 dev server proxy가 편하지만, 운영에서는 서버가 허용 Origin, credentials, headers, Vary를 명확히 응답해야 한다. Origin을 무조건 반사하는 코드는 테스트에서는 편해도 공유 캐시와 쿠키 요청에서 위험하다.