1. HSTSとは
HSTS(HTTP Strict Transport Security) とは、Web サイトが常にHTTPSで接続するように強制する仕組みです。
ブラウザはこの設定を一定期間記憶し、その間は HTTP でアクセスしようとしても自動的に HTTPS に書き換えて接続します。
HSTS は、サーバーから返すレスポンスヘッダーに Strict-Transport-Security を含めることで動作します。代表的な書式は次の通りです。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
主なパラメータは次の通りです。
-
max-age:ブラウザが HSTS 設定を保持する秒数。31536000の場合は 1 年間- ただし、一度設定すると、この期間内はHTTPでのアクセスが一切できなくなるため注意が必要
-
includeSubDomains:対象のドメイン配下のすべてのサブドメインにも HSTS を適用する -
preload:ブラウザベンダーが管理している「HSTS プリロードリスト」に登録するためのフラグ
2. 導入する目的
HSTS を導入する主な目的は、HTTPS 通信の強制と、それによるセキュリティ向上です。具体的には次のような効果があります。
- 中間者攻撃のリスク軽減
- ユーザーが HTTP でアクセスしようとしても、ブラウザ側で強制的に HTTPS に書き換えられるため、リダイレクト処理自体を省略でき、リダイレクトを書き換える攻撃などの余地が小さくなる
- HTTP へのダウングレード防止
- 攻撃者が意図的に HTTP での接続を誘導する「ダウングレード攻撃」を防ぎやすくなる
- 常時 SSL/TLS 化
- すべてのアクセスを HTTPS に統一することで、平文通信が紛れ込むリスクを減らせる
3. 動作の流れ
HSTS がどのように動作するのか、基本的な流れを整理します。
- ユーザーが
https://example.comにアクセスする - サーバーは HTTPS 通信を確立し、レスポンスヘッダーに
Strict-Transport-Securityを含めて返す - ブラウザはこのヘッダーを受け取り、指定された
max-ageの間、そのドメインを HSTS 対象として内部に記録する - 次回以降、ユーザーが
http://example.comと入力した場合でも、ブラウザは自動的にhttps://example.comに内部で書き換えてから接続する -
max-ageが切れる前に再度 HSTS ヘッダーが返ってきた場合、ブラウザはそのたびに有効期限を延長する
ただし、最初の 1 回目のアクセスは、ユーザーが自発的に HTTPS でアクセスするか、あるいは検索結果や外部リンクから HTTPS でアクセスされる必要があります。初回から HTTPS を強制させる方法として HSTS プリロードがあります。
4. HSTS プリロードとは
HSTS プリロードは、ブラウザがあらかじめ HSTS を有効にして扱うドメインの一覧に自分のサイトを登録しておく仕組みです。
このリストに載ると、ユーザーがそのサイトに初めてアクセスする時点からブラウザ側が HTTPS 接続を強制します。
HSTS プリロードリストに登録するためには、例えば以下の条件を満たす必要があります。
- 対象ドメインが HTTPS でのみ配信されている
- ルートドメインで HSTS ヘッダーを返している
-
max-ageが十分に長い値である(例:31536000以上) -
includeSubDomainsとpreloadが指定されている - サイトが正しく動作しており、証明書に問題がないこと
そのうえで、ブラウザベンダーが公開している HSTS Preload のサイトから対象ドメインを申請します。申請が承認されると、各ブラウザの次回以降のリリースに組み込まれます。
5. まとめ
- HSTS は、ブラウザに HTTPS 接続を強制させることで、中間者攻撃や HTTP へのダウングレードを防ぐ仕組み
- 初回から HTTPS を強制させたい場合は HSTS プリロードという仕組みが使える