package 설치
npm i @nestjs/throttler
import { ThrottlerModule } from '@nestjs/throttler';
@Module({
imports: [
ThrottlerModule.forRoot([
// 60초동안 최대 요청 개수 10으로 제한
{
ttl: 6000,
limit: 10,
},
]),
...
],
})
export class AppModule {}
}
import { ThrottlerModule } from '@nestjs/throttler';
@Module({
imports: [
ThrottlerModule.forRoot([
// 60초동안 최대 요청 개수 10으로 제한
{
ttl: 6000,
limit: 10,
},
]),
...
],
providers: [
{
provide: APP_GUARD,
useClass: ThrottlerGuard,
},
],
})
export class AppModule {}
}
@SkipThrottle()
를 이용하여 전체 class 또는 단일 route에 Throttel 설정을 비활성화 할 수 있음
import { Controller } from '@nestjs/common';
import { SkipThrottle } from '@nestjs/throttler';
@SkipThrottle()
@Controller('api/user')
export class UserController {}
비활성화한 class에서 특정 route를 비활성 무효 처리 할 수 도 있음
import { Controller } from '@nestjs/common';
import { SkipThrottle } from '@nestjs/throttler';
@SkipThrottle()
@Controller('api/user')
export class UserController {
@SkipThrottle({default: false})
dontSkip(){
return 'Rate Limiting 설정 됨'
}
doSkip(){
return 'Rate Limiting 비활성화 됨'
}
}
@Trottle()
을 이용하여 글로벌로 설정된 limit, ttl 을 재정의하여 특정 class 또는 route에 설정할 수 있음@Throttle({ default: { limit: 3, ttl: 60000 } })
@Get()
findAll() {
return "Custom Rate Limiting 설정";
}
trust proxy
옵션을 확인하고 이를 활성화하세요.X-Forwarded-For
헤더에서 원래 IP 주소를 가져올 수 있으며, getTracker()
메서드를 재정의하여 req.ip
가 아닌 헤더에서 값을 가져올 수 있습니다.src/common/guard/throttler-behind-proxy.guard.ts
import { Injectable } from '@nestjs/common';
import { ThrottlerGuard } from '@nestjs/throttler';
@Injectable()
export class ThrottlerBehindProxyGuard extends ThrottlerGuard {
// proxy 뒤에 서버가 있더라도 실제 클라이언트의 IP를 빼내는 방법
protected getTracker(req: Record<string, any>): Promise<string> {
// 배열이면 첫번째 원소가 클라이언트 IP
return req.ips.length ? req.ips[0] : req.ip;
}
}
import { Controller, UseGuards } from '@nestjs/common';
import { ThrottlerBehindProxyGuard } from 'src/common/guard/throttler-behind-proxy.guard';
@UseGuards(ThrottlerBehindProxyGuard)
@Controller('api/user')
export class UserController {}