【Laravel】過剰なアクセスを制限する!レート制限

こんにちは。今回は過剰なアクセスを制限できるレート制限という機能について解説していきます。

設定方法

app/Providers/RouteServiceProviderのconfigureRatelimitingメソッドに設定します。今回は1分につき10回のアクセスを許可する設定を追加してみました。設定を追加するにはRateLimiterのforメソッドを使用します。第一引数は設定の名前です。ここは目的に応じて自由に命名可能です。ファイルのアップロードを制限したいので今回はuploadという名前にしました。第2引数はクロージャの形式で指定します。このクロージャの中に設定を書いていきます。1分間に10回までのアクセスを許可したいのでperMinute(10)とします。

    protected function configureRateLimiting()
    {
		    RateLimiter::for('upload', function (Request $request){
			    return Limit::perMinute(10);
	    	});
    }

上記を設定しただけでは設定は有効になりません。上記で作成した設定を任意のルートに設定する必要があります。api.phpに作成設定してみましょう。作成したレート制限はmiddlewareとして呼び出すことができます。呼び出すmiddlewareはthrottle:[レート制限名]と指定します。先程作成したuploadという名前の設定を適用させるにはthrottle:uploadとします。設定したmiddleware内に定義したルートは、uploadのレート制限が適用されます。

Route::middleware(['throttle:upload'])->group(function(){
	Route::get('/fileUpload', [SampleController::class, 'upload']);
});

レート制限を発生させてみる

実際にブラウザからサイトにアクセスし、レート制限が発生することを確認してみましょう。artisan serveでビルドインサーバーを立ち上げ、ページにアクセスします。ブラウザのリロードを連続で行い、ステータス429 TOO MANY REQUEST(リクエストが多すぎます)が返されれば設定は効いています。

暫く待つと制限が解除されてまた通常通りアクセスできるようになります。

つかいどころ

以下のような用途で使うと良いと思いました。

負荷がかかる処理の利用を制限

比較的負荷がかかる処理を短時間で大量に実行されるとサーバー負荷が高まり、システム全体の反応が遅くなってしまうことがあります。そのような処理を特定し、レート制限をかけておくと予防になります。しかしこの目的でレート制限を書ける場合はユーザーに十分な配慮が必要です。なぜならレート制限が発動している間は機能を使うことができなくなるからです。ユーザーの満足度を下げる可能性があることを念頭に起き、十分に検討することが必要です。

DDoS対策

レート制限は同一IPからという条件をつけることができますので、それを利用してDDoS対策をすることができます。特定のIPから大量のリクエストがあった場合、そのIPのみ制限をかけることができます。うまく利用して対策をしたいところです。

Laravel

Posted by kobainmac