Sec-Fetch-SiteSec-Fetch-Site는 브라우저가 자동으로 붙이는 Fetch Metadata 요청 헤더로, 이 요청을 개시한 문맥이 대상과 어떤 관계(같은 오리진·같은 사이트·다른 사이트·직접 탐색)인지를 알려 줍니다. 서버는 이 값으로 교차 사이트 요청을 식별해 CSRF·정보 유출을 방어할 수 있습니다.
값은 same-origin·same-site·cross-site·none 네 가지입니다. none은 사용자가 주소창에 직접 입력하거나 북마크로 여는 등 개시 문서가 없는 최상위 탐색을 뜻합니다. 이 헤더는 브라우저가 관리하는 금지된 헤더라 스크립트로 위조할 수 없어, Origin/Referer보다 신뢰할 수 있는 요청 출처 신호입니다.
이를 이용한 대표 방어가 Resource Isolation Policy(리소스 격리 정책)입니다. 예컨대 서버는 '민감한 상태 변경 엔드포인트는 Sec-Fetch-Site가 same-origin일 때만 허용'하거나, '문서(navigate) 요청이 아닌 cross-site 요청은 거부'하는 규칙으로 다수의 CSRF·XSSI·타이밍 공격을 한 번에 차단할 수 있습니다.
실무 규칙 예시: (Sec-Fetch-Site in {same-origin, none}) 또는 (탐색이면서 dest가 document)인 요청만 통과시키고, 그 외 cross-site 하위 리소스 요청은 403으로 막습니다. 단, 이 헤더를 보내지 않는 구형 브라우저·비브라우저 클라이언트를 위해 헤더 부재 시 폴백 정책(기존 CSRF 토큰 등)을 함께 유지해야 합니다.
Sec-Fetch-Site: <same-origin | same-site | cross-site | none>e.g. Sec-Fetch-Site: same-origin
same-origin | 요청 개시자와 대상이 정확히 같은 오리진. |
same-site | 같은 사이트(등록 가능 도메인, 스킴 포함)이지만 오리진은 다를 수 있음. |
cross-site | 다른 사이트에서 개시된 요청. |
none | 사용자가 직접 시작한 요청(주소창 입력·북마크 등, 개시 문서 없음). |