はじめに
Day16 では、
✅ JWT(Bearer Token)認証の実装
✅ Authorization ヘッダーでの API 保護
まで到達しました。
ここで多くの人が疑問に思います。
❓「JWT なのに CSRF 対策って必要なの?」
今日はこの疑問を 完全に解消 します。
今日のゴール
・CSRF 攻撃の仕組みを図で説明できる
・なぜ Cookie 認証で問題になるのか理解する
・なぜ JWT(API) では不要と言われるのか分かる
・Laravel の CSRF 防御を説明できる
CSRF とは何か?
CSRF = Cross-Site Request Forgery
日本語にすると、
「ユーザーが意図しないリクエストを勝手に送らせる攻撃」
CSRF 攻撃の基本構造
① ユーザーがログイン中
② 攻撃者サイトにアクセス
③ 自動でリクエスト送信
④ サーバが本人と誤認
イメージ図(文章版)
[ユーザー]
↓ ログイン済み(Cookieあり)
[銀行サイト]
[攻撃サイト]
↓ 勝手にPOST
[銀行サイト] ← Cookie自動送信 😱
なぜ Cookie 認証は危険?
ブラウザは 自動で Cookie を送信 します。
POST /transfer
Cookie: session=xxxxx
👉 ユーザーの操作かどうか区別できない
CSRF 対策の基本思想
「そのリクエストは本当に正規画面から来ましたか?」
これを確認するために
👉 CSRF トークン を使います。
Laravel の CSRF 対策
Laravel は デフォルトで CSRF を防御 しています。
① CSRF トークン発行
<input type="hidden" name="_token" value="xxxxx">
② リクエスト時に検証
VerifyCsrfToken
・トークンが一致しない
→ 419 エラー
JWT 認証なのに CSRF は必要?
結論から言います。
JWT(Bearer Token)認証の API では基本不要
理由はこれ。
Authorization ヘッダーは自動送信されない
Authorization: Bearer xxx
・JavaScript が明示的に設定
・攻撃サイトから勝手に送れない
👉 CSRF 成立しない
じゃあ JWT + Cookie は?
もし JWT を Cookie に保存 すると…
⚠️ CSRF 対象になる
この場合は
👉 CSRF トークンが必要
方式別まとめ
| 認証方式 | CSRF対策 |
|---|---|
| Cookieセッション | 必須 |
| JWT(Authorization) | 不要 |
| JWT(Cookie保存) | 必須 |
Laravel API で CSRF を無効化する理由
API では通常、
・セッションを使わない
・Authorization ヘッダー使用
そのため VerifyCsrfToken を通さない構成が多い。
protected $except = [
'api/*',
];
ただし注意点
CSRF が不要でも
XSS は防ぐ必要がある
・JWT を盗まれると即アウト
・input のエスケープ
・CSP 設定
今日の重要ポイント
・CSRF は Cookie 自動送信が原因
・JWT(API) は手動送信なので安全
・保存場所によって必要対策が変わる
・Laravel はデフォルトで CSRF 防御済み
今日のまとめ
・CSRF は「なりすましリクエスト攻撃」
・Cookie 認証では必須対策
・Authorization ヘッダーは CSRF 対象外
・JWT × API は設計次第で安全
次回 Day18
次は API を守る最後の砦 です。
Day18 — APIのRate Limit(アクセス制限)を実装してみる
「叩き放題 API」を卒業します。