Laravelでのリクエストに対するレート制限

目的

特定の画面や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になるとレート制限がかかっている)

コメント

タイトルとURLをコピーしました