본문 바로가기
MAKESITE
무료 스캔 문의하기 로그인

점검 항목 · 보안

Referrer-Policy 미설정

공격당하는 항목이 아니라 새는 항목입니다. 심각도는 낮지만 분류상 개인정보 노출이고, 유입 분석을 그대로 두면서 고칠 수 있습니다.

심각도 낮음 보안 무료 스캔 판정 항목 /check/referrer-policy

01DEFINITION

한 줄로 말하면

링크를 눌러 외부 사이트로 나갈 때 브라우저는 방금 보던 주소를 상대 서버에 함께 알려 줍니다. 기본 동작이면 전체 경로와 물음표 뒤 값까지 넘어가서, 비밀번호 재설정 링크나 주문번호가 들어 있던 주소가 남의 접속 로그에 남습니다. 도메인까지만 전달하도록 정해 두면 유입 분석은 그대로 되면서 이 유출만 사라집니다. 위험도는 낮지만 분류상 개인정보 노출입니다.

02RISK

없으면 무슨 일이 생기나

비밀번호 재설정 메일을 떠올려 보십시오. 그 링크에는 일회용 토큰이 주소의 일부로 들어 있습니다. 사용자가 그 페이지에서 도움말 링크나 외부 서비스 링크를 한 번 누르면, 토큰이 들어 있는 전체 주소가 그 외부 서버의 접속 로그에 기록됩니다. 토큰이 아직 유효하다면 그 로그를 볼 수 있는 사람은 계정을 가져갈 수 있습니다.

토큰이 아니어도 주소에 담기는 것은 많습니다. 주문번호, 검색어, 신청서 식별자, 상담 내역 번호 같은 값이 물음표 뒤에 붙어 있고, 그 페이지에서 외부로 나가는 클릭이 한 번이라도 있으면 그대로 따라갑니다. 사이트가 광고 스크립트나 외부 폰트를 부르고 있다면 클릭 없이도 넘어갑니다.

한 가지 더 있습니다. 관리자 화면이나 내부 도구의 주소 체계가 외부 서비스 로그에 그대로 쌓입니다. 어떤 경로에 무엇이 있는지가 알려지는 것 자체가 공격의 사전 조사 비용을 줄여 줍니다.

03CHECK IT YOURSELF

직접 확인하는 방법

아래는 저희를 거치지 않고 지금 해 보실 수 있는 방법입니다. 결과를 저희에게 보내실 필요도 없습니다.

  1. 01
    헤더가 있는지 본다

    헤더가 없으면 브라우저 기본값이 적용되는데, 최신 브라우저는 대체로 안전한 기본값을 쓰지만 브라우저와 버전마다 다릅니다. 명시하는 것이 원칙입니다.

    $ curl -sI https://example.com/ | grep -i referrer-policy
    referrer-policy: strict-origin-when-cross-origin
  2. 02
    실제로 무엇이 나가는지 본다

    개발자도구 네트워크 탭에서 외부 도메인으로 나가는 요청 하나를 골라 요청 헤더를 펼치면 Referer 값이 보입니다. 전체 경로와 물음표 뒤 값이 그대로 들어 있으면 이 항목에 걸립니다.

  3. 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>
토큰을 주소에서 빼는 것이 진짜 해결이다

헤더는 새는 통로 하나를 막는 것이고, 주소에 토큰이 있는 한 브라우저 히스토리, 서버 접속 로그, 공유된 링크를 통해 계속 노출됩니다. 일회용 토큰은 한 번 쓰면 즉시 무효화하고 유효 시간을 짧게 두십시오.

주의. no-referrer 로 전부 막으면 유입 분석에서 어디서 들어왔는지가 사라집니다. 마케팅 담당자가 보는 지표가 그날부터 통째로 비기 때문에, 값을 정하기 전에 분석을 쓰는 사람과 한 번 이야기하시는 편이 좋습니다.

05FAQ

자주 묻는 질문

이 헤더를 켜면 유입 통계가 사라지나요

strict-origin-when-cross-origin 을 쓰면 사라지지 않습니다. 도메인 정보는 그대로 전달되고 경로와 파라미터만 빠지기 때문에, 어느 사이트에서 왔는지는 계속 집계됩니다. 통계가 비는 것은 no-referrer 로 전부 막았을 때입니다.

심각도가 낮은데 굳이 고쳐야 하나요

공격으로 이어지는 경로가 길어서 낮게 잡히지만, 유출된 값이 무엇이냐에 따라 결과는 커질 수 있습니다. 무엇보다 설정이 한 줄이고 부작용이 거의 없어서, 비용 대비로 보면 미룰 이유가 별로 없는 항목입니다.

Referer 철자가 원래 저런가요

HTTP 규격에 처음 적힐 때 철자가 틀린 채로 표준이 되어 지금까지 그대로 쓰입니다. 요청 헤더 이름은 Referer, 정책 헤더 이름은 Referrer 로 서로 다르니 설정할 때 헷갈리지 않도록 주의하십시오.

https 사이트에서 http 사이트로 갈 때는 어떻게 되나요

strict 가 붙은 정책에서는 아무것도 보내지 않습니다. 암호화된 페이지의 주소가 암호화되지 않은 연결로 나가는 것을 막기 위해서입니다. 이것이 strict 없는 정책과의 가장 큰 차이이고, strict 쪽을 권하는 이유이기도 합니다.
여기까지는 항목 일반론입니다. 무엇이고 왜 문제이며 어떻게 고치는지는 감출 이유가 없어 그대로 적었습니다. 리포트에 들어가는 것은 귀사 사이트에서 실제로 어떤 값이 나왔는지 — 어느 주소의 어느 응답인지, 그 환경에서 어떤 순서로 적용해야 하는지, 예상 공수가 얼마인지입니다. 이 페이지만 보고 직접 고치셔도 되고, 실제로 그러시라고 적어 두었습니다.

GET STARTED

내 사이트는
이 항목을 통과할까요

주소만 넣으시면 이 항목을 포함해 25가지를 판정해 점수와 실패 개수를 보여 드립니다. 로그인도, 소유 확인도 필요 없습니다 — 전부 밖에서 관찰만 하는 항목이기 때문입니다.