Laravelのルーティングを見ていると、次のような記述に出会うことがあります。
Route::middleware(['guest', 'throttle:5,1'])->group(function () {
Route::get('/otp', [OtpController::class, 'show'])->name('otp.show');
Route::post('/otp', [OtpController::class, 'verify'])->name('otp.verify');
});
この throttle:5,1 は一見すると意味が分かりにくいですが、Laravelにおけるレート制限の設定です。つまり、一定時間内に許可するリクエスト回数を制御する仕組みです。
throttle:5,1 の意味
throttle の書式は次の通りです。
throttle:回数,時間(分)
したがって、
throttle:5,1
は次の意味になります。
| 項目 | 内容 |
|---|---|
| 5 | 最大リクエスト回数 |
| 1 | 時間(分) |
この設定は、「1分間に最大5回までリクエストを許可する」という制限を表しています。
実際に何が制限されるのか
この設定が付いたルートでは、次のような挙動になります。
対象となるエンドポイント:
GET /otp
POST /otp
制限内容:
- 同一クライアント(通常はIPアドレス単位)
- 1分間に最大5回まで
- それを超えるとエラーが返る
制限を超えた場合は、HTTPステータスコード 429(Too Many Requests)が返されます。
なぜレート制限が必要なのか
この設定は特に認証系の処理で重要になります。OTP(ワンタイムパスワード)を例に考えると分かりやすいです。
攻撃者が次のように総当たりを試みるケースがあります。
123456
123457
123458
...
このようなブルートフォース攻撃に対して、レート制限をかけることで試行回数を制限できます。
この設定では、
1分間に5回しか試せない
ため、攻撃の進行速度を大きく遅らせることができます。
ここで重要なのは、レート制限は攻撃を完全に防ぐものではなく、「現実的な時間内では成功しない状態にする」ための仕組みであるという点です。
内部の仕組み
Laravelでは、このレート制限は次のミドルウェアによって実現されています。
Illuminate\Routing\Middleware\ThrottleRequests
このミドルウェアは、リクエストの回数をカウントし、制限を超えた場合にブロックします。
カウントの単位
デフォルトでは、次のような情報を組み合わせてカウントします。
- IPアドレス
- アクセスしているルート
カウントの保存場所
リクエスト回数はキャッシュに保存されます。
- Redis
- Memcached
- file
つまり内部的には、「どのクライアントが、どのルートに何回アクセスしたか」を一定時間内で記録していることになります。
よくある設定例
用途によってレート制限の値は調整されます。
throttle:5,1 // 1分5回(厳しめ)
throttle:10,1 // 1分10回
throttle:60,1 // 1分60回(APIなど)
ログインやOTPのような認証系では、5回程度に制限するケースがよく見られます。
一方、APIなどではもう少し緩い制限が設定されることが一般的です。
guestミドルウェアとの組み合わせ
今回のコードでは、guest ミドルウェアと組み合わせて使われています。
['guest', 'throttle:5,1']
guest は「ログインしていないユーザーのみアクセス可能」という制約です。
したがって、このルート全体の意味は次のようになります。
- 未ログインユーザーのみアクセス可能
- OTPの試行は1分間に5回まで
実務的な視点での理解
レート制限は単なる回数制御ではなく、アプリケーションの安全性を担保するための重要な仕組みです。
主な目的は次の通りです。
- ブルートフォース攻撃の抑制
- サーバー負荷の制御
- APIの濫用防止
これらはすべて、「過剰なリクエストを制限することで、システムを守る」という共通の考え方に基づいています。
注意点
IPベースの制限の限界
デフォルトではIP単位で制限されますが、以下のようなケースでは注意が必要です。
- 社内ネットワークなどで複数ユーザーが同一IPを使っている
- 攻撃者がIPアドレスを変えてくる
このような場合、意図しない制限や回避が起きる可能性があります。
ユーザー単位での制限
ログイン後の処理では、IPではなくユーザーID単位で制限をかける設計も検討されます。
まとめ
throttle:5,1 は、Laravelのレート制限ミドルウェアの設定であり、「1分間に5回までリクエストを許可する」という意味を持ちます。
押さえておきたいポイント
- throttleはリクエスト回数制限
- 書式は「回数,時間(分)」
- 超過すると429エラー
- セキュリティと負荷制御のために使う
この仕組みを理解しておくと、認証処理やAPI設計において、「どこに制限をかけるべきか」を考える際の基準が明確になります。