はじめに
ログイン機能を実装していると、必ず登場するこの2つの単語。
・ Cookie
・ Session
でも正直、
・「何が違うの?」
・「どっちがデータを持ってるの?」
・「なぜページ遷移してもログイン状態が保持されるの?」
と、 仕組みが曖昧なまま使っている人がほとんど です。
この記事では、
✅ ブラウザ目線
✅ サーバ目線(Laravel)
✅ 実際に Cookie を発行するミニ実験
を通して、
Cookie と Session の正体を少しでも理解できるよう解説します。
今日のゴール
・Cookie と Session の役割の違いが説明できる
・なぜログイン状態が維持されるのかが分かる
・Laravel で Cookie を発行・取得できる
・セキュリティ設定(HttpOnly / Secure)が理解できる
まず結論:Cookie と Session の役割はこう違う
| 項目 | Cookie | Session |
|---|---|---|
| 保存場所 | ブラウザ | サーバ |
| 中身 | 識別子や設定情報 | ユーザーの状態 |
| セキュリティ | 低め | 高い |
| 主な役割 | 「鍵」 | 「本体データ」 |
Session はサーバにあり、Cookie はその鍵を持っているだけ
これが超重要なポイントです。
ログインの正体を超シンプルに表すと
① ユーザーがログインする
② サーバが Session を作る
③ Session ID を Cookie としてブラウザに保存
④ 次回以降、ブラウザは Cookie を送り続ける
⑤ サーバが「同一ユーザーだ!」と判定できる
つまり、
ログイン状態の正体 = Cookie に保存された Session ID
です。
Cookie とは?
Cookie とは、
ブラウザに保存される小さなデータ
です。
例:
token=abc123
これは
・サイトを閉じても残る
・次のアクセス時に自動で送信される
という特徴があります。
Session とは?
Session は、
サーバ側で管理される「ユーザーの状態」
です。
例としては:
・ログイン中ユーザーID
・カートの中身
・権限情報
などが Session に保存されます。
Cookie と Session の連携図(超重要)
【ブラウザ】
Cookie: session_id=xyz
↓
【サーバ】
Session[xyz] = user_id: 10
ブラウザは
「私は誰か?」は一切知らない
ただ session_id を毎回送っているだけ
本体の情報(user_idなど)は
すべてサーバにある
だから Session は安全 なのです。
ミニ実験:Laravel で Cookie を発行してみる
ここからは、
実際に Cookie を発行して、ブラウザに保存される瞬間を確認 します。
ルートを作成(routes/api.php)
Route::get('/set-cookie', function () {
return response('Cookieセットしました')
->cookie('test_cookie', 'hello', 60);
});
これは
test_cookie=hello
有効期限 60 分
の Cookie を発行します。
ブラウザでアクセス
DevTools → Application → Cookies を確認
すると、
test_cookie = hello
が保存されているのが確認できます。
Cookie はレスポンスヘッダーで保存される
これ重要です(Day4と連動)。
Cookie を Laravel 側で受け取る
次は受信です。
Route::get('/get-cookie', function () {
$cookie = request()->cookie('test_cookie');
return ['cookie' => $cookie];
});
ブラウザでアクセス:
/api/get-cookie
{"cookie":"hello"}
ブラウザは自動で Cookie を送信している
ここが仕組みの本質です。
セキュリティ超重要設定(実務必須)
Cookie には必ず以下の設定を付けます。
HttpOnly(JSから取得できない)
->cookie('token', 'abc123', 60, null, null, false, true);
✅ XSS 攻撃から守れる
✅ JS から document.cookie で見えない
Secure(HTTPS通信のみ)
->cookie('token', 'abc123', 60, null, null, true, true);
✅ 本番では 必須
「Cookie = 危険」と言われる理由
Cookie 自体が危険なのではなく、
・中に 個人情報を直接入れる
・HttpOnly を付けない
・HTTPS で通信しない
こういう 使い方が危険 なのです。
SPA(React + API)時代の Session の立ち位置
一般的な構成では、
・管理画面 → Cookie + Session
・SPA / モバイル → JWT(Day15で解説)
という使い分けが主流です。
それでも、
Session の概念は JWT を理解するための土台
になります。
今日のまとめ
・Cookie は「ブラウザに保存される鍵」
・Session は「サーバに保存される本体データ」
・ログイン状態の正体は「Session ID を入れた Cookie」
・ブラウザは Cookie を毎回自動送信している
・HttpOnly / Secure 設定は実務必須
・Cookie を理解すると認証全体が一気に見える
次回 Day7 は…
「CORS を図で完全理解:なぜ通信がブロックされるのか?」
React × Laravel で一度は詰まるであろう
「赤い CORS エラー」の正体を徹底解説します。