← NestJS コース
24. レート制限 — Throttler
レート制限は、一定時間内に受け付けるリクエスト数に上限を設ける仕組みです。NestJS では @nestjs/throttler の ThrottlerModule を AppModule に登録し、ttl(時間枠)と limit(その間に許す回数)を設定します。上限を超えたクライアントには自動で 429 Too Many Requests が返ります。
実務での主目的は、ログインエンドポイントへの総当たり攻撃(ブルートフォース)や、大量リクエストによる DoS の緩和です。とくにパスワードを照合するログイン API は、ハッシュ照合が重いこともあり狙われやすいため、厳しめのレート制限をかけるのが定番です。既習のガードと同じ仕組みで動くため、ThrottlerGuard をグローバルに適用すれば全エンドポイントに一律で効かせられます。
つまずきポイントは、リバースプロキシ越しのクライアント判定です。Throttler は IP 単位で数えますが、ロードバランサやプロキシの背後ではすべて同じ IP に見えてしまうことがあります。実運用では X-Forwarded-For を正しく扱う設定や、認証済みユーザー単位での制限への切り替えを検討します。
サンプルコード(フレームワーク環境が必要なため表示のみ)
import { Module } from "@nestjs/common";
import { APP_GUARD } from "@nestjs/core";
import { ThrottlerModule, ThrottlerGuard } from "@nestjs/throttler";
@Module({
imports: [
// 60秒間に最大10回まで許可。超えると 429 が返る
ThrottlerModule.forRoot([{ ttl: 60000, limit: 10 }]),
],
providers: [
// ガードとして全エンドポイントに一律適用
{ provide: APP_GUARD, useClass: ThrottlerGuard },
],
})
export class AppModule {}
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗