採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

Cookie / Session / Stateless HTTP

テクノロジ系 / session-cookie (session / cookie / login / CSRF)

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 の使い分け

CookieSession
保存場所ブラウザサーバー
改ざんできるできない
容量小 (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 が要るのか (予告)

属性何を防ぐか
HttpOnlyJavaScript から Cookie が読めないようにする (XSS で Session ID を盗まれにくくする)
SecureHTTPS の通信でしか 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 を扱う