• 診断項目 No.6/127
  • 通信の暗号化(HTTPS・TLS・HSTS)
  • 重大度 中(medium)

HSTSの有効期間(max-age)とは?推奨値・段階的な設定方法・診断基準

HSTSの有効期間(max-age)は1年(31536000秒)以上が推奨です。短いと訪問間隔の長い利用者の保護が切れる理由、段階的な延ばし方、Apache・nginx・IISの設定例、診断基準を解説します。

結論(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の有効期間
項目IDtransport.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; includeSubDomains2年○
max-age=315360001年○
max-age=15768000約6か月△
max-age=259200030日△
max-age=3005分(導入試験中)△
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日の場合)

  1. 住民Aは3月の確定申告の時期に市のサイトをHTTPSで閲覧し、ブラウザにHSTSが30日間記録される。
  2. 半年後、住民Aは駅の無料Wi-Fiから、広報紙に印刷された http://www.city.example.lg.jp/kosodate/ にアクセスする。記録は既に切れている。
  3. Wi-Fiに潜む攻撃者は、最初のHTTPリクエストへの応答を偽装し、HTTPSへ転送させずに本物そっくりの「手当申請フォーム」を表示する。
  4. 住民Aは平文の偽フォームに氏名・口座番号を入力してしまう。

max-ageが1年以上であれば、手順2の時点でもHSTSの記録が残っており、ブラウザは通信前にHTTPSへ切り替えるため、手順3は成立しません。

HSTSの有効期間の設定方法(Apache・nginx・IIS・Next.js)

推奨値

  • 最終的な値:max-age=31536000(1年)以上。2年(63072000)も一般的です。

段階的な引き上げ手順

段階設定例次の段階へ進む目安
1max-age=300主要ページ・フォーム・管理画面の動作を確認できたら
2max-age=6048001週間、問い合わせやエラーがなければ
3max-age=25920001か月、問題がなければ
4max-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などで独自に上書きしている場合は、短い値になっていないかを確認してください。

セキュリティAIチェッカーを利用する

この項目を含む127項目を、URLを入れるだけで無料診断します。

参考資料