CORS의 역할과 기본 구조
CORS는 HTTP 헤더 기반 메커니즘으로, 서버가 브라우저를 통해 어떤 원본(Origin)이 응답을 읽을 수 있는지 선언할 수 있으며, 동일 출처 정책에 제어된 예외를 제공합니다. 웹 애플리케이션이 fetch() 및 XMLHttpRequest 같은 API를 사용할 때, 다른 원본의 리소스는 응답에 올바른 CORS 헤더가 포함되어 있지 않으면 접근할 수 없습니다.
단순 요청 vs Preflight 요청
단순 요청은 GET, HEAD, POST 메서드이고 CORS 안전 목록 헤더(Accept, Accept-Language, Content-Language, Content-Type, Range)만 사용하며, Content-Type은 application/x-www-form-urlencoded, multipart/form-data 또는 text/plain이어야 합니다. GET 이외의 HTTP 메서드나 특정 MIME 타입의 POST 요청 등 서버 데이터에 부작용을 일으킬 수 있는 경우, 브라우저는 HTTP OPTIONS 메서드로 Preflight 요청을 먼저 보내 서버의 지원 메서드를 확인한 후 실제 요청을 전송합니다.
Preflight 메커니즘의 작동 원리
Preflight 요청은 OPTIONS HTTP 메서드를 사용하며, Access-Control-Request-Method, Origin, 그리고 선택적으로 Access-Control-Request-Headers 헤더를 포함합니다. Preflight OPTIONS 요청 자체는 절대로 자격증명(쿠키)을 포함하지 않으나, Preflight 응답이 Access-Control-Allow-Credentials: true를 포함해야만 실제 자격증명 요청이 진행됩니다. Preflight 응답은 200~299 범위의 상태 코드가 필요하며, 301 또는 307 같은 리다이렉트 상태는 요구사항을 만족하지 않아 전체 요청이 네트워크 오류로 실패합니다.