Access-Control-Expose-HeadersAccess-Control-Expose-Headers는 교차 출처(cross-origin) 응답에서 브라우저가 클라이언트 스크립트에게 읽도록 허용할 응답 헤더 목록을 지정하는 CORS 헤더입니다. 이 헤더에 나열되지 않으면 JavaScript는 안전 목록(safelist) 밖의 헤더 값을 볼 수 없습니다.
기본적으로 교차 출처 응답에서 fetch/XHR 스크립트가 읽을 수 있는 헤더는 이른바 CORS-safelisted 응답 헤더 7종뿐입니다: Cache-Control·Content-Language·Content-Length·Content-Type·Expires·Last-Modified·Pragma. ETag·X-Request-Id·Location 같은 커스텀·기타 헤더는 응답에 실려 와도 브라우저가 스크립트에게 숨깁니다.
서버가 이런 헤더를 클라이언트 코드에서 사용하게 하려면(예: 페이지네이션 총개수 X-Total-Count, 요청 추적 X-Request-Id, 조건부 요청용 ETag) 그 이름을 Access-Control-Expose-Headers에 명시해야 합니다. 이 헤더는 실제 응답에만 의미가 있으며, 프리플라이트(OPTIONS) 응답이 아니라 본 요청의 응답에 붙습니다.
와일드카드 *는 자격 증명이 없는(non-credentialed) 요청에서만 safelist 밖 모든 헤더를 노출하는 편의값입니다. 쿠키·인증 정보를 포함한 자격 증명 요청에서는 *가 특수 의미를 잃고 리터럴 이름 `*`인 헤더를 가리키게 되어 사실상 아무것도 노출하지 못하므로, 자격 증명 시나리오에서는 헤더 이름을 하나하나 열거해야 합니다.
Access-Control-Expose-Headers: <header-name>[, <header-name>]* | *e.g. Access-Control-Expose-Headers: Content-Length, X-Request-Id, ETag
<header-name> | 교차 출처 스크립트가 읽도록 노출할 응답 헤더 이름(대소문자 무시). 쉼표로 여러 개 나열. |
* | CORS-safelisted 외의 모든 응답 헤더를 노출. 자격 증명 요청에서는 리터럴 헤더 이름 `*`로 취급되어 동작하지 않음. |