フリーキーズ | 独学プログラミング

HSTSプリロードで中間者攻撃を防止!初心者でもわかるWebセキュリティ強化の基本

リンドくん

リンドくん

たなべ先生、Webサイトを作る時に「HTTPS化すれば安全」って聞いたんですけど、それだけで本当に十分なんですか?

たなべ

たなべ

いい質問だね!実はHTTPS化しただけでは不十分なケースがあるんだ。
例えば、最初のアクセス時にHTTPで接続されてしまうと、そこに攻撃の隙が生まれてしまうんだよ。

リンドくん

リンドくん

え?でもHTTPSに自動的にリダイレクトすれば大丈夫なんじゃないですか?

たなべ

たなべ

残念ながら、そのリダイレクト自体が攻撃者に書き換えられる可能性があるんだ。
そこで登場するのがHSTSプリロードという仕組みなんだよ。今日はこれについて詳しく解説していくね。

Webセキュリティを学び始めた方にとって、「HTTPS化すれば安全」という認識は決して間違いではありません。
しかし、実際にはHTTPS化だけでは防げない攻撃が存在します。

その代表的なものが中間者攻撃(MITM: Man-In-The-Middle Attack)です。
この攻撃では、ユーザーとWebサイトの間に攻撃者が割り込み、通信内容を盗聴したり改ざんしたりすることが可能になります。

本記事では、こうした攻撃からWebサイトを守るための強力な防御手段であるHSTSプリロードについて、セキュリティ初心者の方でも理解できるよう、基礎から丁寧に解説していきます。

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

そもそもHTTPSだけでは不十分な理由

リンドくん

リンドくん

先生、HTTPSって暗号化されてるんですよね?それなのになぜ攻撃されるんですか?

たなべ

たなべ

確かにHTTPS通信自体は暗号化されているんだけど、問題は最初の接続時なんだ。
ユーザーがブラウザに「____.com」と入力した場合、最初はHTTPで接続を試みることが多いんだよ。

HTTPからHTTPSへのリダイレクトの危険性

多くのWebサイトでは、HTTPでアクセスされた場合にHTTPSへ自動的にリダイレクトする設定をしています。例えば、以下のような流れです。

  1. ユーザーがhttp://____.comにアクセス
  2. サーバーが「HTTPSに移動してください」というレスポンスを返す
  3. ブラウザがhttps://____.comに再アクセス

一見問題なさそうですが、ここに重大な脆弱性があります。

最初のHTTP通信は暗号化されていないため、ネットワーク上の攻撃者がこの通信を傍受し、リダイレクト先を悪意のあるサイトに書き換えることが可能なのです。これは「SSLストリッピング攻撃」と呼ばれる攻撃手法です。

攻撃シナリオ

具体的な攻撃の流れを見てみましょう。

  1. ユーザーがカフェの無料Wi-Fiに接続
  2. http://bank.____.comにアクセス
  3. 攻撃者がHTTP通信を傍受
  4. 攻撃者がリダイレクト先をhttp://fake-bank.____.comに書き換え
  5. ユーザーは偽サイトでログイン情報を入力してしまう

このように、HTTPS化していても、最初のHTTP接続が攻撃の入り口になってしまうのです。公衆Wi-Fiなどの信頼できないネットワークでは、こうした攻撃のリスクが特に高くなります。

なぜブラウザはHTTPで接続を試みるのか

そもそもなぜブラウザは最初にHTTPで接続しようとするのでしょうか?

それは、ユーザーの利便性のためです。ユーザーがアドレスバーに「____.com」とだけ入力した場合、ブラウザは以下の順序で接続を試みます。

  • まずHTTP(http://____.com)にアクセス
  • HTTPSが利用可能であれば、リダイレクトに従ってHTTPSに移動

この仕組み自体は合理的ですが、セキュリティ上の隙を生んでしまっているのです。

HSTSとは何か?基本の仕組みを理解しよう

リンドくん

リンドくん

じゃあ、どうやってその問題を解決するんですか?

たなべ

たなべ

そこで登場するのがHSTS(HTTP Strict Transport Security)という仕組みなんだ。
これを使うと、ブラウザに「このサイトには必ずHTTPSでアクセスしてね」と記憶させることができるんだよ。

HSTSの基本動作

HSTS(HTTP Strict Transport Security)は、Webサイトがブラウザに対して「このサイトには常にHTTPSでアクセスすること」を指示するセキュリティ機能です。

具体的には、Webサーバーが以下のようなHTTPヘッダを返すことで実現されます。

Strict-Transport-Security: max-age=31536000; includeSubDomains

このヘッダの意味を分解してみましょう。

  • Strict-Transport-Security - HSTSポリシーを宣言するヘッダ名
  • max-age=31536000 - このポリシーを31536000秒(1年間)記憶する
  • includeSubDomains - サブドメインにも同じポリシーを適用する

HSTSが機能する流れ

  1. 初回アクセス時
  • ユーザーがhttps://____.comにアクセス
  • サーバーがHSTSヘッダを含むレスポンスを返す
  • ブラウザがこのポリシーを記憶
  1. 次回以降のアクセス時
  • ユーザーがhttp://____.comと入力(HTTPで)
  • ブラウザ内部で自動的にhttps://____.comに変換
  • サーバーとの通信は最初からHTTPSで行われる

この仕組みにより、HTTPでの接続を完全に排除できます。リダイレクトではなく、ブラウザ側で自動的にHTTPSに書き換えるため、攻撃者が介入する余地がないのです。

HSTSの制限事項

ただし、HSTSには重要な制限があります。

それは、初回アクセス時には保護されないという点です。

ブラウザがHSTSポリシーを記憶するには、一度はHTTPSで接続してHSTSヘッダを受け取る必要があります。つまり、全く初めてそのサイトにアクセスするユーザーは、依然として攻撃のリスクにさらされる可能性があるのです。

この「初回アクセス問題」を解決するのが、次に説明するHSTSプリロードなのです。

HSTSプリロードで初回アクセスも保護する

リンドくん

リンドくん

初回アクセスが守られないなら、結局危ないんじゃないですか?

たなべ

たなべ

そこで考え出されたのがHSTSプリロードという仕組みなんだ。
主要なブラウザに「このサイトは常にHTTPSで接続すべき」という情報をあらかじめ組み込んでおくんだよ。

HSTSプリロードの仕組み

HSTSプリロードは、WebサイトのドメインをGoogleが管理するHSTSプリロードリストに登録することで実現されます。

このリストに登録されると、以下のような流れで保護が機能します。

  1. 登録時
  • サイト管理者がhstspreload.orgにドメインを申請
  • 審査を経てプリロードリストに追加
  1. ブラウザへの反映
  • Chrome、Firefox、Safari、Edgeなどの主要ブラウザが定期的にこのリストを取得
  • ブラウザのソースコードに組み込まれる
  1. ユーザーのアクセス時
  • ユーザーがhttp://____.comと入力
  • ブラウザがプリロードリストを確認
  • 初回アクセスでも自動的にhttps://____.comに変換

このように、ブラウザ側に情報が組み込まれているため、全く初めてのアクセスでも保護されるのです。

プリロードリストの実際

実際のプリロードリストには、数十万のドメインが登録されています。Google.com、Facebook.com、Twitter.comなど、主要なWebサービスのほとんどがこのリストに含まれています。

リストは定期的に更新され、新しいドメインが追加されたり、削除申請があったドメインが除外されたりします。

プリロードの利点と注意点

利点

  • 初回アクセスから完全保護 - ブラウザ側で自動変換されるため隙がない
  • 恒久的な保護 - ブラウザに組み込まれるため、ユーザー側の設定不要
  • 信頼性の向上 - セキュリティに真剣に取り組んでいる証明になる

注意点

  • 削除が困難 - 一度登録すると削除に時間がかかる(数ヶ月〜半年)
  • HTTPS必須 - サイト全体(全サブドメイン含む)でHTTPSが必須
  • 後戻りできない - 途中でHTTPに戻すことは実質不可能

特に最後の点は重要です。プリロード登録は不可逆的な決断だと考えてください。登録後にHTTPサービスを提供したくなっても、ブラウザに情報が残り続けるため、実質的に不可能になります。

HSTSプリロードを設定する具体的な手順

リンドくん

リンドくん

実際にHSTSプリロードを設定するにはどうすればいいんですか?

たなべ

たなべ

いくつかのステップがあるんだけど、順を追ってやれば難しくないよ。
ただし、事前準備がとても重要なんだ。焦らず一つずつ確認していこう。

ステップ① 前提条件の確認

HSTSプリロードを登録する前に、以下の条件を満たしている必要があります。

1. 有効なHTTPS証明書の設置

  • SSL/TLS証明書が正しくインストールされている
  • 証明書に警告が出ない
  • すべてのサブドメインでHTTPSが利用可能

2. すべてのHTTPトラフィックをHTTPSにリダイレクト

  • HTTPでのアクセスを完全にHTTPSに転送
  • サブドメインを含むすべてのページが対象

3. すべてのサブドメインでHTTPSを提供

  • www.____.comblog.____.comなど
  • 使用していないサブドメインも含む

この条件を満たしていない場合、プリロード登録はできません。特に「すべてのサブドメイン」という要件に注意してください。

ステップ② HSTSヘッダの設定

次に、適切なHSTSヘッダを設定します。プリロードリストに登録するには、以下の条件を満たすヘッダが必要です。

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

各要素の意味は以下の通りです。

  • max-age=31536000 - 最低1年間(31536000秒)のポリシー有効期間
  • includeSubDomains - サブドメインにも適用(必須)
  • preload - プリロード対象であることを明示

ステップ③ サーバー設定の実装例

主要なWebサーバーでの設定方法を紹介します。

Apache(.htaccessまたはApache設定ファイル)
<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>

Nginx

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Node.js(Express)
app.use((req, res, next) => {
    res.setHeader(
        'Strict-Transport-Security',
        'max-age=31536000; includeSubDomains; preload'
    );
    next();
});

設定後は、ブラウザの開発者ツールでレスポンスヘッダを確認し、正しく送信されていることを確認してください。

ステップ④ プリロードリストへの登録申請

準備が整ったら、実際に登録申請を行います。

1. hstspreload.orgにアクセス

  • 公式の登録サイトに移動

2. ドメイン名を入力

  • ____.comのように、ルートドメインを入力
  • www.____.comではなく____.comと入力

3. 資格確認

  • サイトが自動的に設定を確認
  • すべての要件を満たしているか検証

4. 同意事項の確認

  • 削除が困難であることの理解
  • すべてのサブドメインへの影響の理解
  • チェックボックスにチェック

5. 登録ボタンをクリック

  • 申請が送信される

ステップ⑤ 反映の確認と待機

登録申請後、実際にブラウザに反映されるまでには時間がかかります。

  • Chromeへの反映 - 数週間〜数ヶ月
  • 他のブラウザへの反映 - Chromeのリストを利用するため、さらに時間がかかる

反映状況は、以下の方法で確認できます。

  1. hstspreload.orgで登録状態を確認
  2. Chromiumのソースコードでリストを直接確認
  3. ブラウザの内部ページ(chrome://net-internals/#hsts)で確認

焦らず、気長に待つことが重要です。この間もHSTSヘッダ自体は機能しているため、既にアクセスしたユーザーは保護されています。

HSTSプリロード運用上の注意点とトラブルシューティング

リンドくん

リンドくん

もし設定を間違えたらどうなるんですか?取り消せるんですか?

たなべ

たなべ

それが一番大変なところなんだ。
削除申請はできるけど、実際にブラウザから削除されるまで半年以上かかることもあるんだよ。だから慎重に進める必要があるんだ。

よくある設定ミスと対処法

1. サブドメインの確認漏れ

最も多い失敗は、すべてのサブドメインでHTTPSが利用可能か確認していないケースです。

  • 問題: old.____.comなどの古いサブドメインがHTTPのまま
  • 影響: ユーザーがそのサブドメインにアクセスできなくなる
  • 対処: 事前にすべてのDNSレコードとサブドメインをリストアップして確認

2. max-ageの値が不足

プリロード登録には最低1年間(31536000秒)のmax-ageが必要です。

  • 問題: max-age=86400(1日)など短い値を設定
  • 影響: 登録申請が却下される
  • 対処: 必ず31536000以上の値を設定

3. HTTPSへのリダイレクト漏れ

一部のページでHTTPアクセスを許可している場合があります。

  • 問題: 特定のパスでHTTPSリダイレクトが設定されていない
  • 影響: ユーザーが警告画面を見ることになる
  • 対処: すべてのパス、すべてのサブドメインでリダイレクトを確認

削除申請プロセスと注意点

何らかの理由でプリロードリストから削除したい場合の手順です。

1. hstspreload.orgで削除申請

  • 削除理由を記載して申請

2. HSTSヘッダの削除

  • サーバー設定からHSTSヘッダを削除
  • またはmax-ageを0に設定

3. 長期間の待機

  • リストから削除されるまで数ヶ月〜半年以上
  • すでに配布されたブラウザからの削除はさらに時間がかかる

まとめ - 安全なWebサイトへの投資として

リンドくん

リンドくん

HSTSプリロードって、設定は大変そうだけど、やる価値は十分ありますね!

たなべ

たなべ

その通り!最初は慎重に準備する必要があるけど、一度設定すれば継続的にユーザーを守ってくれるんだ。
セキュリティへの投資として、とても意味があるよ。

この記事では、HSTSプリロードの仕組みから実装方法、運用上の注意点まで詳しく解説してきました。重要なポイントをまとめておきましょう。

HSTSプリロードの核心的な価値

  • 初回アクセスから保護 - 従来のHSTSでは防げなかった初回アクセス時の脆弱性を解消
  • 中間者攻撃の完全防止 - SSLストリッピング攻撃などを根本から無効化
  • ブラウザレベルでの自動保護 - ユーザー側の設定不要で安全性を確保

実装における重要な注意点

  • 不可逆性を理解する - 一度登録すると削除に半年以上かかる可能性
  • すべてのサブドメインを確認 - 1つでも対応できていないとアクセス不能に
  • 段階的に導入する - テスト期間を設けてリスクを最小化

Webセキュリティは、一度設定すれば終わりではなく、継続的な改善が必要な分野です。
HSTSプリロードは、その中でも最も基本的で効果的な対策の一つと言えます。

あなたのWebサイトがまだHSTS対応していない場合は、ぜひこの機会に導入を検討してみてください。
ユーザーの安全を守ることは、Webサイト運営者の重要な責任です。

この記事をシェア

関連するコンテンツ