モヒカンは正義

プログラマー風林火山で言う「風のエンジニア」になりたい(比較的)若者Webエンジニアの備忘録

Laravelのレートリミットミドルウェアについて調べた

ざっくりまとめ

  • Laravelには任意のエンドポイントに対してレートリミットを行うためのミドルウェアが用意されている
  • 1分当たり10リクエストまで、という感じで制限可能
  • ログイン中ならユーザ、そうでなければIPアドレス単位でカウントされる

レートリミットとは

1分間に10回まで実行してよい、みたいな感じで制限を課すこと。Web APIや高負荷な集計/エクスポート機能といった、必要だがむやみに連打されたくない機能で利用することが多い

Laravelには、レートリミット機能を提供するミドルウェアが標準で用意されている

laravel.com

あんまりドキュメントには情報がないのでコードを追った

参考にしたコードは、Laravel 6.5リリース時点のもの

実装的にはこの辺から: https://github.com/laravel/framework/blob/v6.5.0/src/Illuminate/Routing/Middleware/ThrottleRequests.php

制限の単位

何分当たり何リクエストまで、という感じで指定可能

誰がどのぐらいリクエストしてきたかは内部的にはcacheで管理される

制限を超えると、ステータスコード429を返す

ユーザにこの画面を見せるわけにはいかないので、ちゃんと適切なエラーページを用意してあげよう

使い方

throttle:$何回まで,$何分間のうちに みたいな感じでミドルウェアを指定すれば使える

公式ドキュメントに乗っている下記の例だと、1分間に60回までリクエストを許すという設定になる

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

61回目のリクエストからは 429 Too Many Requests というエラーが表示される

f:id:pinkumohikan:20191113140120p:plain
429 Too Many Requests