概要
作成したエンドポイントに対してレート制限をかける機会があったため、その際の手順を説明する。
大まかには以下の手順でレート制限を行う。
- NestJS搭載のthrottlerをインストール
- ThrottlerModuleとしてModuleファイルに設定(ttl、limitは一度ここで指定)
- ThrottlerGuardをグローバルにバインドする(※重要!!)
- 最後に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."
}