<!--
LLM_CONTEXT:
Lesson 13 / Chapter 1
目的: Cookie / Session / Stateless HTTP の絵を頭に作る
扱わない: session_start (ch02) / setcookie (ch03) / login flow (ch04) / CSRF (ch05) / regenerate_id (ch06)
読み上げ時間目安: 5 分半〜6 分
-->
Cookie / Session / Stateless HTTP
Lesson 13 / Chapter 1
HTTP は本来「忘れっぽい」
[req1] /login?name=taro → サーバー: 「OK ログイン」
[req2] /mypage → サーバー: 「誰だっけ?」
- HTTP は Stateless = リクエストごとにサーバーはまっさら
- 前のリクエストと繋がりを覚えるには 明示的な仕組み が要る
- それが Cookie (ブラウザに置く) と Session (サーバーに置く)
→ Web アプリで「ログイン状態」「カートの中身」を保つには、この 2 つを使う。
Cookie とは
[ブラウザ] [サーバー]
│ │
│ ← Set-Cookie: name=taro ─────────│ ← サーバーが渡す
│ │
│ → Cookie: name=taro ─────────→ │ ← 次回から自動で送る
- サーバーが
Set-Cookie: ヘッダで渡した key=value を ブラウザが保存 する
- 次回からのリクエストで自動で同じ key=value を送ってくる
- PHP からは
$_COOKIE['name'] で読める
- ブラウザ側に保存されるので、ユーザーに改ざんできる ← 重要
Session とは
[ブラウザ] [サーバー]
│ │
│ ← Set-Cookie: PHPSESSID=ABC123 ────────│
│ │
│ $_SESSION = [
│ 'ABC123' => ['name' => 'taro']
│ ]
- サーバー側に 連想配列のデータを保存
- ブラウザには Session ID (合言葉) だけ Cookie で渡す
- 次回ブラウザが Session ID を送ってきたら、サーバーは ID で 該当の連想配列 を引く
- データ本体はサーバー側にあるので、ユーザーに改ざんできない
Cookie と Session の使い分け
|
Cookie |
Session |
| 保存場所 |
ブラウザ |
サーバー |
| 改ざん |
できる |
できない |
| 容量 |
小 (1 つ ≦ 4KB 目安) |
大 (サーバーリソース次第) |
| 用途 |
言語設定・テーマ・「次回ログインを保持」など軽い情報 |
ログイン状態・カート・CSRF トークン |
| PHP からの読み方 |
$_COOKIE['key'] |
$_SESSION['key'] |
→ 「秘密にしたい / 改ざんされたら困る」値は Session。それ以外は Cookie。
Session の仕組み (絵)
1. setcookie PHPSESSID
┌────────────────────────────────┐
│ │
[ブラウザ] [サーバー]
│ │
│ 2. Cookie: PHPSESSID=ABC123 │
│ ──────────────────────────→ │
│ │
│ 3. ID で $_SESSION を引く
│ → { name: 'taro' }
│ │
│ 4. レスポンス本文 │
│ ←────────────────────────── │
- Session ID は 使い捨ての合言葉。中身を見ても何の情報も漏れない
- サーバー側で
$_SESSION をどこに保存するかは設定次第 (ファイル / Redis / DB)
なぜ HttpOnly / Secure / SameSite が要るのか (予告)
| 属性 |
何を防ぐか |
| HttpOnly |
JavaScript から Cookie が読めないようにする (XSS で Session ID を盗まれにくくする) |
| Secure |
HTTPS の通信でしか Cookie を送らない (盗聴対策) |
| SameSite=Lax/Strict |
他サイトからのリクエストに Cookie を乗せない (CSRF 対策) |
→ ch05 で CSRF、ch06 で Session 固定化を扱う。これらは Cookie / Session を使う以上、避けて通れない話。
本格運用は本コースの範囲外だが、「無防備で使うと攻撃される」 ことだけは知っておく。
このチャプターでできるようになること
✅ HTTP が Stateless であると言える
✅ Cookie はブラウザに保存され改ざん可能、Session はサーバーに保存され改ざん不可、と言える
✅ Session ID が Cookie でブラウザとサーバーを紐付けていると絵で説明できる
✅ HttpOnly / Secure / SameSite の役割を 1 行で言える
→ 次の ch02 で、PHP の session_start() と $_SESSION で実際に Session を扱う