노트

Origin·Referer 헤더와 Referrer-Policy

Origin and Referer Headers

프런트엔드#http#security · 연결된 개념 6개

쉽게 말하면

Origin과 Referer는 요청에 붙는 보낸 곳 정보예요. 편지 봉투에 Origin은 '어느 동네에서'까지만, Referer는 '어느 집 몇 호에서'까지 적는 셈이라, 서버가 어디서 온 요청인지 확인할 수 있어요.

비유가 깨지는 곳 자세한 주소는 흘리면 곤란할 수 있어요. URL엔 토큰이나 검색어가 들어갈 수 있어서 Referrer-Policy로 얼마나 보낼지 정해요. 지금 기본값은 다른 출처엔 출처만 보내는 strict-origin-when-cross-origin이에요.

브라우저가 요청에 붙이는 두 헤더. Origin은 요청이 시작된 출처(프로토콜·호스트·포트)만, Referer는 요청을 일으킨 페이지의 URL(경로·쿼리까지)을 담는다. Referrer-Policy는 Referer에 얼마나 담을지 정한다.

항목OriginReferer
프로토콜·호스트·포트OO
경로·쿼리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 속성으로 바꾼다.

출처: MDN — Referrer-Policy · MDN — Origin · MDN — Referer

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • XSS

    XSS(Cross-Site Scripting)는 공격자가 넣은 스크립트가 내 사이트의 출처(origin) 권한으로 사용자 브라우저에서 실행되는 공격이다. 같은 출처의 코드로 돌기 때문에 same-origin-policy가 막아 주지 못한다. 그 스크립트는 페이지를 바꾸고, 로그인한 사용자 행세를 하며 요청을 보내고, JS가 읽을 수 있는 데이터(localStorage의 토큰 등)를 빼 갈 수 있다.

  • 브라우저 요청과 서버 간 요청

    같은 HTTP 요청이라도 브라우저에서 보내면 여러 보안 규칙이 강제되고, 서버에서 보내면 아무 제한이 없다. 브라우저 보안 정책은 신뢰할 수 없는 코드로부터 사용자를 지키려고 있기 때문이다.

  • 인증과 인가

    인증(authentication)은 "너는 누구냐"를 확인하는 것이고, 인가(authorization)는 "너는 이걸 해도 되냐"를 판단하는 것이다. 인증이 먼저고 인가가 그다음이다.

  • DRF 파서·렌더러와 콘텐츠 협상

    DRF에서 파서(Parser)는 요청 본문을 파이썬 자료형으로 바꾸고, 렌더러(Renderer)는 응답 데이터를 클라이언트가 받을 형식으로 바꾼다. 어떤 렌더러를 쓸지는 요청의 Accept 헤더를 보고 고르는데, 이를 콘텐츠 협상(content negotiation)이라 한다.

  • SEO

    SEO(Search Engine Optimization)는 검색 엔진이 페이지를 잘 찾고(크롤링, crawling), 이해해서 저장하고(색인, indexing), 알맞은 검색어로 노출하도록(순위, ranking) 사이트를 다듬는 일이다. 개발자가 맡는 부분은 대부분 앞의 두 단계, 즉 "검색 엔진이 읽을 수 있게 만드는 것"이다.

보기 옵션