Web セキュリティ

HSTS (HTTP Strict Transport Security)

約 4 分で読めます

HSTS とは

HSTS (HTTP Strict Transport Security) は、Web サーバーがブラウザに対して「今後このドメインへのアクセスは必ず HTTPS を使うように」と指示するセキュリティ機構です。HTTP レスポンスヘッダーに Strict-Transport-Security を付与することで有効化されます。

HSTS が設定されていない場合、ユーザーが http://example.com にアクセスすると、サーバーが HTTPS へリダイレクトするまでの一瞬、通信が平文で行われます。この瞬間を狙った中間者攻撃 (SSL ストリッピング) が成立する余地があります。HSTS を設定すると、ブラウザ側で HTTP リクエストを送信する前に HTTPS に書き換えるため、この攻撃を根本的に排除できます。

HSTS の設定とディレクティブ

HSTS は以下のレスポンスヘッダーで設定します。

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

  • max-age: ブラウザが HSTS ポリシーを記憶する秒数。31536000 (1 年間) が推奨値。初回導入時は 300 (5 分) や 86400 (1 日) から始め、問題がなければ段階的に延長するのが安全。
  • includeSubDomains: サブドメインにも HSTS を適用する。api.example.comcdn.example.com など、すべてのサブドメインが HTTPS に対応していることを確認してから有効化する。HTTP のみで運用しているサブドメインがあると、そのサブドメインにアクセスできなくなる。
  • preload: HSTS Preload リストへの登録意思を示すフラグ。このフラグだけでは Preload リストに登録されず、別途申請が必要。

セキュリティヘッダーの中でも HSTS は副作用が比較的少なく、TLS/SSL による暗号化通信を確実に強制できるため、HTTPS 対応済みのサイトでは早期に導入すべきヘッダーです。

HSTS Preload リストの仕組み

通常の HSTS には「初回アクセス問題」があります。ブラウザが HSTS ヘッダーを受け取るのは最初の HTTPS アクセス時であるため、ユーザーがそのドメインに初めてアクセスする際は HSTS が機能しません。

この問題を解決するのが HSTS Preload リストです。これはブラウザにハードコードされた HSTS 対応ドメインのリストで、Chrome が管理する hstspreload.org から申請できます。登録されると、ユーザーが一度もアクセスしたことがないドメインでも、最初から HTTPS が強制されます。

Preload リスト登録の要件は以下のとおりです。

  • 有効なデジタル証明書を使用していること
  • HTTP から HTTPS へのリダイレクトが設定されていること
  • max-age が 31536000 (1 年) 以上であること
  • includeSubDomainspreload ディレクティブが含まれていること

注意点として、Preload リストからの削除には数か月かかります。登録前にすべてのサブドメインが HTTPS に対応していることを慎重に確認してください。

HSTS 導入時の注意点と段階的アプローチ

HSTS は強力な反面、設定ミスがサイトのアクセス不能につながるリスクがあります。以下の段階的アプローチを推奨します。

  1. Step 1: max-age=300 (5 分) で設定し、サイト全体が HTTPS で正常に動作することを確認
  2. Step 2: max-age=86400 (1 日) に延長し、1 週間程度運用して問題がないことを確認
  3. Step 3: max-age=31536000; includeSubDomains に拡大
  4. Step 4: 必要に応じて preload を追加し、Preload リストに申請

特に注意すべきケースとして、CDN やサードパーティサービスが HTTP で配信しているリソースがある場合、HSTS 適用後に混在コンテンツ (Mixed Content) エラーが発生します。導入前にすべての外部リソースが HTTPS で配信されていることを確認してください。

CSPupgrade-insecure-requests ディレクティブと併用すると、ページ内の HTTP リソース参照を自動的に HTTPS に書き換えてくれるため、移行期間中の混在コンテンツ問題を緩和できます。

よくある誤解

HTTPS にリダイレクトしていれば HSTS は不要
HTTP から HTTPS へのリダイレクト中、最初のリクエストは平文で送信されます。この瞬間に中間者攻撃 (SSL ストリッピング) が成立する可能性があります。HSTS はブラウザ側で HTTP リクエスト自体を HTTPS に書き換えるため、リダイレクトでは防げない攻撃を防御します。
HSTS を設定すれば即座にすべてのユーザーに適用される
通常の HSTS はブラウザがヘッダーを受信して初めて有効になるため、初回アクセス時は保護されません。すべてのユーザーを初回から保護するには、HSTS Preload リストへの登録が必要です。

関連用語

関連記事