結論(Cookie・セッション管理)
Cookie・セッション管理の診断では、サーバーが発行するCookieにSecure・HttpOnly・SameSiteが付いているか、接頭辞・Domain範囲・有効期間・サイズが適切か、ログイン画面などに Cache-Control: no-store が付いているか、セッションIDをURLに含めていないかを確かめます。最初に確認するのは、×判定になり得る重要(high)の7項目です。
Cookie・セッション管理の診断項目一覧(12項目)
セッションCookieの属性や、セッションIDの扱いを確認します。各項目名から、意味・診断基準・リスク・具体的な対策を解説したページへ移動できます。
| No. | 診断項目 | 重大度 | 概要 |
|---|---|---|---|
| 31 | 機密ページのキャッシュ制御 | high | 機密ページのキャッシュ制御は、ログイン画面などの応答にCache-Control: no-storeを付け、ブラウザや共有キャッシュに保存させない対策です。 |
| 35 | CookieのSecure属性 | high | CookieのSecure属性は、CookieをHTTPSの通信でだけ送信させる属性です。 |
| 36 | CookieのHttpOnly属性 | high | CookieのHttpOnly属性は、JavaScriptからdocument.cookieでCookieを読めなくする属性です。 |
| 37 | CookieのSameSite属性 | medium | CookieのSameSite属性は、別サイトから始まったリクエストにCookieを送るかを決める属性です。 |
| 38 | SameSite=NoneとSecureの組み合わせ | high | SameSite=NoneとSecureの組み合わせは、クロスサイト用Cookieの必須条件です。 |
| 39 | Cookieの有効期間が過度に長くない | medium | Cookieの有効期間が過度に長くないかは、Max-AgeやExpiresが1年を超えていないかで確認します。 |
| 87 | CookieのDomain/Path範囲 | medium | CookieのDomain/Path範囲は、Cookieが送られるホストとパスの範囲です。 |
| 88 | Cookie接頭辞の要件 | high | Cookie接頭辞の要件とは、__Host-と__Secure-で始まるCookieがブラウザに保存される条件です。 |
| 89 | Partitioned Cookieの要件 | medium | Partitioned Cookieの要件は「必ずSecure属性と一緒に指定する」ことです。 |
| 90 | Cookie名・値のサイズ上限 | medium | Cookie名・値のサイズ上限は「名前+値の合計4096バイト」です。 |
| 98 | 認証関連ページのno-store | high | 認証関連ページのno-storeは、巡回した下層ページからログイン・管理画面・マイページを見つけ、すべてにCache-Control: no-storeが付いているかを確かめる項… |
| 123 | セッションIDをURLへ含めていない | high | セッションIDをURLへ含めていないかを確認する方法を解説。 |
Cookie・セッション管理の診断とは
Cookie・セッション管理の診断は、Webサイトが発行するCookieと、ログイン状態を示すセッションIDが、盗まれたり悪用されたりしにくい形で扱われているかを確かめるものです。セキュリティ診断127項目のうち、Cookieの属性、セッションIDの受け渡し方、ログイン画面などのキャッシュ制御に関する12項目がこの分類に入ります。
Cookieは、サーバーが Set-Cookie ヘッダーでブラウザに保存させる小さなデータです。ログインセッションでは、ランダムなセッションIDをCookieに入れて「ログイン済みの本人」であることを示します。このIDは合い鍵のようなもので、第三者に知られると、その人になりすましてログイン状態を乗っ取られるおそれがあります。
そこでCookieには、送信先や読み取りを制限する属性を付けます。Secure属性はHTTPSのリクエストにだけ送らせ、HttpOnly属性はJavaScriptからの読み取りを禁じ、SameSite属性は別サイトから始まったリクエストに付けて送るかを決めます。加えて、Domain属性による送信範囲、有効期間、__Host- などの接頭辞、サイズの上限にも守るべき条件があります。
さらに、セッションIDのURLへの混入や、ログイン画面などの応答のキャッシュといったセッションの周辺も、この分類で確認します。
なお、Cookie属性の各項目が観測するのはサーバーの Set-Cookie ヘッダーだけで、JavaScriptの document.cookie で設定されるCookieは対象外です。また、Cookieを1件も発行しないサイトでは、Cookie属性の項目は「対象外」となり、得点計算から除外されます。
12項目の全体像(4つのグループ)
この分類の12項目は、大きく4つのグループに分けて考えると整理しやすくなります。
| グループ | 診断項目 | 確認する内容 |
|---|---|---|
| Cookieの基本属性 | 「CookieのSecure属性」、「CookieのHttpOnly属性」、「CookieのSameSite属性」、「SameSite=NoneとSecureの組み合わせ」 | HTTPSだけで送られるか、JavaScriptから読めないか、クロスサイトの送信範囲が明示されているか、SameSite=NoneにSecureが付いているか |
| Cookieの範囲・期限・形式 | 「CookieのDomain/Path範囲」、「Cookieの有効期間が過度に長くない」、「Cookie接頭辞の要件」、「Partitioned Cookieの要件」、「Cookie名・値のサイズ上限」 | サブドメインへ広がっていないか、1年を超える期限がないか、__Secure-・__Host- の条件を満たすか、Partitioned属性にSecureがあるか、名前と値の合計が4096バイト以下か |
| セッションIDの受け渡し | 「セッションIDをURLへ含めていない」 | ?PHPSESSID=… や ;jsessionid=… のように、セッションIDがURLに入っていないか |
| 機密ページのキャッシュ | 「機密ページのキャッシュ制御」、「認証関連ページのno-store」 | ログイン・管理・マイページなどの応答に Cache-Control: no-store が付いているか |
最後のグループの2項目は、どちらも no-store を確認しますが対象が異なります。「機密ページのキャッシュ制御」は入力したURLそのものがログイン・管理・アカウント系のパスのときに評価し、「認証関連ページのno-store」はトップページと巡回で見つかったページのうち /login・/admin・/mypage などのパスで2xxを返したページを評価します。
優先して確認すべき項目
この分類には最重要(critical)の項目はありませんが、重要(high)の7項目は、セッションIDの漏えいやなりすましに直結するため最初に確認します。
- セッションIDをURLへ含めていない:URLに入ったIDは、HTTPSで通信していても履歴・アクセスログ・Referer・URLの共有から漏れ、セッション固定攻撃にも使われます。1件でも見つかれば×です。
- CookieのSecure属性:付いていないCookieは、http:// のURLを開いたときやページにhttp://の画像が混じったときに平文で送られます。1件でもSecureなしなら×です。
- CookieのHttpOnly属性:XSSが起きてもセッションIDを外部へ持ち出されないための保険です。JavaScriptが読む必要のあるCookieもあるため、HttpOnlyなしのCookieは△(要確認)と判定し、セッションIDかどうかの確認を促します。
- SameSite=NoneとSecureの組み合わせ:Secureの無いSameSite=NoneのCookieは改訂版Cookie仕様(rfc6265bis)で無視され、主要ブラウザは保存しません。予約ウィジェットやSSOが動かない原因にもなります。
- Cookie接頭辞の要件:
__Host-はSecure・Path=/・Domain属性なし、__Secure-はSecureが保存の条件です。条件を満たさないCookieは捨てられ、ログインできない不具合を招きます。 - 機密ページのキャッシュ制御と認証関連ページのno-store:no-cache や private では保存自体を防げないため、ログイン・管理系の応答には no-store が必要です。
次に「中(medium)」の項目として、SameSite属性の明示、Domain属性の扱い、有効期間、Partitioned Cookieの要件、サイズ上限を見直します。SameSiteの未指定や1年を超える有効期間、Domain属性の付与は、公開情報だけでは用途を判断できないため△(要確認)にとどまりますが、セッションCookieであれば必ず直すべき設定です。
直すときの進め方と注意点
Cookieの属性は、付け方を誤るとログインできない、外部連携から戻るとログインが切れる、といった不具合につながります。次の順で進めると安全です。
- 先にサイト全体をHTTPS化する:Secure付きCookieはHTTPSの接続でしか設定・送信できません。HTTPのページが残っていると、そこではログインできなくなるため、HTTP→HTTPSの恒久リダイレクトとHSTSを先に整えます。
- セッションCookieを基準の形にそろえる:推奨形は
__Host-接頭辞を使い、Path=/・Secure・HttpOnly・SameSite=Lax を付け、Domain属性を出さない形です。PHPでは session.cookie_secure を有効にし、session.cookie_domain を空にします。Cookie名を変えると既存のログイン中セッションは引き継がれないため、利用の少ない時間帯に切り替えて周知します。 - URLでのセッションIDの受け渡しを止める:PHPは session.use_only_cookies = 1・session.use_trans_sid = 0 とし、ログイン成功時に session_regenerate_id(true) でIDを再発行します。
- SameSiteの値は用途ごとに決める:外部の決済代行やSSOからPOSTで戻る画面では、Laxだとセッションが送られずログインが切れることがあります。必要なCookieだけ SameSite=None; Secure にするなど個別に設定し、テスト環境で必ず確認します。
- 有効期間とサイズを見直す:セッションIDは期限を付けないセッションCookieにして、サーバー側のタイムアウトで管理します。Cookieにはランダムな識別子だけを入れ、データ本体はサーバー側に置きます。
- no-store は認証系のパスに限定する:サイト全体に付けると表示速度の低下やCDNの効果の喪失を招きます。また、no-store だけでは「戻る」ボタンの表示を完全には防げないため、ログアウト時にセッションCookieを確実に削除します。
自治体・公共機関のサイトで特に注意すること
自治体の公式サイトは、静的なページが中心でCookieを発行しないことも多く、その場合Cookie属性の項目は対象外になります。一方で、電子申請、施設予約、マイページ、外部の予約システムやチャットボットなど、Cookieを使う仕組みは公式サイトの周辺に多くあります。よくある注意点として、次のようなものがあります。
- 図書館・公民館・窓口の共用パソコンや庁内プロキシなど、キャッシュが第三者に見える環境が多く、ログイン画面やマイページの no-store が欠かせません。
- 部署ごとにサブドメインを運用し、Cookieの Domain 属性でログイン状態を共有していると、ほかのサブドメインにもセッションCookieが送られます。共有の仕組みをサーバー間連携へ移してから Domain 属性を外します。
- 外部の予約ウィジェットやSSOを埋め込むと、SameSite=None や Partitioned 属性が必要になることがあります。その場合は Secure の併記が必須です。
- Cookieを無効にした端末ではCookie専用のセッションでログインできなくなるため、利用者向けにCookieを有効にする手順を案内します。
トップページの診断ではログイン後の画面までは評価できません。電子申請や予約システムは、委託先に Set-Cookie の内容とキャッシュ制御を確認し、ブラウザの開発者ツールでCookieの属性を目視確認すると、こうした不備を防ぎやすくなります。
よくある質問(FAQ)
Cookie・セッション管理の診断項目は、どの順番で直せばよいですか?
まず重要(high)の項目として、セッションIDをURLに含めないこと、CookieのSecure属性とHttpOnly属性、SameSite=NoneとSecureの組み合わせ、Cookie接頭辞の要件、ログイン・管理系ページの no-store を整えます。次にSameSiteの明示、Domain属性の削除、有効期間の短縮、Partitioned Cookieの要件、Cookieのサイズ上限(中)を見直します。
Cookie・セッション管理の診断で、Cookieを発行していないサイトはどう判定されますか?
有効なCookieを観測できない場合、Cookie属性の各項目は「対象外」となり、得点計算から除外されます。ただしCookieが無いことを「安全」とはみなさないため、ログインや予約などCookieを発行する画面は手動で確認してください。
Cookie・セッション管理の診断では、JavaScriptで設定したCookieも調べますか?
調べません。Cookie属性の各項目が観測するのはサーバーの Set-Cookie ヘッダーだけで、document.cookie で設定されるアクセス解析などのCookieは対象外です。
Cookie・セッション管理でSecure・HttpOnly・SameSiteはそれぞれ何を防ぎますか?
SecureはCookieをHTTPSのリクエストにだけ送らせ、平文での盗聴を防ぎます。HttpOnlyはJavaScriptからCookieを読めなくし、XSSでセッションIDを持ち出されることを防ぎます。SameSiteは別サイトから始まったリクエストにCookieを送るかを指示し、CSRFの被害を抑えます。役割が異なるため、3つを組み合わせて使います。
Cookie・セッション管理の観点で、ログイン画面には Cache-Control: private を付ければ十分ですか?
十分ではありません。private はプロキシやCDNなどの共有キャッシュへの保存を防ぐだけで、ブラウザの私的キャッシュには保存されます。共用端末で次の利用者に見られるリスクを避けるには、Cache-Control: no-store が必要です。
Cookie・セッション管理の12項目はまとめて確認できますか?
セキュリティAIチェッカーにURLを入力すると、この12項目を含む127項目を公開情報から自動で診断し、項目ごとの判定と改善の優先順位を表示します。