はじめに
Day17 では、
✅ CSRF 攻撃の仕組み
✅ なぜ JWT(API) では CSRF が不要なのか
を理解しました。
しかし、API セキュリティには もう一つ大きな穴 があります。
❓「同じ API を 1 秒に 1 万回叩かれたらどうなる?」
今日はこれを防ぐ
👉 Rate Limit(レート制限)
を扱います。
今日のゴール
・Rate Limit が必要な理由を説明できる
・Laravel の Rate Limit 仕組みを理解する
・API にアクセス制限を実装できる
・429 エラーの意味が分かる
Rate Limit とは?
Rate Limit とは、
一定時間内に許可するリクエスト回数を制限する仕組み
目的は主にこの3つ。
・サーバ負荷対策
・不正アクセス防止
・API の公平利用
Rate Limit が無いと起きること
・ブルートフォース攻撃
・BOT による連打
・DoS 攻撃の踏み台
・サーバダウン 💥
👉 認証があっても安全ではない
よくある Rate Limit 例
| API | 制限例 |
|---|---|
| ログイン | 5回 / 分 |
| 一般API | 60回 / 分 |
| 検索API | 30回 / 分 |
HTTP ステータスコード 429
Rate Limit に引っかかると返るのがこれ。
429 Too Many Requests
レスポンス例:
{
"message": "Too Many Attempts."
}
Laravel の Rate Limit 仕組み
Laravel では
👉 Throttle ミドルウェア
が用意されています。
基本構文
throttle:回数,分
例:
throttle:60,1
→ 1分間に60回まで
実装①:ルート単位で制限
Route::middleware('throttle:60,1')->group(function () {
Route::get('/posts', ...);
});
実装②:ログインAPIを厳しく制限
Route::post('/login')
->middleware('throttle:5,1');
👉 1分5回まで
ユーザー単位の Rate Limit
Laravel は
IP + ユーザーID
を自動で識別します。
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by(
$request->user()?->id ?: $request->ip()
);
});
Rate Limit を試してみる
1.Postman で API を連打
2.しばらくすると…
429 Too Many Requests
🎉 正常に防御できています
Rate Limit ヘッダーを見る
レスポンスヘッダー:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
Retry-After: 30
👉 フロントで制御可能
フロント側での活用
if (response.status === 429) {
alert('アクセスが集中しています。しばらくお待ちください');
}
よくある設計ミス
❌ 全 API を同じ制限
・ログインも投稿も同じ
→ UX 悪化
❌ 制限が緩すぎる
throttle:10000,1
→ ほぼ意味なし
❌ 制限が厳しすぎる
throttle:3,1
→ 普通の操作で弾かれる
Rate Limit 設計のコツ
・ログイン系は厳しく
・一覧取得は緩め
・書き込み系は中程度
・ユーザー体験も考慮
JWT × Rate Limit の相性
・認証済ユーザー単位で制御
・悪質ユーザーを局所的に遮断
・API 全体が安定する
今日のまとめ
・Rate Limit は API 防御の必須要素
・429 は正常なエラー
・Laravel は Throttle で簡単実装
・ルートごとに制限を変える
・認証があっても Rate Limit は必要
次回 Day19
ここから 実践アプリ編 に入ります 🚀
** Day19 — アプリ設計:API仕様書を作ってみよう(エンドポイント一覧)**
「いきなり作らない」
設計から始める API 開発 をやります。