はじめに
Day14 では、
✅ コントローラを薄く保つ設計
✅ Service / FormRequest に責務を分離
まで進みました。
ここからは 本格的な認証編 に入ります。
今日のゴール
・JWT が「何者か」を言語化できる
・セッション認証との違いが分かる
・JWT の中身(構造)を理解する
・Laravel で JWT を発行する流れを掴む
認証とは何か?まずは整理
認証とは一言で言うと、
「あなたは誰ですか?」を確認する仕組み
Web では主にこの2種類があります。
| 認証方式 | 主な用途 |
|---|---|
| セッション認証 | 従来のWebアプリ |
| トークン認証 | SPA / API |
今回は SPA × API で主流の
👉 JWT 認証 を扱います。
JWT とは?
JWT とは、
JSON Web Token
の略です。
特徴を一言で言うと、
✅ 「ユーザー情報を自分自身に持ったトークン」
✅ サーバが状態を持たない(ステートレス)認証
セッション認証との違い
| 項目 | セッション | JWT |
|---|---|---|
| 認証情報 | サーバに保存 | トークンに内包 |
| スケール | 弱い | 強い |
| SPA | 相性△ | 相性◎ |
| API | 不向き | 最適 |
JWT の中身を分解してみる
JWT は 次に説明する3つのパーツ 構成されています。
① Header
{
"alg": "HS256",
"typ": "JWT"
}
・署名方式
・トークンの種類
② Payload(重要)
{
"user_id": 1,
"email": "test@example.com",
"exp": 1700000000
}
・ユーザー情報
・有効期限(exp)
暗号化ではなく Base64 エンコード
→ 中身は誰でも読める
③ Signature
HMACSHA256(
base64(header) + "." + base64(payload),
SECRET_KEY
)
・改ざん防止用署名
ヘッダーとペイロードがエンコードされ、
シークレットで署名された状態となることにより、信頼できる
これら3つがドットで区切られて連結された情報として渡されます。
xxxxx.yyyyy.zzzzz
JWT 認証の流れ(超重要)
① ログイン(ID/PW)
② サーバが JWT を発行
③ フロントが保存
④ リクエスト時に JWT を送信
⑤ サーバが検証
図にすると:
[React]
↓ ログイン
[Laravel]
↓ JWT発行
[React](保存)
↓ Authorization: Bearer xxx
[Laravel]
Laravel で JWT を発行する流れ(概念)
※ 実装詳細は Day16 でやります。
今日は 全体像の理解 が目的です。
① ログイン API
public function login(Request $request)
{
// 認証チェック
if (!$token = auth()->attempt($request->only('email', 'password'))) {
return response()->json([
'status' => 'error',
'message' => '認証失敗'
], 401);
}
return response()->json([
'status' => 'success',
'token' => $token
]);
}
② フロント側で保存
localStorage.setItem('token', token);
③ API リクエスト時に送信
fetch('/api/posts', {
headers: {
Authorization: `Bearer ${token}`
}
});
JWT で必ず理解すべき注意点
JWT は安全ではない?
❌ 中身は誰でも読める
⭕ 改ざんできない
→ 機密情報は入れない
→ ID・メール程度に留める
永遠に有効な JWT は危険
"exp": 9999999999
→ ❌ セキュリティ事故
✅ 有効期限を必ず設定する
localStorage 保存は危険?
・XSS に弱い
・だが SPA では現実的選択肢
※ Cookie 認証との比較は Day16 で解説
JWT が使われる理由まとめ
・SPA と相性が良い
・サーバが軽い
・API 設計に向いている
・モバイルアプリとも共通化できる
今日のまとめ
・JWT はトークン認証の代表格
・セッション認証とは思想が違う
・JWT は Header / Payload / Signature の3部構成
・中身は読めるが改ざんできない
・SPA × API ではほぼ必須の知識
次回 Day16
次は実装編です。
Day16 — Bearer Token と Cookie 認証の比較&LaravelでJWT認証を実装する
ここから
👉 ログインできる API
になります。