브라우저가 요청에 붙이는 두 헤더. Origin은 요청이 시작된 출처(프로토콜·호스트·포트)만, Referer는 요청을 일으킨 페이지의 URL(경로·쿼리까지)을 담는다. Referrer-Policy는 Referer에 얼마나 담을지 정한다.
| 항목 | Origin | Referer |
|---|---|---|
| 프로토콜·호스트·포트 | O | O |
| 경로·쿼리 | X | 정책에 따라 O |
| 언제 붙나 | 교차 출처 요청, POST 같은 상태 변경 요청 | 링크 이동·리소스 요청 등 대부분 |
POST /api/user
Origin: https://shop.example.com
Referer: https://shop.example.com/products/123?sort=desc- 철자가
Referrer가 아니라Referer인 것은 초기 HTTP 명세의 오타가 표준으로 굳은 것이다. 정책 이름(Referrer-Policy)은 바른 철자를 쓴다 Origin은 CORS(Cross-Origin Resource Sharing) 판단의 기준이다. 서버는 이 값을 허용 목록과 비교해Access-Control-Allow-Origin을 돌려준다 → 동일 출처 정책- CSRF(Cross-Site Request Forgery) 방어에서 서버가
Origin(없으면Referer)이 자기 사이트인지 확인하는 방식이 흔하다. Django의 CSRF 미들웨어도 토큰 검사와 함께 이 검사를 한다 → Django의 CSRF 방어.Referer는 개인정보 설정으로 빠질 수 있어 보조 수단이다
Referrer-Policy
URL에는 토큰·검색어 같은 민감한 정보가 들어갈 수 있어, 다른 사이트로 넘어갈 때 얼마나 흘릴지 정한다.
| 정책 | 동작 |
|---|---|
no-referrer | 보내지 않음 |
origin | 출처만 |
same-origin | 같은 출처일 때만 전체 URL, 다른 출처에는 안 보냄 |
strict-origin | 출처만, HTTPS→HTTP로 내려갈 때는 안 보냄 |
strict-origin-when-cross-origin | 같은 출처는 전체 URL, 다른 출처는 출처만, 다운그레이드 시 안 보냄 |
unsafe-url | 항상 전체 URL(비권장) |
지금 브라우저의 기본값은 strict-origin-when-cross-origin이다(예전 기본값은 no-referrer-when-downgrade였다). Referrer-Policy 응답 헤더나 meta name="referrer", 링크별 referrerpolicy 속성으로 바꾼다.