コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

aタグでリファラーを制御するreferrerpolicyという属性があるのざっくりまとめる

IEが非対応だったが、IEがなくなった今大体のブラウザは対応しているのでざっとまとめる

出典

Referrer-Policy - HTTP | MDN

書き方

<a href="http://example.com" referrerpolicy="設定したい値">

前提にいれておくべき知識

URLの内容を「originが同じかどうか」というような内容をベースに構成されるためoriginの概念を抑えておく必要がある

origin

URLにおけるoriginとは3つの要素で構成される

  • httphttpsなどのコロンの前の文字列にあたるスキーム(利用プロトコル
  • example.comなどのホスト名
  • ポート番号

そのため http://super.example.com:80/user/20?user=false というURLの場合のoriginは http://super.example.com:80 となる

また http://tekisou.example.com/?check_id=20 では http://tekisou.example.com/ となる

設定できる値と意味

意味
no-referrer Refererヘッダーが省略される。
origin originの部分のみが送信される
no-referrer-when-downgrade パターンが2つに分かれる。「プロトコルのセキュリティ水準が同一である、または向上する場合 (HTTP→HTTP, HTTP→HTTPS, HTTPSHTTPS、等) のとき」のみ「origin+パス+クエリーストリング」を送信。そうではない(セキュリティ水準が低下する)場合はRefererヘッダーが省略される。
origin-when-cross-origin パターンが2つに分かれる。「プロトコルのセキュリティ水準が同じ」かつ「同一originのリクエスト」の場合は「origin+パス+クエリーストリング」、そうでない場合はoriginのみを送る
same-origin パターンが2つに分かれる。「同一originのリクエスト」の場合は「origin+パス+クエリーストリング」を、そうでない場合はRefererヘッダーが省略される。
strict-origin パターンが2つに分かれる。「プロトコルのセキュリティ水準が同じ」場合にoriginを送信し、そうでない場合はRefererヘッダーが省略される。
strict-origin-when-cross-origin パターンが3つに分かれる。「同一originのリクエスト」の場合は「origin+パス+クエリーストリング」を、「異なるoriginの場合かつプロトコルのセキュリティ基準が同じ」の場合は「origin」を、そうでない場合はRefererヘッダーが省略される。
unsafe-url セキュリティなどにも関係なく「origin+パス+クエリーストリング」を送信する。

上記の通り基準としては以下

  • 2つURL間でセキュリティ基準に変化があるかどうか。
  • originが同一(same-origin)か異なる(cross-origin)かどうか

セキュリティ基準の変化に関しては厳密な定義がかなり読み解きにくい。そのため厳密な定義の言及は今回は割愛するが、詳しくはW3Cの例と文中に登場する potentially trustworthy URL の解説記事参照のこと

主要ブラウザのデフォルトはどれなのか

2023年春ごろ時点では strict-origin-when-cross-origin がデフォルトとされている。が、明言されていない部分もあるので雑にまとめると状態は以下。

ブラウザ 公式のデフォルト値 参照元など参考情報
chrome strict-origin-when-cross-origin A new default Referrer-Policy for Chrome - strict-origin-when-cross-origin - Chrome Developers
firefox strict-origin-when-cross-origin Firefox 87 trims HTTP Referrers by default to protect user privacy - Mozilla Security Blog
safari 不明(明確に明言されていない) W3CのPRで共通でstrict-origin-when-cross-origi になった記載はあるが、公式アナウンスはない。またITPの影響で3rdPartyの場合は一律originのみになることが公式 で出ている

どのHTML要素で使えるのか

aタグ以外にも img , iframe , script , link . area にも使える。

関連リンク