LoginSignup
30
13

More than 5 years have passed since last update.

Rails5.2でデフォルトで追加されるようになったReferrer-Policyヘッダについて調べた

Posted at

Rails5.2で、Referrer-Policyヘッダがデフォルトでstrict-origin-when-cross-originに設定されるようになりました。

Add 'Referrer-Policy' header to default headers set

Referrer-Policyについてよく知らなかったため、主にMDN Web Docs - Referrer-Policyを読んで理解したことをまとめていきます。

リファラポリシーとは

HTML5.2から追加された仕様です。
遷移先にリファラを送信する際のポリシーを指定できます。

対応しているHTML要素

<a> <area> <img> <iframe> <link> タグがリファラポリシーに対応しています。

ブラウザの対応状況

MDN Web Docs - ブラウザーの対応 を見たところ、
EdgeInternet ExplorerEdge MobileiOSのSafariでは未対応のようです。
その他のブラウザでも、バージョンによっては対応していない場合があります。

指定できるポリシー

指定できるポリシーと、送信されるリファラの内容は下記となります。

ポリシー 送信する内容
no-referrer 常に送信しません。
no-referrer-when-downgrade HTTPSHTTP には送信しません。
プロトコルのセキュリティレベルが同一以上であれば URL全体 を送信します。
ポリシーが指定されていない場合の既定の動作です。
origin 常に オリジンのみ を送信します。
origin-when-cross-origin 同一オリジン間では URL全体 を送信します。
その他の場合は オリジンのみ を送信します。
same-origin 同一オリジン間では URL全体 を送信します。
その他の場合は送信しません。
strict-origin HTTPSHTTP には送信しません。
プロトコルのセキュリティレベルが同一以上であれば オリジンのみ を送信します。
strict-origin-when-cross-origin HTTPSHTTP には送信しません。
同一オリジン間では URL全体 を送信します。
プロトコルのセキュリティレベルが同一以上であれば オリジンのみ を送信します。
Rails5.2でデフォルトで設定されるようになったポリシーです。
unsafe-url 常に URL全体 を送信します。

オリジンとは

プロトコル・ホスト名・ポート番号 の組み合わせです。
全て一致していれば同一オリジンですが、どれかが異なればクロスオリジンとなります。

詳しくはMDN Web Docs - 同一オリジンポリシーを参照すると良いでしょう。

HTTPヘッダ以外でも指定ができる

meta要素で指定

meta要素で指定
<meta name="referrer" content="origin">

各要素ごとに指定

<a> <area> <img> <iframe> <link> 要素では、各要素ごとにreferrerpolicy属性を指定できます。

referrerpolicy属性で指定
<a href="http://example.com" referrerpolicy="origin">

また、 <a> <area> <link> 要素では、リレーション属性でも指定可能です。

rel属性で指定
<a href="http://example.com" rel="noreferrer">

優先順位は?

WHATWG - Referrer policy attributesによると、以下の順序でリファラポリシーが決定するようです。

  1. rel属性
  2. referrerpolicy 属性
  3. <meta>要素
  4. Referrer-Policyヘッダ

Rails5.2でデフォルトで指定されるようになったReferrer-Policyヘッダは、一番優先順位が低いため、<meta>要素等で指定されていればそちらが優先されるようです。

RailsでReferrer-Policyヘッダのポリシーを変更する方法

Referrer-Policyヘッダのポリシーを変更する場合は、
config/application.rbconfig/environments/*.rbで、以下を追加すれば変更できます。

Rails5.2以前のバージョンでも、必要に応じて適切なポリシーを設定すると良いですね。
ページごとに異なる場合は<meta>タグで指定すれば良さそうです。

# リクエストヘッダに含める Referrer-Policy を no-referrer-when-downgrade に変更する
config.action_dispatch.default_headers['Referrer-Policy'] = 'no-referrer-when-downgrade'

まとめ

サイト運営者側としては、リファラを辿れば様々な情報が取得できるため便利ですが、
プライバシーの保護やセキュリティ面を考えると、リファラポリシーを制御することも大切だなぁと感じました。

よく「HTTPSからHTTPに遷移する際にはリファラが送信されない」というような記事を見て、そういうものなのだと何となく思ってしまっていましたが、リファラポリシーの挙動が分かったことにより理解が深まったので良かったです。

最後までお読みいただき、ありがとうございました。

30
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
13