なぜ、あなたのウェブサイトは「鍵をかけたはず」なのに盗聴されるのか?
こんにちは。セキュリティの現場で日々、見えない脅威と戦っているエンジニアです。
今日は、Web開発を始めたばかりの皆さんが必ずぶつかる壁であり、かつ「実は一番怖い」と言っても過言ではない「SSLストリッピング攻撃」と、それを防ぐための切り札「HSTS(HTTP Strict Transport Security)」についてお話しします。
「HTTPSにしているから大丈夫でしょ?」と安心しているあなたこそ、ぜひ最後まで読んでください。実は、その安心が最大の隙になっているかもしれません。
—
「鍵をかけたはず」の罠:SSLストリッピングとは?
想像してみてください。あなたは玄関に頑丈な鍵(HTTPS)をかけました。でも、泥棒は「家の中に入る」のではなく、「あなたが鍵をかける瞬間」を狙ってきます。
実は、多くのユーザーはブラウザのURLバーに直接 `https://example.com` と打ち込むのではなく、単に `example.com` と入力しますよね。するとブラウザは、まず「このサイトってHTTPSかな? それとも普通のHTTPかな?」と確認しに行きます。
攻撃者はこの「最初の確認のやり取り」に割り込みます。
1. ユーザー:`example.com` にアクセスしたいな!
2. 攻撃者(中間者):(通信を傍受して)「あ、このサイトはまだHTTPSじゃないよ!普通のHTTPでつないでおくね!」
3. ユーザー:あれ、鍵マークがないけどまあいいか……(そのまま通信)
これが「SSLストリッピング(HTTPS剥がし)」です。通信の入り口でわざと「HTTPSを使わせない」ように仕向ける攻撃ですね。これでは、どんなに強力な暗号化鍵を持っていても、そもそも暗号化トンネルが作られないため、パスワードや個人情報が丸見えになってしまいます。
—
HSTS:ブラウザに「強制的に鍵をかけさせる」ルール
この攻撃を防ぐために導入されたのが、HSTS(HTTP Strict Transport Security)という仕組みです。
これは、Webサーバーからブラウザに対して、「このサイトは二度とHTTPではアクセスしないでくれ!最初から最後まで、強制的にHTTPSを使ってくれ!」という命令を出す設定です。
一度この命令を受け取ったブラウザは、ユーザーがうっかり「http://」と入力しても、あるいはリンク先が「http://」であっても、勝手に「https://」へ書き換えて通信してくれます。これなら、途中で攻撃者が割り込む隙はありませんね。
—
実践!HSTSを設定してみよう
HSTSの導入は、Webサーバーのレスポンスヘッダーに特定の文字列を追加するだけです。NginxやApacheを使っている場合、以下のように設定します。
Nginxの例
HTTPヘッダーにHSTSを追加する設定
add_header Strict-Transport-Security “max-age=31536000; includeSubDomains; preload” always;
設定のポイント(ここが重要!)
- max-age=31536000: この命令をブラウザに「1年間(秒数換算)」記憶させます。
- includeSubDomains: サブドメイン(blog.example.comなど)も含めてすべてHTTPSを強制します。
- preload: 非常に強力な設定です。後述する「HSTS Preloadリスト」への登録を許可します。
—
「最初の1回」を守る:HSTS Preloadリスト
ここまで読んだ鋭い方は、こう思うはずです。
「じゃあ、サイトに初めて訪れた瞬間の通信はどう守るの?」
そう、HSTSは「一度サイトにアクセスしてヘッダーを受け取った後」に有効になります。その「最初の1回」を狙われたら、まだ無防備なんです。
そこで登場するのが「HSTS Preloadリスト」です。
これは、主要なブラウザメーカー(GoogleやAppleなど)が、「このドメインは絶対にHTTPSしか使わない!」という情報をブラウザ自体に最初から組み込んでおく仕組みです。
[HSTS Preload公式サイト](https://hstspreload.org/) から自分のドメインを登録申請することで、初めてのアクセスであっても、ブラウザが最初から「このサイトにはHTTPS以外で接続してはダメだ」と知っている状態を作れます。まさに、防犯レベルを最高段階まで引き上げる設定と言えます。
—
最後に:セキュリティは「設定して終わり」ではない
HSTSは強力ですが、一度導入すると「HTTPS以外の接続(HTTP)」を完全に切り捨てることになります。 もしサーバーの証明書更新を忘れて期限切れになったりすると、ユーザーはサイトに一切アクセスできなくなります。
「設定すれば安心」ではなく、「正しく運用し続けること」が、プロの仕事です。
まずは開発環境でヘッダーを追加してみて、ブラウザのデベロッパーツール(ネットワークタブ)で、レスポンスヘッダーに `Strict-Transport-Security` が付与されているか確認することから始めてみてください。
一歩ずつ、確実に。あなたのサイトを訪れるユーザーを守るために、今日からできる防犯対策を一緒に進めていきましょう!

コメント