結論(Referrer-Policy)
Referrer-Policyとは、ブラウザがリンク遷移やリソース読み込みのときに送る Referer ヘッダーに、遷移元URLをどこまで含めるか(完全URL・オリジンのみ・送らない)をサイト側から指定するレスポンスヘッダーです。一般的な公開サイトでは strict-origin-when-cross-origin が推奨で、同一オリジンには完全URL、外部にはオリジンだけを送り、HTTPへのダウングレード時は送りません。URLに含まれる検索語やトークンが第三者へ漏れるのを防ぎます。
この記事のポイント
- 値は8種類。no-referrer・same-origin・strict-origin・strict-origin-when-cross-originの4つが安全側の値です。
- 一般的な自治体公式サイトの推奨値は strict-origin-when-cross-origin です。
- ヘッダーに複数値を書くと、認識できる最後の値が採用されます。meta要素で上書きすることもできます。
- ブラウザ既定値は strict-origin-when-cross-origin ですが、ブラウザ差があるため明示設定が推奨されます。
- セキュリティAIチェッカーは安全な4値を○、未設定・緩い値・綴り誤りを△(重み2)と判定します。
| 診断項目名 | Referrer-Policy |
|---|---|
| 項目ID | headers.referrer |
| 分類 | セキュリティヘッダー |
| 重大度・配点の重み | 中(medium) 重み 2 |
| 関連する標準・ガイドライン | OWASP ASVS 5.0.0 V3.4.5(Referer ヘッダーによる技術的に機微なデータの第三者への漏えいを防ぐリファラーポリシーを設定する。Level 2)、W3C Referrer Policy(Editor's Draft)、HTML Standard(meta name="referrer" の処理モデル)、OWASP WSTG-CONF-14(Other HTTP Security Header Misconfigurations)、CWE-200(Exposure of Sensitive Information to an Unauthorized Actor) |
Referrer-Policy(リファラーポリシー)とは
Referrer-Policyとは、ブラウザが送る Referer リクエストヘッダーの内容をサイト側から制御するレスポンスヘッダーです。ブラウザはリンクのクリックや画像・スクリプトの読み込み時に、遷移元ページのURLを Referer として送ります。Referrer-Policy は、その送信内容を「完全なURL」「オリジンのみ」「送らない」のどれにするかを決めます。
Referrer-Policy: strict-origin-when-cross-origin
URLのパスやクエリ文字列には、検索語、受付番号、メールで送られた一時的なリンクのトークン、職員用画面のパスなどが入ることがあります。自治体サイトは外部の地図サービス、動画サイト、SNS、アクセス解析、電子申請システムなど多くの第三者へリンク・読み込みを行うため、どこまでの情報を外へ出すかを明示的に決めておくことが重要です。
Referrer-Policyの値と送信内容の違い
8つのポリシー値
W3C Referrer Policy で定義されている値と、Referer に入る内容は次のとおりです。
| 値 | 同一オリジン | クロスオリジン(HTTPS→HTTPS) | HTTPS→HTTP(ダウングレード) |
|---|---|---|---|
no-referrer | 送らない | 送らない | 送らない |
same-origin | 完全URL | 送らない | 送らない |
strict-origin | オリジン | オリジン | 送らない |
strict-origin-when-cross-origin | 完全URL | オリジン | 送らない |
origin | オリジン | オリジン | オリジン |
origin-when-cross-origin | 完全URL | オリジン | オリジン |
no-referrer-when-downgrade | 完全URL | 完全URL | 送らない |
unsafe-url | 完全URL | 完全URL | 完全URL |
上の4つ(no-referrer、same-origin、strict-origin、strict-origin-when-cross-origin)は、クロスオリジンへ完全URLを送らず、HTTPへのダウングレード時にも情報を出さない値です。MDN HTTP Observatory もこの4値を「private」、残りの4値を「unsafe」に分類しています。
複数値とmeta要素の扱い
- ヘッダーの複数値:仕様では、カンマ区切りの各トークンのうち認識できる最後の値が採用され、未知の値は無視されます。古いブラウザ向けのフォールバックとして
Referrer-Policy: no-referrer, strict-origin-when-cross-originのように書けます。 - meta 要素:HTML Standard では
<meta name="referrer" content="...">が挿入されると、文書のリファラーポリシーをその値で上書きします。旧来の値never→no-referrer、always→unsafe-url、default→既定ポリシー、origin-when-crossorigin→origin-when-cross-originに読み替えられます。meta は1つの値だけを受け付けます。 - 要素単位の指定:
<a referrerpolicy="...">やrel="noreferrer"で個別に変更できます。
ブラウザ既定値とReferrer-Policyについてよくある誤解
- 「ヘッダーがない=完全URLが外部へ漏れる」:仕様と MDN によれば、ポリシーが指定されていない場合の既定値は
strict-origin-when-cross-originです(MDN によれば 2020年11月の仕様改訂でこの値になり、それ以前はno-referrer-when-downgradeでした)。そのため未設定でも完全URLが外部へ漏れるとは限りません。ただし、web.dev は「ブラウザによって既定ポリシーが異なる」ため明示的に設定することを勧めています。ASVS V3.4.5 も「ポリシーを設定していること」を要件にしています。 - 「Referer をCSRF対策に使う」:web.dev は Referer を CSRF 対策に使わず、CSRF トークンを使うよう勧めています。リファラーポリシーを厳しくすると、Referer チェックに依存した仕組みが動かなくなることがあります。
- 「no-referrer が最も良い」:漏えい防止としては最も強いですが、アクセス解析で参照元サイトが分からなくなる、Referer を確認する外部サービス(地図API キーの HTTP リファラー制限など)が動かなくなる、といった影響があります。一般的な公開サイトでは
strict-origin-when-cross-originが均衡の取れた選択です。
Referrer-Policyの診断基準(セキュリティAIチェッカー)
取得方法
- 入力URLへ GET を1回送信し、リダイレクトを最大4回追跡した最終応答の
Referrer-Policyヘッダーと、取得した HTML(最大2MB)中の<meta name="referrer">を評価します。追加の通信は行いません。 - ヘッダー値はカンマで分割し、仕様で定義された8値のうち最後に現れた認識可能な値を有効値とします。
- meta 要素(HTML 中で最初に現れる1つ)に認識可能な値(旧来の4値の読み替えを含む)がある場合は、ブラウザと同様に meta の値を有効値とします。認識できない値の場合はヘッダーの有効値を使います。対象は
name="referrer"とcontent="…"を引用符付きで書いた meta で、属性値に<や>を含むタグは検出しません。
判定条件
| 判定 | 条件 | 得点への影響 |
|---|---|---|
| ○ 問題なし(pass) | 有効値が no-referrer / same-origin / strict-origin / strict-origin-when-cross-origin のいずれか | 重み2を満点加算 |
| △ 要確認(warn) | ヘッダーも meta もない(ブラウザ既定に依存しており、明示設定がない) | 2×0.45=0.9点 |
| △ 要確認(warn) | 有効値が origin / origin-when-cross-origin / no-referrer-when-downgrade / unsafe-url | 2×0.45=0.9点 |
| △ 要確認(warn) | 値はあるが、認識できる値が1つもない(綴り誤りなど) | 2×0.45=0.9点 |
| × 要改善(fail)/対象外(na) | この項目では使いません | ― |
- 根拠欄には、ヘッダー値・meta の値と、採用された有効値を表示します。
- × を使わないのは、未設定でも主要ブラウザが安全側の既定値で動作するため、また緩い値であっても直ちに重大な脆弱性とは言えず、URLにどのような情報を載せているかの確認が必要だからです。
自治体サイトでの判定例
| 設定 | 判定 | 説明 |
|---|---|---|
Referrer-Policy: strict-origin-when-cross-origin | ○ | 推奨設定 |
Referrer-Policy: no-referrer, strict-origin-when-cross-origin | ○ | 有効値は最後の strict-origin-when-cross-origin |
Referrer-Policy: unsafe-url, strict-origin | ○ | 有効値は strict-origin |
ヘッダーなし、<meta name="referrer" content="same-origin"> | ○ | meta で明示している |
| ヘッダーなし、meta なし | △ | 明示設定がない |
Referrer-Policy: no-referrer-when-downgrade | △ | 外部サイトへ完全URLを送る |
Referrer-Policy: strict-origin-when-crossorigin(綴り誤り) | △ | 認識できず無視される |
Referrer-Policyが不適切だとどんなリスクがあるか
漏えい・攻撃のシナリオ
- URLに含まれるトークンの漏えい:パスワード再設定、申請状況確認、ファイル共有などで、URLに一時的なトークンや受付番号を含む設計がある。そのページから外部の画像・スクリプト・リンク先へアクセスすると、完全URLが Referer として第三者のサーバーログに残ります。web.dev は、こうした「capability URL」が意図しない相手に渡ると乗っ取りにつながる危険を指摘しています。
- 検索語・閲覧内容の第三者送信:サイト内検索の語句(相談内容、病名、福祉制度名など)がクエリ文字列に入り、外部のアクセス解析や埋め込みコンテンツの配信元へ送られる。住民のプライバシーに関わる情報が意図せず外部へ出ることになります。
- 内部構成の露出:職員向けや非公開のページのパス・ホスト名が、外部リンク経由で第三者に知られる。ASVS V3.4.5 は、内部の非公開アプリケーションではホスト名自体も機微情報になり得ると述べています。
- HTTP へのダウングレード時の平文送信:
unsafe-urlやoriginを指定すると、HTTPS ページから HTTP の外部サイトへ移動した際に、URL やオリジンが暗号化されずに送られます。
想定される被害
- 住民の個人に関わる閲覧・検索情報の第三者への提供(個人情報保護の観点での問題)
- 一時リンクを使った手続き画面への不正アクセス
- 攻撃者による内部システム構成の把握
Referrer-Policyの設定方法(Apache・nginx・IIS・Next.js・meta要素)
推奨値
一般的な自治体公式サイトでは、次の設定を推奨します。
Referrer-Policy: strict-origin-when-cross-origin
職員用システムや、URLに識別子を含む手続き画面など、外部へ参照元を一切出したくない領域では no-referrer または same-origin を個別に設定します。
| 領域 | 推奨値 |
|---|---|
| 一般的な公開ページ | strict-origin-when-cross-origin |
| 申請状況確認など、URLに識別子・トークンを含む画面 | no-referrer または same-origin |
| 職員用システム | no-referrer または same-origin |
Apache(.htaccess / httpd.conf)
<IfModule mod_headers.c>
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>
特定ディレクトリ(例:申請状況確認ページ)だけ厳しくする場合は、そのディレクトリの .htaccess で Header always set Referrer-Policy "no-referrer" と上書きします。
nginx
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
location /apply/status/ {
add_header Referrer-Policy "no-referrer" always;
# この location に add_header を書いたため、server 側の add_header(X-Content-Type-Options など)は
# この location には継承されない。必要なヘッダーはここにも書くこと(nginx 1.29.3 以降は add_header_inherit merge; でも可)
}
IIS(web.config)
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Referrer-Policy" value="strict-origin-when-cross-origin" />
</customHeaders>
</httpProtocol>
</system.webServer>
Next.js(Vercel)
// next.config.js
module.exports = {
async headers() {
return [{
source: "/:path*",
headers: [{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" }],
}];
},
};
サーバー設定を変更できない場合(CMS テンプレートのmeta要素)
共通ヘッダーテンプレートの <head> 内、できるだけ前方に次を追加します。
<meta name="referrer" content="strict-origin-when-cross-origin">
meta は、それより前に読み込まれたリソースには適用されない場合があるため、<head> の先頭付近に置きます。
サイトを壊さないための注意点
- 外部APIのリファラー制限:地図や検索などの外部APIキーに「HTTPリファラー制限」をかけている場合、
no-referrerにすると Referer が送られずに認証エラーになります。strict-origin-when-cross-originならオリジンは送られるため、多くの場合はオリジン単位の制限で動作します。設定変更後に地図・埋め込み動画・外部フォームの動作を確認してください。 - アクセス解析:
no-referrer/same-originでは、遷移先サイトで本サイトからの流入が計測されなくなります。 - Referer に依存する独自チェック:古いCMSやフォームで Referer による送信元確認を行っている場合、同一オリジン内では
strict-origin-when-cross-originでも完全URLが送られるため通常は影響しませんが、no-referrerでは失敗します。
設定後の確認方法
curl -sI https://www.example.lg.jp/ | grep -i referrer-policy
curl -s https://www.example.lg.jp/ | grep -i -o '<meta[^>]*name="referrer"[^>]*>'
ブラウザの開発者ツールで、外部リソースへのリクエストの Referer がオリジンのみ(例:https://www.example.lg.jp/)になっていることも確認します。設定後はセキュリティAIチェッカーで再診断し、根拠欄の「有効値」が推奨値になっていることを確かめてください。
よくある質問(FAQ)
Referrer-Policyの推奨値は何ですか?
一般的な公開サイトでは strict-origin-when-cross-origin が均衡の取れた選択です。同一オリジンには完全URL、外部にはオリジンのみを送り、HTTPSからHTTPへの移動では送りません。URLに識別子を含む手続き画面や職員用システムは no-referrer または same-origin を個別に設定します。
Referrer-Policyを設定しないと完全なURLが外部に漏れますか?
必ずしも漏れません。仕様とMDNによれば、指定がない場合の既定値は strict-origin-when-cross-origin です。ただしブラウザによって既定ポリシーが異なる可能性があるため、明示的に設定することが勧められ、ASVS V3.4.5もポリシーの設定を求めています。
no-referrerにすれば最も安全ですか?
漏えい防止としては最も強い値ですが、アクセス解析で参照元が分からなくなる、HTTPリファラー制限をかけた地図APIキーなどが認証エラーになる、といった影響があります。サイト全体は strict-origin-when-cross-origin とし、特に守りたい領域だけ no-referrer にする方法が現実的です。
Referrer-Policyに複数の値を書くとどうなりますか?
カンマ区切りの各値のうち、ブラウザが認識できる最後の値が採用され、未知の値は無視されます。古いブラウザ向けのフォールバックとして no-referrer, strict-origin-when-cross-origin のように書くことができます。
サーバー設定を変えられない場合はどうすればよいですか?
CMSの共通テンプレートの head 内、できるだけ先頭に meta name="referrer" content="strict-origin-when-cross-origin" を追加します。meta要素はそれより前に読み込まれたリソースには適用されない場合があるため、head の前方に置きます。セキュリティAIチェッカーもmeta要素の指定を評価します。
Referrer-Policyが未設定だとセキュリティAIチェッカーで×になりますか?
×にはならず「△ 要確認」(重み2の45%)です。未設定でも主要ブラウザが安全側の既定値で動くこと、緩い値でも直ちに重大な脆弱性とは言えずURLに載せている情報の確認が必要なことから、この項目は×を使いません。
この項目を含む127項目を、URLを入れるだけで無料診断します。