01DEFINITION
한 줄로 말하면
링크를 눌러 외부 사이트로 나갈 때 브라우저는 방금 보던 주소를 상대 서버에 함께 알려 줍니다. 기본 동작이면 전체 경로와 물음표 뒤 값까지 넘어가서, 비밀번호 재설정 링크나 주문번호가 들어 있던 주소가 남의 접속 로그에 남습니다. 도메인까지만 전달하도록 정해 두면 유입 분석은 그대로 되면서 이 유출만 사라집니다. 위험도는 낮지만 분류상 개인정보 노출입니다.
02RISK
없으면 무슨 일이 생기나
비밀번호 재설정 메일을 떠올려 보십시오. 그 링크에는 일회용 토큰이 주소의 일부로 들어 있습니다. 사용자가 그 페이지에서 도움말 링크나 외부 서비스 링크를 한 번 누르면, 토큰이 들어 있는 전체 주소가 그 외부 서버의 접속 로그에 기록됩니다. 토큰이 아직 유효하다면 그 로그를 볼 수 있는 사람은 계정을 가져갈 수 있습니다.
토큰이 아니어도 주소에 담기는 것은 많습니다. 주문번호, 검색어, 신청서 식별자, 상담 내역 번호 같은 값이 물음표 뒤에 붙어 있고, 그 페이지에서 외부로 나가는 클릭이 한 번이라도 있으면 그대로 따라갑니다. 사이트가 광고 스크립트나 외부 폰트를 부르고 있다면 클릭 없이도 넘어갑니다.
한 가지 더 있습니다. 관리자 화면이나 내부 도구의 주소 체계가 외부 서비스 로그에 그대로 쌓입니다. 어떤 경로에 무엇이 있는지가 알려지는 것 자체가 공격의 사전 조사 비용을 줄여 줍니다.
03CHECK IT YOURSELF
직접 확인하는 방법
아래는 저희를 거치지 않고 지금 해 보실 수 있는 방법입니다. 결과를 저희에게 보내실 필요도 없습니다.
-
01
헤더가 있는지 본다
헤더가 없으면 브라우저 기본값이 적용되는데, 최신 브라우저는 대체로 안전한 기본값을 쓰지만 브라우저와 버전마다 다릅니다. 명시하는 것이 원칙입니다.
$ curl -sI https://example.com/ | grep -i referrer-policy referrer-policy: strict-origin-when-cross-origin
-
02
실제로 무엇이 나가는지 본다
개발자도구 네트워크 탭에서 외부 도메인으로 나가는 요청 하나를 골라 요청 헤더를 펼치면 Referer 값이 보입니다. 전체 경로와 물음표 뒤 값이 그대로 들어 있으면 이 항목에 걸립니다.
-
03
주소에 무엇이 실려 있는지 세어 본다
설정보다 먼저 확인할 것은 우리 주소가 무엇을 담고 있느냐입니다. 토큰이나 개인 식별값이 주소에 들어 있다면 헤더 설정은 임시방편이고, 그 값을 주소에서 빼는 것이 근본 조치입니다.
04HOW TO FIX
고치는 방법
서버 환경에 따라 적을 자리가 다릅니다. 아래는 가장 흔한 구성 기준이고, 적용 전에 현재 설정을 백업하십시오.
같은 사이트 안에서는 전체 주소를 그대로 전달하고, 외부로 나갈 때는 도메인까지만 보냅니다. 유입 분석은 도메인 단위로 이루어지므로 통계는 그대로 남습니다.
Header always set Referrer-Policy "strict-origin-when-cross-origin"
내부 이동에서도 경로를 남기지 않습니다. 사내 도구나 관리자 화면처럼 경로 구조 자체를 감추고 싶을 때 씁니다.
Header always set Referrer-Policy "strict-origin"
비밀번호 재설정이나 결제 완료 페이지처럼 주소 자체가 민감한 화면에서는 개별 링크에 속성을 붙여 아무것도 보내지 않게 할 수 있습니다.
<a href="https://external.example.com/" rel="noreferrer noopener">외부 안내</a>
헤더는 새는 통로 하나를 막는 것이고, 주소에 토큰이 있는 한 브라우저 히스토리, 서버 접속 로그, 공유된 링크를 통해 계속 노출됩니다. 일회용 토큰은 한 번 쓰면 즉시 무효화하고 유효 시간을 짧게 두십시오.
05FAQ
자주 묻는 질문
이 헤더를 켜면 유입 통계가 사라지나요
- strict-origin-when-cross-origin 을 쓰면 사라지지 않습니다. 도메인 정보는 그대로 전달되고 경로와 파라미터만 빠지기 때문에, 어느 사이트에서 왔는지는 계속 집계됩니다. 통계가 비는 것은 no-referrer 로 전부 막았을 때입니다.
심각도가 낮은데 굳이 고쳐야 하나요
- 공격으로 이어지는 경로가 길어서 낮게 잡히지만, 유출된 값이 무엇이냐에 따라 결과는 커질 수 있습니다. 무엇보다 설정이 한 줄이고 부작용이 거의 없어서, 비용 대비로 보면 미룰 이유가 별로 없는 항목입니다.
Referer 철자가 원래 저런가요
- HTTP 규격에 처음 적힐 때 철자가 틀린 채로 표준이 되어 지금까지 그대로 쓰입니다. 요청 헤더 이름은 Referer, 정책 헤더 이름은 Referrer 로 서로 다르니 설정할 때 헷갈리지 않도록 주의하십시오.
https 사이트에서 http 사이트로 갈 때는 어떻게 되나요
- strict 가 붙은 정책에서는 아무것도 보내지 않습니다. 암호화된 페이지의 주소가 암호화되지 않은 연결로 나가는 것을 막기 위해서입니다. 이것이 strict 없는 정책과의 가장 큰 차이이고, strict 쪽을 권하는 이유이기도 합니다.
GET STARTED
내 사이트는
이 항목을 통과할까요
주소만 넣으시면 이 항목을 포함해 25가지를 판정해 점수와 실패 개수를 보여 드립니다. 로그인도, 소유 확인도 필요 없습니다 — 전부 밖에서 관찰만 하는 항목이기 때문입니다.