Skip to main content

RateLimiter ファサードの仕組み

Laravelのレート制限は Illuminate\Cache\RateLimiting\Limit クラスと RateLimiter ファサードで構成されています。内部的にはキャッシュドライバー(デフォルトはファイルまたはRedis)にカウンターを保存し、リクエスト数を追跡します。 throttle ミドルウェアが受け取ったリクエストに対して RateLimiter::for() で定義したクロージャを実行し、制限に達していれば 429 Too Many Requests を返します。

AppServiceProvider でのカスタムリミッター定義

レート制限の設定は App\Providers\AppServiceProviderboot() メソッドで行います。
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.phpthrottleWithRedis() を呼び出します。
これにより throttle ミドルウェアが ThrottleRequestsWithRedis クラスにマッピングされ、Redisのアトミック操作を使って正確なカウントが行われます。
throttleWithRedis() を使う場合は必ずRedisが利用可能な状態にしてください。Redisへの接続が失敗すると、リクエストがすべて拒否される可能性があります。

Redisを使う利点

  • 水平スケーリング対応 — 複数のサーバーインスタンス間でカウンターを共有できる
  • 高精度 — アトミック操作でレースコンディションを防ぐ
  • TTL管理 — Redisのネイティブな有効期限機能でカウンターを自動削除

関連ページ

キャッシュ

Redisを含むLaravelのキャッシュドライバーの設定と使い方を確認します。
最終更新日 2026年3月29日