玄関の鍵をかけたはずなのに、なぜか「訪問先のメモ」を落としてしまう?
こんにちは。セキュリティの世界で長く泥臭い現場を歩んできたエンジニアです。
今日は皆さんに、Webサイトの「うっかり漏洩」を防ぐための非常に重要な武器、「Referrer-Policy(リファラー・ポリシー)」についてお話しします。
「セキュリティ」と聞くと、ファイアウォールや高度な暗号化を想像するかもしれません。でも、実は多くの情報漏洩は、もっと身近で「当たり前だと思っていた動作」から起きています。今日は、家の防犯に例えながら、一緒に紐解いていきましょう。
—
1. 「Referer」ってなんだろう?:訪問者が残していく「足跡」
皆さんがネットサーフィンをしているとき、あるサイトから別のサイトへ移動すると、移動先のサーバーには「どこから来たのか」という情報(Refererヘッダー)が自動的に送られています。
これを例えるなら、「手土産の包み紙に、自分がどこの家から来たのかを丁寧に書き残して、相手の玄関先に置いてくる」ようなものです。
普段は「どこからアクセスがあったか」をサイト管理者が知るための便利な仕組みですが、ここにとんでもない落とし穴があります。
なぜこれが「危ない」のか?
例えば、皆さんが会員サイトの「マイページ」にログインして、URLが以下のようになっているとします。
`https://example.com/mypage?user_id=12345&session_token=secret_key_abc…`
この状態で、ページ内にある外部サイトへのリンク(広告やSNSのアイコンなど)をクリックしたとします。すると、このURL丸ごとが、リンク先の外部サイトへ「Referer」として送信されてしまうのです。
もしその外部サイトが悪意ある運営者だったら?
皆さんの `user_id` や `session_token` を盗み見て、そのままなりすましアクセスを仕掛けてくるかもしれません。まるで、鍵をかけた家の玄関先に、合鍵の形が書かれたメモを落として歩いているようなものです。
—
2. 泥棒にメモを渡さないための「Referrer-Policy」
この「勝手に漏れる情報」をコントロールするのが `Referrer-Policy` です。これは、「相手に渡すメモにどこまで書くか」を決めるルールブックです。
ブラウザに対して、「外部サイトへ移動するときは、この範囲の情報だけを伝えなさい」と指示を出します。
おすすめの設定:`strict-origin-when-cross-origin`
最近のWeb開発における「鉄板」の設定はこれです。まずはこれを覚えてください。
- `strict-origin-when-cross-origin`
- 同じサイト内であれば詳細なURLを送る
- HTTPSから別のHTTPSへ移動する場合は、ホスト名まで(`https://example.com`)だけを送る
- HTTPSからHTTP(暗号化されていないサイト)へ移動する場合は、何も送らない
これなら、せっかくの機密情報が含まれるURLパラメータまで相手に届くことはありません。非常に賢い防犯対策だと思いませんか?
—
3. 実装はたったの一行:Webサーバーの設定を変えてみよう
難しそうに見えますが、設定はとてもシンプルです。サーバーのレスポンスヘッダーに、以下の指示を書き加えるだけです。
Nginxの場合の設定例
サーバーの設定ファイルに以下を追記します
add_header Referrer-Policy “strict-origin-when-cross-origin” always;
Apacheの場合の設定例
.htaccess または設定ファイルに追記
Header always set Referrer-Policy “strict-origin-when-cross-origin”
この設定を入れておけば、サイト内のリンクをクリックして外部へ飛ぶとき、ブラウザが自動的に「あ、この情報は相手に教えちゃダメだな」と判断して情報を削ぎ落としてくれます。
—
4. セキュリティは「魔法」ではなく「日々の積み重ね」
今回紹介した `Referrer-Policy` は、一見地味な対策です。しかし、攻撃者はこうした「ブラウザの標準的な動作」の隙を突くのが大好きです。
「うちは大したサイトじゃないから大丈夫」なんてことはありません。あなたのユーザーが、あなたのサイトを窓口にして、知らないところで被害に遭う。そんな事態だけは避けたいですよね。
最後に、新人の皆さんへ
セキュリティのプロになるためのコツは、「ブラウザは何を自動的にやってくれているのか?」「それは本当に安全か?」と疑うクセをつけることです。
まずは自分のサイトのレスポンスヘッダーを確認してみてください。そこに `Referrer-Policy` がなければ、それが最初の一歩です。一歩ずつ、しっかりと安全な城を築いていきましょう!
何か分からないことがあれば、いつでもまた聞きに来てくださいね。エンジニアとして、皆さんの成長を応援しています。

コメント