ブラウザがクッキーを送信する条件
[質問]
ブラウザがWebサーバーにクッキーを送信するのは、どんな条件が成立したときですか
[回答] Gemini
ブラウザが「よし、このクッキーをサーバーに送ろう」と判断するまでには、いくつかの重要なチェックポイントがあります。単に「同じサイトだから」というわけではなく、属性(属性値)に基づいた厳格なルールがあるんです。
主な条件を整理すると、以下のようになります。
1. ドメイン(Domain)の不一致がないこと
ブラウザは、クッキーを発行したサーバーが指定した Domain 属性 を確認します。
- 完全一致または後方一致: 例えば、
Domain=example.comと設定されている場合、www.example.comやapi.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 属性との併用が必須です。 |
まとめ:送信のフローチャート
ブラウザ内部では、リクエストのたびに以下のフィルターを通しています。
- 有効期限は切れていないか?
- リクエスト先のドメインは許可範囲か?
- リクエスト先のパスは合致しているか?
- HTTPSが必要(Secure)な場合、ちゃんとHTTPSか?
- 別のサイトからのリクエスト(SameSite)制限に引っかかっていないか?
これらがすべて「YES」になったとき、初めてHTTPヘッダーの Cookie: name=value としてパケットに乗っかります。
特定のサイトでログイン状態が維持されないなど、具体的なトラブルでお困りですか?もし必要であれば、デベロッパーツールの見方などを解説することも可能です。