コンテンツにスキップ

ブラウザがクッキーを送信する条件

[質問]

ブラウザがWebサーバーにクッキーを送信するのは、どんな条件が成立したときですか

[回答] Gemini

ブラウザが「よし、このクッキーをサーバーに送ろう」と判断するまでには、いくつかの重要なチェックポイントがあります。単に「同じサイトだから」というわけではなく、属性(属性値)に基づいた厳格なルールがあるんです。

主な条件を整理すると、以下のようになります。


1. ドメイン(Domain)の不一致がないこと

ブラウザは、クッキーを発行したサーバーが指定した Domain 属性 を確認します。

  • 完全一致または後方一致: 例えば、Domain=example.com と設定されている場合、www.example.comapi.example.com へのリクエストでも送信されます。
  • 未指定の場合: クッキーを発行したホストそのもの(例:example.com のみ)に限定されます。

2. パス(Path)が一致していること

Path 属性 で指定された範囲内にリクエスト先のURLが含まれている必要があります。

  • Path=/shop と設定されている場合、/shop/items へのアクセスには送信されますが、/blog へのアクセスには送信されません。

3. 有効期限(Expires / Max-Age)内であること

当然ながら、期限切れのクッキーは削除されるため送信されません。

  • セッションクッキー: ブラウザを閉じると消滅。
  • 永続クッキー: 指定された日時、または秒数が経過するまで保持されます。

4. セキュリティ設定(Secure / HttpOnly)のクリア

通信の安全性に関する条件です。

  • Secure属性: これがついている場合、HTTPS通信 のときしか送信されません。HTTP(暗号化なし)では無視されます。
  • HttpOnly属性: これは「JavaScript(document.cookie)からアクセスできるか」を制御するものなので、ブラウザからサーバーへのHTTPリクエスト送信自体には影響しません。

5. サードパーティ規制(SameSite 属性)

これが現代のブラウザにおいて最も「送信されない」原因になりやすいポイントです。

設定値 内容
Strict 同じサイト内での移動でのみ送信。別サイトのリンクから飛んできた場合は送信されません。
Lax 基本は同じサイトのみ。ただし、別サイトからのリンク(GETリクエスト)などのトップレベルの遷移なら送信されます。(現在のブラウザのデフォルト)
None サイトをまたいでも送信されますが、Secure 属性との併用が必須です。

まとめ:送信のフローチャート

ブラウザ内部では、リクエストのたびに以下のフィルターを通しています。

  1. 有効期限は切れていないか?
  2. リクエスト先のドメインは許可範囲か?
  3. リクエスト先のパスは合致しているか?
  4. HTTPSが必要(Secure)な場合、ちゃんとHTTPSか?
  5. 別のサイトからのリクエスト(SameSite)制限に引っかかっていないか?

これらがすべて「YES」になったとき、初めてHTTPヘッダーの Cookie: name=value としてパケットに乗っかります。

特定のサイトでログイン状態が維持されないなど、具体的なトラブルでお困りですか?もし必要であれば、デベロッパーツールの見方などを解説することも可能です。