結論(HSTSの有効期間)
HSTSの有効期間とは、Strict-Transport-Securityヘッダーのmax-ageで指定する「ブラウザがそのサイトをHTTPS専用として記憶しておく秒数」です。推奨値は1年(31536000秒)以上で、OWASP ASVS 5.0.0やHSTSプリロードの登録要件もこの値を求めています。短すぎると、しばらく訪れなかった利用者のブラウザで記録が切れ、最初の通信が盗聴・改ざんに対して無防備に戻ります。
この記事のポイント
- max-ageの単位は「秒」。1年は31536000、2年は63072000です。
- 推奨値は1年以上(OWASP ASVS 5.0.0 V3.4.1、hstspreload.orgの要件)。
- 訪問間隔が長い自治体サイトほど、短いmax-ageでは保護の切れ目が生じやすくなります。
- いきなり長くせず、5分→1週間→1か月→1年と段階的に延ばすのが安全です。
- セキュリティAIチェッカーは1年以上を○、1年未満を△と判定します。
| 診断項目名 | HSTSの有効期間 |
|---|---|
| 項目ID | transport.hsts-age |
| 分類 | 通信の暗号化(HTTPS・TLS・HSTS) |
| 重大度・配点の重み | 中(medium) 重み 2 |
| 関連する標準・ガイドライン | OWASP ASVS 5.0.0 V3.4.1(L1:HSTSのmax-ageは少なくとも1年)、RFC 6797 §6.1.1(max-ageディレクティブ)、hstspreload.org登録要件(max-age 31536000秒以上)、OWASP WSTG-CONF-07、OWASP HTTP Strict Transport Security Cheat Sheet |
HSTSの有効期間(max-age)とは
HSTSの有効期間とは、HTTPSの応答に付ける Strict-Transport-Security(HSTS)ヘッダーの max-age で指定する値で、ブラウザがそのサイトを「HTTPSでしか接続しないサイト」として記憶しておく秒数です。
Strict-Transport-Security: max-age=31536000
HSTSは、ブラウザが記録を保持している間しか効きません。max-age が短いと、しばらくサイトを訪れなかった利用者のブラウザでは記録が切れ、再び「初回訪問」と同じ無防備な状態に戻ります。このためセキュリティAIチェッカーは、HSTSがあるかどうか(transport.hsts「HSTSが設定されている」)とは別に、有効期間が十分に長いかをこの項目で確認しています。
判定の基準は、OWASP ASVS 5.0.0の要件に合わせた 1年(31,536,000秒)以上 です。
max-ageの値の意味(RFC 6797)
- ブラウザは、HSTSヘッダーを受け取った時点から
max-age秒の間、そのホストを「Known HSTS Host」として記録します(RFC 6797)。 - 期間中にサイトを再訪してヘッダーを受け取るたびに、記録の期限はその時点から更新されます。
max-age=0は記録の削除を意味します(RFC 6797 §6.1.1)。
秒数の早見表
| 期間 | max-ageの値(秒) |
|---|---|
| 5分 | 300 |
| 1日 | 86400 |
| 1週間 | 604800 |
| 30日 | 2592000 |
| 約6か月 | 15768000 |
| 1年 | 31536000 |
| 2年 | 63072000 |
HSTSの有効期間はなぜ1年以上が推奨なのか
訪問間隔の長いサイトほど保護が切れやすい
自治体サイトは、住民が毎日訪れるサイトではありません。税の申告、各種手当の申請、ごみの分別、災害時の情報確認など、数か月から1年に一度しか訪れない利用者が多くいます。max-ageが1か月なら、前回の訪問から1か月以上空いた住民はHSTSの保護を失い、SSL Strip攻撃(HTTPSへの切り替えを妨害して平文の通信に誘導する攻撃)を受けうる状態でアクセスすることになります。
推奨値の根拠(一次情報)
| 出典 | 基準 |
|---|---|
| OWASP ASVS 5.0.0 V3.4.1(L1) | 最大有効期間を少なくとも1年と定めること |
| hstspreload.org(プリロード登録要件) | max-ageは少なくとも31536000秒(1年) |
| OWASP HSTS Cheat Sheet(例) | max-age=63072000(2年)の設定例 |
| MDN(例) | 1年(31536000)および2年(63072000)の例 |
いきなり長くしない理由(段階的に延ばす)
HSTSは一度記録されると、max-ageの期間中はサイト側から取り消しにくい設定です。取り消すには max-age=0 を返し、各ブラウザに再訪してもらう必要があります。HTTPSに対応していないページやサブドメインが残ったまま長いmax-ageを設定すると、そのページは期間中閲覧できなくなります。
hstspreload.orgは、5分 → 1週間 → 1か月と段階的に延ばし、各段階でそのmax-ageの期間が経過するのを待つ方法を勧めています。OWASP Cheat Sheetも、初期導入では24時間程度の短い値で設定ミスを見つけることを勧めています。
HSTSの有効期間についてよくある誤解
- 「長すぎると危険なので短くしておく方が安全」:HTTPS運用が安定していれば、短いmax-ageは保護の切れ目を増やすだけです。危険なのは「HTTPS未対応部分が残ったまま長くする」ことで、値の長さそのものではありません。
- 「max-ageの単位は日」:単位は秒です。
max-age=365は約6分にすぎません。 - 「一度長く設定すれば、ヘッダーを外しても続く」:ブラウザ側の記録は期間中残りますが、新しい利用者や記録が切れた利用者には付与されません。ヘッダーは常に返し続けます。
なお、サブドメインへの適用は「HSTSをサブドメインにも適用」、ブラウザへの事前登録は「HSTS Preload要件」、全ページへの付与は「HSTSを全HTTPS応答へ適用」の各項目で確認します。
HSTSの有効期間の診断基準(セキュリティAIチェッカー)
取得方法
- 入力URLの最終応答(HTTPS)の
Strict-Transport-Securityヘッダーのうち、先頭の1つからmax-ageの値を取り出します。max-age=31536000とmax-age="31536000"(引用符付き)の両方の書式に対応します。 - 評価の前提として「HSTSが設定されている」が○、つまりHTTPS応答に1以上の
max-ageを持つHSTSがある必要があります。
判定条件
| 判定 | 条件 | 得点への影響 |
|---|---|---|
| ○ 問題なし(pass) | max-age ≧ 31,536,000秒(365日) | 重み2を加算 |
| △ 要確認(warn) | 1 ≦ max-age < 31,536,000秒 | 重み2×0.45=0.9点 |
| 対象外(na) | 有効なHSTSがない(ヘッダーなし、max-ageなし、max-age=0、HTTP応答) | 採点から除外(「HSTSが設定されている」で減点済み) |
- 診断結果の根拠欄には、実際の
max-ageの秒数を表示します。 - 1年未満を×ではなく△としているのは、段階導入の途中である可能性が高く、HSTSが「ない」状態よりは明確に安全だからです。
- この項目は、OWASP ASVS 5.0.0のV3(Webフロントエンドセキュリティ)に対応付けています。
自治体サイトでの判定例
| HSTSヘッダー | 期間の目安 | 判定 |
|---|---|---|
max-age=63072000; includeSubDomains | 2年 | ○ |
max-age=31536000 | 1年 | ○ |
max-age=15768000 | 約6か月 | △ |
max-age=2592000 | 30日 | △ |
max-age=300 | 5分(導入試験中) | △ |
max-age=0 | 削除指示 | 対象外(「HSTSが設定されている」が×) |
HSTSの有効期間が短いとどんなリスクがあるか
- 保護の切れ目:max-ageが短いと、訪問間隔の長い住民のブラウザでHSTSの記録が切れ、次回アクセス時の最初のHTTPリクエストが攻撃に対して無防備になります。印刷物の
http://のURLや古いブックマークからのアクセスは、まさにこの状況で発生します。 - SSL Strip攻撃の再成立:記録が切れたブラウザに対しては、公衆無線LANなどで平文の偽ページを表示する攻撃が再び可能になります。
- プリロード登録ができない:max-ageが1年未満では、hstspreload.orgの登録要件を満たしません。
- 長すぎる設定の誤用:逆に、HTTPS未対応の部分が残ったまま長いmax-ageを設定すると、閲覧できないページが長期間残る運用事故につながります。
攻撃シナリオの例(max-age=30日の場合)
- 住民Aは3月の確定申告の時期に市のサイトをHTTPSで閲覧し、ブラウザにHSTSが30日間記録される。
- 半年後、住民Aは駅の無料Wi-Fiから、広報紙に印刷された
http://www.city.example.lg.jp/kosodate/にアクセスする。記録は既に切れている。 - Wi-Fiに潜む攻撃者は、最初のHTTPリクエストへの応答を偽装し、HTTPSへ転送させずに本物そっくりの「手当申請フォーム」を表示する。
- 住民Aは平文の偽フォームに氏名・口座番号を入力してしまう。
max-ageが1年以上であれば、手順2の時点でもHSTSの記録が残っており、ブラウザは通信前にHTTPSへ切り替えるため、手順3は成立しません。
HSTSの有効期間の設定方法(Apache・nginx・IIS・Next.js)
推奨値
- 最終的な値:
max-age=31536000(1年)以上。2年(63072000)も一般的です。
段階的な引き上げ手順
| 段階 | 設定例 | 次の段階へ進む目安 |
|---|---|---|
| 1 | max-age=300 | 主要ページ・フォーム・管理画面の動作を確認できたら |
| 2 | max-age=604800 | 1週間、問い合わせやエラーがなければ |
| 3 | max-age=2592000 | 1か月、問題がなければ |
| 4 | max-age=31536000 | 本番の値。以後は定期診断で維持を確認 |
Apache
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000" env=HTTPS
</IfModule>
nginx
add_header Strict-Transport-Security "max-age=31536000" always;
IIS(10.0 version 1709以降)
<site name="CityWeb">
<hsts enabled="true" max-age="31536000" redirectHttpToHttps="true" />
</site>
URL Rewriteの送信ルールや customHeaders で付与している場合は、値の秒数だけを変更します。
Next.js(Vercel)
Vercelは独自ドメインに既定で max-age=63072000(2年)を付与しています。next.config.js で独自に上書きしている場合は、短い値になっていないか確認します。
headers: [{ key: "Strict-Transport-Security", value: "max-age=63072000; includeSubDomains" }]
CMS・CDN
CDNやクラウドWAFの管理画面でHSTSを設定する場合、max-ageの選択肢が月単位になっていることがあります。「12か月」以上を選びます。
設定後の確認方法
curl -sI https://www.city.example.lg.jp/ | grep -i '^strict-transport-security'
# max-age の値だけ取り出す
curl -sI https://www.city.example.lg.jp/ | grep -i '^strict-transport-security' | grep -oiE 'max-age="?[0-9]+'
設定を変えたら、セキュリティAIチェッカーで再診断し、根拠欄の秒数が31536000以上になっていることを確認します。
サイトを壊さないための注意点
- 引き上げの前に、同じホスト名で配信しているすべてのパス(古いCGI、別システムへのリバースプロキシ、管理画面など)がHTTPSで動くことを確認します。
includeSubDomainsを同時に付けている場合は、max-ageを延ばすとサブドメインへの影響も長期化します。サブドメインの棚卸しを先に終えてください。- 問題が見つかった場合は、ヘッダーを削除するのではなく
max-age=0をHTTPSで返して記録を消してもらい、原因を解消してから再開します。
よくある質問(FAQ)
HSTSのmax-ageは何秒に設定すればよいですか?
本番の値は1年(31536000秒)以上が推奨です。OWASP ASVS 5.0.0 V3.4.1が少なくとも1年を求め、HSTSプリロードの登録要件も31536000秒以上です。2年(63072000秒)も広く使われています。
max-ageの単位は日ですか?
単位は秒です。max-age=365と書くと約6分にしかなりません。1日は86400、30日は2592000、1年は31536000です。
max-ageを長くすると危険ではありませんか?
HTTPSでの運用が安定していれば、長いmax-ageは保護の切れ目を減らすだけです。危険なのは、HTTPSに対応していないページやサブドメインが残ったまま長くすることです。その場合、該当ページが期間中閲覧できなくなります。
HSTSを途中でやめたい場合はどうすればよいですか?
ヘッダーを削除するのではなく、HTTPSでmax-age=0を返します。これはブラウザに記録の削除を指示する値です。ただし、各利用者が再訪してこの応答を受け取るまで記録は残ります。
max-ageが1年未満だと、セキュリティAIチェッカーではどう判定されますか?
1秒以上1年未満は「△ 要確認」(重み2の45%)です。段階導入の途中である可能性が高く、HSTSがない状態よりは安全なため、×ではなく△としています。1年以上で「○ 問題なし」です。
Vercelでサイトを公開している場合も設定が必要ですか?
Vercelは独自ドメインに既定でmax-age=63072000(2年)のHSTSを付与します。next.config.jsなどで独自に上書きしている場合は、短い値になっていないかを確認してください。
この項目を含む127項目を、URLを入れるだけで無料診断します。
参考資料
- OWASP ASVS 5.0.0 V3 Web Frontend Security(V3.4.1)
- RFC 6797 HTTP Strict Transport Security
- HSTS Preload List Submission(hstspreload.org)
- OWASP HTTP Strict Transport Security Cheat Sheet
- MDN Strict-Transport-Security
- OWASP WSTG-CONF-07 Test HTTP Strict Transport Security
- Microsoft Learn「HSTS Settings for a Web Site <hsts>」
- Vercel Docs「Encryption and TLS」