Dev Study
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つの具体例で確認します。

公式ドキュメントで詳しく ↗