目的
特定の画面やAPIへのHTTPリクエストにレート制限を設けたい。
より具体的に言うと、ログインAPIにリクエストできるのは、IPアドレス1個につき1分間に3回までとし、
それを超えたらHTTPレスポンスコード429を返すようにしたい。
編集するファイル
- app/Providers/RouteServiceProvider.php
- routes/web.php
RouteServiceProvider.php
public function boot(): void
{
RateLimiter::for('login', function(Request $request) {
return Limit::perMinute(3)->by($request->ip());
});
}
web.php
// 認証済みでない場合。
Route::group([
'middleware' => 'guest',
'controller' => LoginController::class
], function () {
// ログイン画面。
Route::get('/login', 'showLogin')->name('login');
// ログインAPI。
Route::post('/auth', 'auth')->name('auth')
->middleware('throttle:login');
});
確認
これでログインAPIへ1分間に4回アクセスすると、429のHTTPレスポンスコードが返ってくる。
1分間経過後、再度ログインAPIへアクセスできるようになる。
後はパスワードの長さを適切なものにしたりすれば、
ブルートフォースアタック対策としてはこれで十分だと思っています。
HTTPレスポンスヘッダの下記項目を確認しても良い
- X-Ratelimit-Limitレート制限がかからないリクエスト数。(この値を超えるとレート制限がかかる)
- X-Ratelimit-Remainingレート制限がかかるまでの、残りリクエスト数。(この値が0になるとレート制限がかかっている)