RateLimiter ファサードの仕組み
Laravelのレート制限は Illuminate\Cache\RateLimiting\Limit クラスと RateLimiter ファサードで構成されています。内部的にはキャッシュドライバー(デフォルトはファイルまたはRedis)にカウンターを保存し、リクエスト数を追跡します。
throttle ミドルウェアが受け取ったリクエストに対して RateLimiter::for() で定義したクロージャを実行し、制限に達していれば 429 Too Many Requests を返します。
AppServiceProvider でのカスタムリミッター定義
レート制限の設定は App\Providers\AppServiceProvider の boot() メソッドで行います。
RateLimiter::for() の第1引数はリミッター名で、throttle ミドルウェアから参照する際に使います。第2引数のクロージャは Illuminate\Cache\RateLimiting\Limit インスタンスを返す必要があります。
ユーザー別・IPアドレス別・プランごとのレート制限
認証済みユーザーとゲストで制限を変える
ユーザーのプランに応じた制限
IPアドレスによるグローバル制限
特定のエンドポイントに関係なく、IPアドレス単位でスロットリングします。複数の制限を組み合わせる
配列で返すと、すべての制限が評価されます。いずれかに達した時点で429 を返します。
同じ
by 値を持つ複数の制限を定義する場合は、キーが衝突しないようにプレフィックスを付けてください。throttle ミドルウェアとカスタムリミッター名の指定
throttle ミドルウェアに定義したリミッター名を渡します。
bootstrap/app.php での登録
Laravel 11以降、ミドルウェアは bootstrap/app.php で管理します。
APIルートへの適用例
1
リミッターを定義する
AppServiceProvider に複数のリミッターを定義します。2
ルートにミドルウェアを適用する
レスポンスヘッダー(X-RateLimit-*)の仕組み
throttle ミドルウェアは制限情報をレスポンスヘッダーに自動付与します。
カスタムレスポンスを返す
RateLimiter::attempt() を使った手動チェック
throttle ミドルウェアを使わず、コードの中で任意のタイミングでレート制限を確認したい場合は RateLimiter::attempt() を使います。
試行回数の確認とリセット
ログインスロットリングの例
レスポンスベースのレート制限
特定のレスポンスのみカウントしたい場合はafter() を使います。404レスポンスのみカウントすることでリソース列挙攻撃を防ぐ例:
Redisを使ったレート制限
デフォルトのキャッシュドライバーをRedisに変更するだけで、throttle ミドルウェアも自動的にRedisを使います。
Redisドライバーの設定
throttleWithRedis を使う
Redis専用の最適化されたスロットリングミドルウェアを使うには bootstrap/app.php で throttleWithRedis() を呼び出します。
throttle ミドルウェアが ThrottleRequestsWithRedis クラスにマッピングされ、Redisのアトミック操作を使って正確なカウントが行われます。
Redisを使う利点
- 水平スケーリング対応 — 複数のサーバーインスタンス間でカウンターを共有できる
- 高精度 — アトミック操作でレースコンディションを防ぐ
- TTL管理 — Redisのネイティブな有効期限機能でカウンターを自動削除
関連ページ
キャッシュ
Redisを含むLaravelのキャッシュドライバーの設定と使い方を確認します。