リファラとは(ざっくり)
リンク先がどこから飛んできたか(リンク元)を知れる。
例えば、http://example.com
(リンク元)に貼られたリンクからhttp://hogehoge.com
(リンク先)に遷移する場合
リファラヘッダーに
Referer: https://example.com
のような情報が含まれる。
リンク先の管理者はこのリファラを見ることで、ユーザーがhttp://example.com
から自分のサイトに訪問したのだとわかる。
なぜリファラの設定が必要か
極端な例ですが、リンク元のサイトがhttp://sample.com?user_id=999&pass=1234
かつリファラを参照できる状態のサイトの場合を考えてみます。
リンク元サイトから他ページのリンクに飛んだ時、リンク先はhttp://sample.com?user_id=999&pass=1234
この情報をゲットできるので、ログインに必要な情報が分かり簡単にログインできて、ログインページで操作が可能になります。
セキュリティ的にリンク先に情報を渡したくない(社外非公開のページ等)場合には、リファラの設定が必要そうです。
ただSEOの観点からは、流入元(どこから飛んできたか)がわかった方がいい場合もあるので使い分けが必要かなと思います。
リファラポリシーの値と扱い
no-referrer
送る条件:一切送らない
refererヘッダがそのものが除かれるため一番情報が漏れない。
ただ、内部でリファラ情報をもとに検証を行っていると問題になりそう。
unsafe-url
送る条件:必ず送る
送る値:URL全体
http->httpやhttps->httpでも送られる。
https://example.com/q=http+referer+policy
のようにクエリ情報も送られる。
origin
送る条件:必ず送る
送る値:originのみ
unsafe-urlと似ているが、unsafe-urlはURL全体を送るがoriginはoriginのみ送る。
https://example.com/
のようなオリジン情報のみ
same-origin
送る条件:same-origin
送る値:URL全体
リンク元とリンク先のオリジンが一致する場合に、完全なURLのリファラを送る。
Downgradeでもupgradeでも送られない。
http->http OK
http->https NG
strict-origin
送る条件:Downgrade以外
送る値:originのみ
リンク先の信頼性が低い場合は送らない、それ以外はリンク元のoriginのみを送る。
no-referrer-when-downgrade
送る条件:Downgrade以外
送る値:URL全体
リンク元に比べてリンク先の信頼性が下がる場合はリファラ送らない。
リンク元がHTTPSで、リンク先が信頼できるサイトでないときにリファラは送らない。
リンク元が非HTTPSの場合は制限なくリファラを送る。
origin-when-cross-origin
送る条件①:cross-origin
送る値①:originのみ
送る条件②:same-origin
送る値②:URL全体
内部遷移はURL全体を送り、外部リンクにはoriginのみを送る。
Down/Upgrade も Cross Origin 扱いになるため、 Origin のみ送られる
strict-origin-when-cross-origin
送る条件①:cross-origin
送る値①:originのみ
送る条件②:same-origin
送る値②:URL全体
送る条件③:Downgrade
送る値③:送らない
origin-when-cross-originにdowngradeの場合を追加したもの。
多くの場合多くの場合、これが使われる。
検証はどうする?
診断くんのようなサイトを使って検証する。
リファラが送られていないことを確認する。
参照
https://www.marguerite.jp/Nihongo/WWW/RefHTML/HTML5/Referrer_policy.html#INDEX
https://blog.jxck.io/entries/2018-10-08/referrer-policy.html
https://web.dev/i18n/ja/referrer-best-practices/