LoginSignup
1
0

More than 1 year has passed since last update.

[NestJS]エンドポイントのレート制限方法

Posted at

概要

作成したエンドポイントに対してレート制限をかける機会があったため、その際の手順を説明する。
大まかには以下の手順でレート制限を行う。

  1. NestJS搭載のthrottlerをインストール
  2. ThrottlerModuleとしてModuleファイルに設定(ttl、limitは一度ここで指定)
  3. ThrottlerGuardをグローバルにバインドする(※重要!!)
  4. 最後にthrottler()をコントローラーに適用させてあげる

1. NestJS搭載のthrottlerをインストール

まだインストールされていない場合は、以下でNestJS搭載のレート制限用パッケージをインストールする。

npm i --save @nestjs/throttler

2. ThrottlerModuleとしてModuleファイルに設定(ttl、limitは一度ここで指定)

次にapp.module.tsのimportsにThrottlerModuleを追加。(1つのコントローラーでしか用いない場合は同じ階層のmoduleファイルに記述しても良いかも)

@Module({
	imports: [
	   ThrottlerModule.forRoot({
	      ttl : 3,
	      limit : 15,
	   }),
    ],
})
export class AppModule {}

ttl、limitの説明は以下の通り、
ttl:time to liveの略、単位は秒。
limit:ttlあたりに許容する最大リクエスト数。

ここで設定した値がレート制限のデフォルトの値となる。

3. ThrottlerGuardをグローバルにバインドする(※重要!!)

自分はこの工程を見逃して、うまくレート制限が反映されなかった。
このようにしないとThrottlerGuardがグローバルにバインドされない。

providers: [
   {
     provide: APP_GUARD,
     useClass: ThrottlerGuard,
   },
]

4. 最後にthrottle()をコントローラーに適用させてあげる

レート制限を掛けたいエンドポイントにThrottle()を指定する。
Throttle()のパラメータを指定すると2で記載したttl、limitの値が上書きされる。
このようにしてNestJSではエンドポイントにレート制限をかけることができる。

   @Throttle(3, 60)
   @Get('get-profile')
   @HttpCode(200)
   getProfile(){
      return "Get profile with custom Rate limiting."
   }
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0