Rails5.2で、Referrer-Policy
ヘッダがデフォルトでstrict-origin-when-cross-origin
に設定されるようになりました。
Referrer-Policy
についてよく知らなかったため、主にMDN Web Docs - Referrer-Policyを読んで理解したことをまとめていきます。
リファラポリシーとは
HTML5.2
から追加された仕様です。
遷移先にリファラを送信する際のポリシーを指定できます。
対応しているHTML要素
<a>
<area>
<img>
<iframe>
<link>
タグがリファラポリシーに対応しています。
ブラウザの対応状況
MDN Web Docs - ブラウザーの対応 を見たところ、
Edge
、Internet Explorer
、Edge Mobile
、iOSのSafari
では未対応のようです。
その他のブラウザでも、バージョンによっては対応していない場合があります。
指定できるポリシー
指定できるポリシーと、送信されるリファラの内容は下記となります。
ポリシー | 送信する内容 |
---|---|
no-referrer |
常に送信しません。 |
no-referrer-when-downgrade |
HTTPS → HTTP には送信しません。プロトコルのセキュリティレベルが同一以上であれば URL全体 を送信します。 ポリシーが指定されていない場合の既定の動作です。 |
origin |
常に オリジンのみ を送信します。 |
origin-when-cross-origin |
同一オリジン間では URL全体 を送信します。 その他の場合は オリジンのみ を送信します。 |
same-origin |
同一オリジン間では URL全体 を送信します。 その他の場合は送信しません。 |
strict-origin |
HTTPS → HTTP には送信しません。プロトコルのセキュリティレベルが同一以上であれば オリジンのみ を送信します。 |
strict-origin-when-cross-origin |
HTTPS → HTTP には送信しません。同一オリジン間では URL全体 を送信します。 プロトコルのセキュリティレベルが同一以上であれば オリジンのみ を送信します。 Rails5.2でデフォルトで設定されるようになったポリシーです。 |
unsafe-url |
常に URL全体 を送信します。 |
オリジンとは
プロトコル・ホスト名・ポート番号 の組み合わせです。
全て一致していれば同一オリジンですが、どれかが異なればクロスオリジンとなります。
詳しくはMDN Web Docs - 同一オリジンポリシーを参照すると良いでしょう。
HTTPヘッダ以外でも指定ができる
meta
要素で指定
<meta name="referrer" content="origin">
各要素ごとに指定
<a>
<area>
<img>
<iframe>
<link>
要素では、各要素ごとにreferrerpolicy
属性を指定できます。
<a href="http://example.com" referrerpolicy="origin">
また、 <a>
<area>
<link>
要素では、リレーション属性でも指定可能です。
<a href="http://example.com" rel="noreferrer">
優先順位は?
WHATWG - Referrer policy attributesによると、以下の順序でリファラポリシーが決定するようです。
-
rel
属性 -
referrerpolicy
属性 -
<meta>
要素 -
Referrer-Policy
ヘッダ
Rails5.2でデフォルトで指定されるようになったReferrer-Policy
ヘッダは、一番優先順位が低いため、<meta>
要素等で指定されていればそちらが優先されるようです。
RailsでReferrer-Policy
ヘッダのポリシーを変更する方法
Referrer-Policy
ヘッダのポリシーを変更する場合は、
config/application.rb
やconfig/environments/*.rb
で、以下を追加すれば変更できます。
Rails5.2以前のバージョンでも、必要に応じて適切なポリシーを設定すると良いですね。
ページごとに異なる場合は<meta>
タグで指定すれば良さそうです。
# リクエストヘッダに含める Referrer-Policy を no-referrer-when-downgrade に変更する
config.action_dispatch.default_headers['Referrer-Policy'] = 'no-referrer-when-downgrade'
まとめ
サイト運営者側としては、リファラを辿れば様々な情報が取得できるため便利ですが、
プライバシーの保護やセキュリティ面を考えると、リファラポリシーを制御することも大切だなぁと感じました。
よく「HTTPSからHTTPに遷移する際にはリファラが送信されない」というような記事を見て、そういうものなのだと何となく思ってしまっていましたが、リファラポリシーの挙動が分かったことにより理解が深まったので良かったです。
最後までお読みいただき、ありがとうございました。