logo
GeekFormat

CORS 검사기

CORS 진단 패널

서버 측에서 프리플라이트 및 실제 요청을 시뮬레이션하여 Access-Control-Allow-Origin, Access-Control-Allow-Headers, credentials 문제를 빠르게 진단합니다.

서버에서 실제 CORS preflight와 실제 요청을 시뮬레이션하고, 6가지 응답 헤더를 항목별로 검사하여 교차 출처 구성 오류를 정밀하게 찾아내고 Nginx/Node.js/Spring 등 다중 프레임워크 수정 코드를 제공합니다.

관련 추천

사용 사례

  • 브라우저 콘솔에 No 'Access-Control-Allow-Origin' header 오류가 표시될 때 즉시 이 도구로 대상 API가 실제로 반환하는 CORS 헤더를 검사합니다
  • 프론트엔드-백엔드 분리 프로젝트 연동 단계에서 백엔드 CORS 구성이 올바르게 적용되었는지 검증하여 맹목적인 구성 수정으로 시간을 낭비하지 않습니다
  • Nginx, Apache 리버스 프록시 또는 API 게이트웨이(Kong/APISIX/Spring Cloud Gateway) 구성 후 CORS 규칙이 올바르게 전달되는지 확인합니다
  • Cookie를 포함한 교차 출처 요청이 실패할 때 credentials 모드로 전환하여 Allow-Credentials와 Allow-Origin의 구성 충돌을 감지합니다
  • 사용자 정의 요청 헤더(예: X-Token, X-Requested-With) 추가 후 요청이 차단되면 Allow-Headers에 올바르게 선언되었는지 감지합니다
  • PUT/DELETE/PATCH 등 비단순 메서드 요청이 교차 출처로 실패하면 Allow-Methods에 해당 메서드가 포함되어 있는지 확인합니다
  • 프론트엔드에서 사용자 정의 응답 헤더(예: X-Request-Id, X-Total-Count)를 읽을 수 없을 때 Access-Control-Expose-Headers 구성을 감지합니다
  • CDN 가속 후 교차 출처가 간헐적으로 작동할 때 Vary: Origin이 올바르게 설정되어 CDN이 잘못된 응답을 캐싱하지 않는지 확인합니다
  • 프로덕션 환경에서 간헐적으로 발생하는 교차 출처 오류에 대해 문제 시나리오를 재현하고 완전한 응답 패킷을 보존하여 백엔드 문제 해결에 활용합니다
  • CORS 원리를 학습할 때 실제 요청을 통해 각 응답 헤더의 역할을 관찰하여 교차 출처 메커니즘에 대한 이해를 높입니다

주요 기능

  • 서버에서 실제로 preflight 요청과 실제 요청을 시뮬레이션하여 브라우저 캐시와 플러그인 간섭 없이 더 정확한 결과를 제공합니다
  • OPTIONS preflight 응답과 실제 GET/POST 응답을 분리하여 표시하므로 어느 단계에서 문제가 발생했는지 명확하게 구분할 수 있습니다
  • 6가지 핵심 CORS 응답 헤더(Access-Control-Allow-Origin, Allow-Methods, Allow-Headers, Allow-Credentials, Expose-Headers, Max-Age)를 항목별로 검사하고 각 헤더마다 통과/경고/실패 상태를 개별 표시합니다
  • 와일드카드 *와 credentials 자격 증명 모드의 고전적인 충돌을 지능적으로 감지하여 가장 흔한 구성 함정을 즉시 알려줍니다
  • 사용자 정의 요청 Origin, HTTP 메서드(GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS), 임의의 사용자 정의 요청 헤더를 지원합니다
  • 자격 증명(Cookie/Authorization 헤더/TLS 클라이언트 인증서) 포함 여부를 전환할 수 있어 withCredentials=true 시나리오를 시뮬레이션합니다
  • Vary: Origin 응답 헤더가 올바르게 설정되었는지 자동 감지하여 CDN/리버스 프록시가 잘못된 CORS 응답을 캐싱하는 것을 방지합니다
  • preflight 캐시 Max-Age 구성을 구조화하여 표시하고 preflight 요청 빈도가 성능에 미치는 영향을 평가합니다
  • Access-Control-Expose-Headers 구성을 확인하여 프론트엔드 JavaScript가 읽을 수 있는 응답 헤더를 식별합니다
  • Nginx, Apache, Node.js/Express, Spring Boot, Python/Django/Flask 등 주요 서버 프레임워크 구성 예제를 포함한 단계별 수정 제안을 제공합니다
  • 상태 코드, 모든 응답 헤더, 응답 본문 미리보기를 포함한 요청-응답 원시 패킷을 완전히 기록하여 심층 문제 해결에 용이합니다
  • 단순 요청과 preflight 필요 요청의 차이를 자동 식별하고 왜 요청이 OPTIONS preflight를 트리거했는지 설명합니다
  • 리디렉션 시나리오에서 CORS 문제(301/302/307/308 점프 후 Origin 변경 여부)를 감지합니다
  • HTTPS/HTTP 혼합 콘텐츠 시나리오 감지를 지원하여 혼합 콘텐츠로 인한 교차 출처 관련 문제를 알려줍니다

이용 방법

  1. 대상 URL 입력란에 검사할 API의 전체 주소를 입력합니다(http/https 지원, 경로 포함 필수)
  2. 요청 Origin에 프론트엔드 페이지의 실제 출처를 입력합니다(예: https://example.com, 프로토콜과 포트 포함 필수, 경로 제외)
  3. HTTP 요청 메서드를 선택합니다(GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS), 기본값 GET
  4. 사용자 정의 요청 헤더 영역에 전송할 헤더를 추가합니다.每行 X-Token: abc123 형식으로 입력하며, Content-Type이 application/json 등 비단순 유형이면 자동으로 preflight가 트리거됩니다
  5. 시나리오에 따라 '자격 증명(credentials) 포함' 옵션을 체크합니다. 프론트엔드 코드에서 withCredentials=true 또는 fetch의 credentials: 'include'를 사용했다면 반드시 체크해야 합니다
  6. '검사 시작' 버튼을 클릭하면 도구가 서버에서 OPTIONS preflight 요청과 (preflight 통과 또는 preflight 불필요 시) 실제 요청을 순차적으로 전송합니다
  7. 분석 보고서를 확인합니다: 전체 평가 결과를 먼저 보고 각 CORS 헤더 상태를 항목별로 검사한 후, 빨간색 오류 항목의 수정 제안에 따라 서버 구성을 조정하고 수정 후 다시 검사하여 검증합니다

자주 묻는 질문

Postman/curl로 API 요청하면 문제없는데 브라우저에서 접근하면 왜 교차 출처 오류가 나나요?

이것이 가장 고전적인 CORS 문제입니다! Postman과 curl은 브라우저 동일 출처 정책의 제한을 받지 않기 때문입니다——이들은 HTTP 클라이언트이지 브라우저가 아니므로 응답을 차단하지 않으며 자동으로 OPTIONS preflight 요청을 보내지도 않습니다. 교차 출처 오류는 브라우저 고유의 보안 메커니즘으로, 브라우저의 JavaScript 런타임 환경에서만 CORS 검사를 실행합니다. Postman에서 호출이 된다는 것은 API 자체가 데이터를 반환할 수 있다는 것만 증명할 뿐 CORS 구성이 올바르다는 것을 증명하지는 않습니다. 브라우저를 사용하거나 이 도구(서버에서 브라우저 CORS 프로세스를 시뮬레이션)로 검사해야 문제를 발견할 수 있습니다.

CORS 오류는 프론트엔드 문제인가요 백엔드 문제인가요? 누가 수정해야 하나요?

99%의 CORS 오류는 백엔드 구성 문제(Nginx/게이트웨이 계층 구성 문제 포함)이며 프론트엔드가 할 수 있는 것은 매우 제한적입니다. CORS의 핵심은 서버가 응답 헤더를 통해 브라우저에 '권한을 부여'하여 교차 출처 접근을 허용하는 것이며, 프론트엔드는 withCredentials 설정, 요청 헤더 설정 정도만 할 수 있을 뿐 브라우저의 보안 제한을 우회할 수 없습니다. 인터넷에서 말하는 프론트엔드 프록시 사용(devServer proxy, Nginx 리버스 프록시로 프론트엔드와 API를 동일 출처로 프록시)은 본질적으로 브라우저를 '속여' 동일 출처 요청으로 인식하게 하는 것일 뿐 진정으로 CORS 문제를 해결한 것이 아닙니다. 프로덕션 환경에서 프론트엔드와 백엔드가 다른 출처라면 여전히 백엔드가 올바르게 CORS를 구성해야 합니다.

왜 제 GET 요청은 교차 출처가 안 되는데 POST/PUT으로 바꾸면 교차 출처가 되나요?

GET은 보통 단순 요청 조건을 충족하므로 브라우저가 직접 요청을 보내기 때문입니다; 하지만 POST에서 Content-Type: application/json을 보내면(90%의 POST API가 이것임), 단순 요청이 아니게 되어 OPTIONS preflight가 트리거됩니다. preflight 요청은 서버가 올바른 CORS 헤더를 반환해야 하는데 많은 사람이 GET/POST에만 CORS 헤더를 구성하고 OPTIONS 메서드를 처리하지 않았거나 OPTIONS 응답에 헤더가 없어 오류가 납니다. PUT/DELETE/PATCH 등의 메서드는 그 자체가 비단순 메서드이므로 반드시 preflight를 트리거합니다.

개발 환경에서 교차 출처를 어떻게 해결하나요? 프로덕션 환경은요?

개발 환경에는 몇 가지方案이 있습니다: ①프레임워크 내장 프록시(Vue CLI의 devServer.proxy, Vite의 server.proxy, Create React App의 proxy): API 요청을 프론트엔드 개발 서버와 동일 출처로 프록시하여 브라우저가 동일 출처 요청으로 인식하게 하여 교차 출처가 되지 않게 함; ②브라우저 보안 매개변수 비활성화(예: Chrome에 --disable-web-security 시작 매개변수 추가), 로컬 임시 테스트에만 사용하며 정상 브라우징에는 절대 사용 금지; ③백엔드가 CORS를 구성하여 localhost 출처를 허용(권장, 프로덕션 환경과 동작이 일치함). 프로덕션 환경은 반드시 백엔드가 올바르게 CORS를 구성해야 합니다: 허용된 출처 화이트리스트 구성, Allow-Methods/Allow-Headers/Allow-Credentials 올바르게 설정, Vary: Origin 추가, 또는 게이트웨이/Nginx에서 CORS를 일관 처리합니다.

Access-Control-Allow-Origin에 여러 출처를 구성할 수 있나요? 여러 도메인의 교차 출처를 허용하려면 어떻게 해야 하나요?

아니요, Access-Control-Allow-Origin 응답 헤더는 하나의 값만 가질 수 있으며 구체적인 한 출처(예: https://a.com)이거나 *입니다. 브라우저는 여러 출처를 허용하지 않습니다(예를 들어 https://a.com,https://b.com으로 작성하면 무효이며 브라우저는 불일치로 간주합니다). 올바른 다중 출처 구성 방법은: 서버가 허용된 출처 화이트리스트 목록을 유지 관리하고, 요청을 받을 때마다 요청 헤더의 Origin 값을 읽어 이 Origin이 화이트리스트에 있는지 확인한 후, 있다면 Access-Control-Allow-Origin을 이 구체적인 Origin 값으로 설정하고 Vary: Origin 헤더를 반환하는 것입니다; 없다면 CORS 헤더를 반환하지 않거나 오류를 반환합니다. 여러 Allow-Origin 헤더를 반환하거나 쉼표로 여러 값을 구분하려고 하지 마세요. 브라우저가 인식하지 않습니다.

preflight OPTIONS 요청에 비즈니스 로직을 반환해야 하나요? 바로 204를 반환해도 되나요?

OPTIONS preflight 요청은 어떤 비즈니스 로직이나 응답 본문도 반환할 필요가 없으며 올바른 CORS 응답 헤더와 200/204 상태 코드만 반환하면 됩니다. 브라우저는 올바른 CORS 헤더를 받으면 preflight가 통과되었다고 간주하며 OPTIONS 응답의 body 내용을 읽지 않습니다. 따라서 모범 사례는: Nginx/게이트웨이 계층에서 OPTIONS 요청을 직접 가로채어 204 No Content와 올바른 CORS 헤더를 반환하고 백엔드 애플리케이션 서버로 전달하지 않는 것입니다. 이렇게 하면 백엔드 부하를 줄일 뿐만 아니라 백엔드 라우트가 OPTIONS를 지원하지 않아 발생하는 405 오류도 피할 수 있습니다. 단, OPTIONS 응답의 CORS 헤더가 실제 요청의 CORS 헤더와 일관되게 유지되도록 주의해야 합니다.

withCredentials: true를 설정했는데 왜 Cookie가 포함되지 않나요?

Cookie가 포함된 교차 출처 요청은 세 가지 조건을 동시에 충족해야 합니다: ①프론트엔드 XMLHttpRequest.withCredentials = true 또는 fetch의 credentials: 'include'; ②백엔드 응답 헤더 Access-Control-Allow-Credentials: true; ③Access-Control-Allow-Origin은 *가 될 수 없으며 구체적인 출처여야 함. 세 가지 조건이 하나라도 빠지면 안 됩니다. 또한 Cookie 속성에도 주의해야 합니다: Cookie에 SameSite=None; Secure(HTTPS 환경)가 설정되어야 교차 출처 요청에 포함될 수 있습니다; Cookie가 SameSite=Lax나 Strict이면 교차 출처 요청에 포함되지 않습니다; Cookie의 Domain 속성이 올바르게 설정되어야 합니다; 제3자 Cookie 정책의 영향도 주의해야 합니다(Chrome 등 브라우저는 제3자 Cookie에 제한이 있음).

CORS와 CSRF는 어떤 관계인가요? CORS를 구성하면 CSRF 취약점이 생기나요?

CORS는 교차 출처 접근 제한을 완화하는 것이고 CSRF는 교차 사이트 요청 위조 공격으로 둘은 다른 개념입니다. 올바르게 구성된 CORS가 직접 CSRF 취약점을 유발하지는 않습니다——CORS는 JS가 응답을 읽는 것을 허용할 뿐이지, CSRF는 공격자가 사용자가 모르게 요청을 보내도록 유도하는 것이기 때문입니다(예: img 태그, 자동 제출 양식). 이러한 요청은 CORS가 없어도 전송되고 Cookie가 포함됩니다. CSRF 방어에는 CSRF Token, SameSite Cookie, Origin/Referer 검증 등의方案을 사용해야 하며 CORS 비활성화로 CSRF를 막을 수 없습니다. 하지만 CORS 구성 시 Allow-Origin을 *로 설정하고 자격 증명을 허용하면 CSRF 위험이 확대될 수 있으므로, 자격 증명 시나리오에서는 절대 *를 사용하지 말고 화이트리스트 출처를 엄격히 제한해야 합니다.

파일 다운로드, 리디렉션, 이미지/script 태그 로드에도 CORS 문제가 있나요?

일반적인 <img>, <script>, <link> 태그로 교차 출처 리소스(CDN 이미지, JS 스크립트, CSS)를 로드하는 것은 기본적으로 CORS 문제가 없습니다. 이들은 '포함 리소스'이지 'AJAX 요청'이 아니며 브라우저가 로드를 허용하지만 JS가 내용을 읽을 수는 없습니다. 하지만 Canvas에서 교차 출처 이미지를 조작하거나 fetch/XHR로 이러한 리소스를 로드하여 내용을 읽으려면 CORS가 필요하며 태그에 crossorigin 속성을 추가해야 합니다. 교차 출처 파일 다운로드(a 태그 클릭 다운로드)도 기본적으로 CORS가 필요하지 않습니다. 리디렉션은 CORS에 영향을 줍니다: preflight OPTIONS 요청이 3xx 리디렉션을 반환하면 브라우저가 직접 거부합니다(Preflight redirect is not allowed); 실제 요청의 리디렉션이 교차 출처인 경우 각 홉마다 올바르게 CORS 헤더를 반환해야 합니다.

Nginx에서 CORS를 올바르게 구성하려면 어떻게 해야 하나요? 사용 가능한 구성 예시를 주세요

Nginx 권장 구성 요점: ①map 지시문으로 Origin 화이트리스트를 매칭하여 $cors_origin 변수를 동적으로 설정; ②OPTIONS 요청은 직접 204를 반환하고 백엔드로 전달하지 않음; ③add_header에 always 매개변수를 추가하여 오류 응답에도 헤더가 포함되도록 함; ④Vary: Origin 추가; ⑤Allow-Methods/Allow-Headers/Credentials 올바르게 구성. 예시 구성은 이 도구 검사 결과의 수정 제안에서 찾을 수 있으며, Nginx, Apache, Node.js Express, Spring Boot, Python Flask/Django, Koa, Go Gin 등 주요 프레임워크에 대해 검증된 구성 스니펫을 제공합니다.

CORS 구성 후 어떻게 적용되었는지 검증하나요?

CORS 검증 단계: ①먼저 이 도구로 온라인 검사를 하여 URL, Origin, 메서드, 헤더, 자격 증명 옵션을 입력하고 preflight와 실제 요청의 각 항목 검사가 통과하는지 확인; ②브라우저 DevTools의 Network 패널을 열고 Disable cache를 체크하여 캐시를 비활성화하고(오래된 캐시 간섭 방지), 교차 출처 요청을 트리거하여 OPTIONS preflight와 실제 요청의 응답 헤더가 올바른지 확인; ③Console에 CORS 관련 오류가 있는지 확인; ④다양한 시나리오 테스트: 사용자 정의 헤더 없는 GET 요청, application/json이 포함된 POST 요청, PUT/DELETE 메서드, Cookie 포함/미포함, 사용자 정의 헤더 포함; ⑤curl로 OPTIONS 요청 시뮬레이션: curl -i -X OPTIONS -H "Origin: https://yoursource.com" https://api.example.com/endpoint로 응답 헤더가 올바른지 확인.

왜 교차 출처 요청이 Chrome에서는 오류가 나고 Safari/Firefox에서는 정상인가요? 아니면 그 반대인가요?

브라우저마다 CORS 사양 구현 세부 사항에 차이가 있습니다: ①Safari는 preflight 캐시 Max-Age 제한이 더 엄격하고(예전 버전은 600초였음) Cookie 정책(ITP 지능형 추적 방지)도 더 엄격하여 교차 출처 Cookie 문제가 발생할 수 있음; ②Chrome은 자격 증명 시 와일드카드 검사가 더 엄격하여 Allow-Headers/Allow-Methods에도 *를 허용하지 않으며, Firefox 일부 버전은 더 관대할 수 있음; ③구형 IE(IE11)는 표준 XMLHttpRequest가 아닌 XDomainRequest를 사용하여 CORS 구현에 많은 함정이 있음(예: 사용자 정의 헤더 미지원, GET/POST만 지원); ④브라우저마다 Vary 헤더 처리, 리디렉션 처리, 보안 헤더 처리에 미묘한 차이가 있습니다. 해결 방법은 특정 브라우저의 호환 동작에 의존하지 말고 CORS 사양에 따라 엄격하게 구성하는 것입니다.

Access-Control-Max-Age는 얼마로 설정하는 것이 적절한가요? 너무 길거나 짧게 설정하면 어떤 문제가 있나요?

3600(1시간)에서 86400(24시간) 사이로 설정하는 것을 권장합니다. 너무 짧게 설정하면(예: 60초) preflight 캐시가 빨리 만료되어 OPTIONS 요청을 빈번하게 보내 요청 지연 시간과 서버 부하가 증가하며 모바일 약한 네트워크 환경에서 영향이 두드러집니다. 너무 길게 설정하면(예: 31536000 즉 1년) CORS 구성을 업데이트한 경우(예: 허용 메서드/헤더 추가) 사용자 브라우저에 캐시된 오래된 preflight 결과가 오랫동안 만료되지 않아 구성이 적용되지 않는 문제가 발생할 수 있습니다. 또한 Chrome과 Firefox는 86400초를 초과하는 값을 자동으로 86400초로 자르므로 더 길게 설정해도 소용이 없습니다. 개발 환경에서는 -1로 설정하여 preflight 캐시를 비활성화하면 디버깅에 편리합니다.

WebSocket 연결에도 교차 출처 문제가 있나요? CORS는 WebSocket에 적용되나요?

WebSocket(ws://와 wss://)은 HTTP CORS 메커니즘의 제한을 받지 않습니다. WebSocket은 독립적인 프로토콜이며 HTTP AJAX 요청이 아니기 때문입니다. 하지만 WebSocket 핸드셰이크 단계는 HTTP 요청이므로 서버가 Origin 헤더를 검사하여 연결 허용 여부를 결정할 수 있습니다——이것은 WebSocket 수준의 권한 제어이지 표준 CORS는 아니지만 원리는 비슷합니다. WebSocket 연결이 거부되면 HTTP CORS 헤더가 아니라 WebSocket 서버의 Origin 검증 구성을 확인해야 합니다. Socket.IO 등 라이브러리는 자체적인 교차 출처 구성 방식이 있을 수 있으며 표준 CORS 구성과 유사하지만 완전히 같지는 않습니다. 또한 HTTP/2 Server Push, WebRTC 등 다른 브라우저 API도 자체적인 권한 제어가 있으며 HTTP CORS를 완전히 따르지는 않습니다.

이 도구의 검사 결과는 브라우저 동작과 일치하나요? 도구 검사는 통과했는데 브라우저에서 여전히 오류가 나는 이유는 무엇인가요?

이 도구는 서버에서 W3C CORS 사양에 따라 브라우저의 preflight와 실제 요청 프로세스를 엄격하게 시뮬레이션하며, CORS 헤더 검사 로직은 현대 브라우저와 기본적으로 일치합니다. 도구 검사는 통과했는데 브라우저에서 여전히 오류가 난다면 가능한 원인: ①브라우저가 오래된 preflight 결과나 응답을 캐시했습니다. Ctrl+F5로 강제 새로고침하거나 캐시를 지우고 다시 시도; ②브라우저 확장 프로그램(광고 차단, 개인 정보 보호, 보안 플러그인)이 요청을 수정하거나 차단함; ③도구에 입력한 Origin, 요청 헤더, 메서드, 자격 증명 옵션이 실제 프론트엔드가 보내는 것과 불일치(예: 프론트엔드가 실제로 어떤 사용자 정의 헤더를 더 보내는데 도구에 추가하지 않음); ④CDN/프록시 노드 캐시가 일관되지 않아 도구가 요청한 노드와 브라우저가 요청한 노드가 다른 결과를 반환함; ⑤브라우저에 특수 보안 정책이 있음(예: HTTPS 페이지가 HTTP 혼합 콘텐츠를 요청하여 차단됨, 로컬 파일 file:// 프로토콜의 특수 제한).

术语表

CORS (Cross-Origin Resource Sharing)
교차 출처 리소스 공유. W3C 표준으로, 새로운 HTTP 헤더 필드를 추가하여 서버가 어떤 출처의 리소스 접근을 허용하는지 선언하게 합니다. 현대 브라우저에서 교차 출처 문제를 해결하는 공식 솔루션입니다.
동일 출처 정책 (Same-Origin Policy)
브라우저 핵심 보안 메커니즘. 프로토콜, 도메인, 포트가 모두 완전히 동일해야 동일 출처로 간주하며, 다른 출처의 JavaScript는 기본적으로 상대방 리소스를 읽을 수 없습니다.
preflight 요청 (Preflight Request)
브라우저가 비단순 교차 출처 요청에 대해 자동으로 먼저 보내는 OPTIONS 메서드 요청. 서버에 후속 실제 요청을 허용하는지 물어보며, preflight 통과 후에만 실제 요청을 보냅니다.
단순 요청 (Simple Request)
특정 조건(GET/HEAD/POST 메서드, 안전 헤더만 포함, 특정 Content-Type)을 충족하는 교차 출처 요청. preflight를 보내지 않고 직접 실제 요청을 보냅니다.
Access-Control-Allow-Origin (ACAO)
CORS 핵심 응답 헤더. 리소스 접근을 허용하는 출처를 지정하며 구체적인 출처 URI 또는 와일드카드 *를 사용할 수 있습니다. 자격 증명 포함 시 *를 사용할 수 없습니다.
Access-Control-Allow-Methods (ACAM)
preflight 응답 헤더. 서버가 지원하는 모든 HTTP 메서드를 나열하며 여러 메서드는 쉼표로 구분합니다.
Access-Control-Allow-Headers (ACAH)
preflight 응답 헤더. 서버가 허용하는 모든 요청 헤더 필드를 나열합니다. 프론트엔드가 사용자 정의 헤더를 전송한다면 여기에 반드시 선언해야 합니다.
Access-Control-Allow-Credentials (ACAC)
응답 헤더. 부울 값 true는 교차 출처 요청에 Cookie, Authorization 등 자격 증명을 포함하도록 허용함을 의미합니다. 이 경우 Allow-Origin은 *가 될 수 없습니다.
Access-Control-Max-Age (ACMA)
preflight 응답 헤더. preflight 결과 캐시 시간(초)을 지정합니다. 합리적으로 설정하면 OPTIONS 요청을 줄여 성능을 향상시킬 수 있습니다.
Vary: Origin
응답 헤더. CDN/프록시에 이 응답 내용이 Origin에 따라 달라짐을 알려주며, 캐시 시 Origin을 캐시 키의 일부로 사용하게 하여 교차 출처 응답 캐시 오염을 방지합니다.
CORS 안전 목록 요청 헤더 (CORS-safelisted request headers)
Allow-Headers에 선언하지 않아도 전송할 수 있는 요청 헤더로 Accept, Accept-Language, Content-Language, Content-Type(특정 값) 등이 포함됩니다.
금지된 요청 헤더 이름 (Forbidden header name)
브라우저가 JavaScript가 프로그래밍 방식으로 설정하는 것을 금지하는 요청 헤더로 Host, Connection, Cookie, Origin 등이 있습니다. 이러한 헤더는 브라우저가 자동으로 제어합니다.
자격 증명 요청 (Credentialed Request)
Cookie, HTTP 인증 정보, TLS 클라이언트 인증서 등 신원 자격 증명을 포함하는 교차 출처 요청. 프론트엔드와 백엔드가 withCredentials와 Allow-Credentials를 함께 설정해야 합니다.
Access-Control-Expose-Headers
응답 헤더. 프론트엔드 JavaScript가 접근할 수 있는 응답 헤더를 나열합니다. 기본적으로 소수의 기본 헤더만 접근할 수 있으며 사용자 정의 응답 헤더는 여기에 반드시 선언해야 합니다.
OPTIONS 메서드
HTTP 메서드 중 하나로 서버가 지원하는 통신 옵션을 가져오는 데 사용됩니다. CORS는 이를 사용하여 preflight 요청을 보내 서버가 허용하는 메서드, 헤더, 자격 증명 등을 물어봅니다.
Origin 요청 헤더
브라우저가 자동으로 추가하는 요청 헤더로 현재 요청이 어떤 출처(프로토콜+도메인+포트)에서 오는지 나타냅니다. 서버는 이 헤더를 기반으로 교차 출처 허용 여부를 판단합니다.
crossorigin 속성
HTML 요소(script, img, link 등)의 속성으로 CORS를 사용하여 리소스를 로드할지 여부를 지정합니다. 값은 anonymous(자격 증명 미포함)와 use-credentials(자격 증명 포함)가 있습니다.
no-cors 요청 모드
fetch API의 한 mode로 교차 출처 요청을 보낼 수 있지만 단순 요청만 보낼 수 있고 JavaScript가 응답 내용을 읽을 수 없습니다. 불투명 요청(Opaque Response)을 보내는 것과 같습니다.

CORS 응답 헤더 완전 대조표

어떤 요청이 preflight를 트리거하는지 판단표

흔한 CORS 오류와 해결方案速查表

Troubleshooting