ひとことで言うと
HSTS(HTTP Strict Transport Security)とは、Webサーバーが `Strict-Transport-Security` レスポンスヘッダーを送ることで、ブラウザに「このドメインへは今後 max-age で指定した秒数の間、必ずHTTPSで接続せよ」と指示する仕組みです。一度ブラウザがこのヘッダーを受け取ると、ユーザーが `http://` でURLを打ち込んでも自動的に `https://` に切り替えてからリクエストを送ります。
プレビューURLを `http://` で誰かに送ってしまっても、受け取った相手のブラウザがすでにそのドメインのHSTSを記憶していればHTTPSにリダイレクトされます。逆に、HSTSを記憶していない相手は最初の一回だけHTTPで接続してしまう「初回接続の脆弱性」が残ります。
- 相手がログインなしで開ける状態か確認する
- PCとスマホで最低1回ずつ表示を確認する
- 内部情報・個人情報・不要な外部送信が残っていないか見る
- レビュー期限と修正時の差し替え方を決めておく
HTML共有で関係する場面
ギガサイト便のような共有サービスがHSTSを設定している場合、発行されたプレビューURLは常にHTTPSで配信されます。共有URLをメールやSlackに貼る際に誤って `http://` で書いても、ブラウザがHSTSキャッシュを持っていれば自動でHTTPSに切り替わります。一方、会社のプロキシ環境やVPN経由ではHTTPSへのリダイレクトが意図通りに動かない場合もあるため、共有先の環境も確認しておくと安心です。
AI生成サイトを独自ドメインで公開する場合、CloudflareやAWSなどのCDN側でHSTSを有効にすることが推奨されます。設定は管理画面から「HSTS」を ON にするだけで完了するものが多いですが、`includeSubDomains` オプションを有効にするとサブドメイン全体に適用されるため、HTTPのサブドメインを使っているサービスがある場合は注意が必要です。
よくある誤解
「HSTSを設定したから証明書は何でもいい」という誤解があります。HSTSはHTTPSへの強制切り替えを担うだけで、証明書の有効性は別に検証されます。証明書が期限切れや自己署名の場合、HSTSが有効でもブラウザはアクセスをブロックするため、証明書管理は引き続き必要です。
「HSTS を一度設定したら簡単に外せる」と思われることもありますが、max-age が長い場合(例: 1年)、ヘッダーを削除しても既存のブラウザキャッシュが残り続けます。誤って設定した場合、max-age をゼロにしたヘッダーを一定期間送り続けることでブラウザのキャッシュが失効するのを待つしか方法がなく、その間HTTPへのフォールバックができません。
安全に使うための注意点
共有サービスを利用する場合、サービス側がHSTSを設定しているかどうかはブラウザの開発者ツールで確認できます。レスポンスヘッダーに `Strict-Transport-Security` が含まれていれば有効です。max-age の値も確認し、共有予定期間中にキャッシュが失効しないかをチェックしてください。
独自ドメインで初めてHSTSを設定する際は、max-age を短い値(例: 300秒)から始め、問題がないことを確認してから1年(31536000秒)等の長い値に変更するのが安全なアプローチです。特にHTTPに戻す可能性がある開発段階のプレビュー環境に対してHSTSを設定するのは避けましょう。
よくある質問
HSTSのプリロードリストとは何ですか?共有URLに影響しますか?
ブラウザに最初からHSTSを適用するドメインのリストで、Googleが管理しています。共有URLのドメインがプリロードリストに登録されていれば、初回接続時からHTTPSが強制されます。共有サービスが利用するドメインがリストに入っていれば初回脆弱性も解消されます。
HSTSが有効なドメインで誤ってHTTPのURLを共有した場合、受信者のブラウザはどう動きますか?
受信者のブラウザが既にHSTSキャッシュを持っていれば、HTTPのURLを開こうとしても自動でHTTPSに切り替わります。初めてそのドメインにアクセスする場合はHTTPでリクエストが送られますが、サーバー側で301リダイレクトを設定しておけば実質的な影響を最小化できます。
ローカルでテストしたHTMLをHSTSが有効な共有サービスにアップロードしたら、HTTPのAPIが使えなくなりました。原因は?
HSTSが有効でHTTPS配信されるページからHTTPのAPIを呼び出すと「Mixed Content」エラーになりブラウザがブロックします。ローカルのHTTP環境では問題なくても、HTTPS配信に切り替わると同じコードが動かなくなります。API呼び出し先をHTTPSに変更してください。