Nest.js Rate Limiting 설정

Rate Limiting 이란

`Rate Limiting`(레이트 제한)은 서비스에 들어오는 요청의 수나 특정 리소스의 사용량을 제한하는 기술적 접근 방식입니다. 이는 다양한 이유로 사용되며, 주로 서버가 과부하 상태에 빠지지 않게 하거나 악의적인 공격(예: DDoS 공격)을 방어하는 데에 쓰입니다.

`Rate Limiting`은 일반적으로 다음과 같은 방식으로 구현됩니다.

  1. `IP 기반`: 하나의 `IP` 주소로부터 일정 시간 동안 허용되는 요청의 수를 제한합니다.
  2. `사용자/토큰 기반`: 인증된 사용자나 `API` 토큰을 사용해 일정 시간 동안 허용되는 요청의 수를 제한합니다.
  3. `Endpoint 기반`: `API`의 특정 엔드포인트에 대한 요청 수를 제한합니다.
  4. `리소스 기반`: 업로드 사이즈나 다운로드 사이즈와 같은 특정 리소스 사용량을 제한합니다.
  5. `시간 기반`: 일정 시간(예: 초, 분, 시간 등) 동안 특정 수의 요청만을 허용합니다.

이러한 제한은 `HTTP` 헤더를 통해 클라이언트에게 알릴 수 있고, 일반적으로 `429 Too Many Requests`와 같은 HTTP 상태 코드로 응답합니다. 그 외에도 `Retry-After` 헤더를 사용하여 클라이언트에게 다음 요청을 언제 보낼 수 있는지 알릴 수 있습니다.

 

`NestJS`에서는 `ThrottlerModule`을 통해 이러한 레이트 제한을 구현할 수 있습니다. 이 모듈을 사용하면 요청 수, 윈도우 시간, 저장소(예: 메모리, Redis 등)와 같은 다양한 옵션을 설정할 수 있습니다.

 

`Rate Limiting`은 기능과 성능, 그리고 보안 사이의 균형을 맞춰야 하므로 적절히 설정되어야 합니다. 너무 엄격하게 설정하면 사용성이 떨어질 수 있고, 너무 느슨하게 설정하면 서버에 과부하가 올 수 있습니다.

 

그렇다면 이제 어떻게 설정할 수 있는지 알아보도록 하겠습니다. 

 

모듈 설치

`2023/09/30` 기준 `5.0.0` 이 기본적으로 설치가 되고 있는데 `4.2.1` 버젼으로 낮추어 설치 해주시기 바랍니다. 

 npm i @nestjs/throttler

 

App Module 설정

    ThrottlerModule.forRoot({
      ttl: 60, // 기준 시간 '초'
      limit: 10, // 횟수 제한 
    }),

 

`App Module`만 설정 하면 이제 기본적인 `Throttling` 설정이 된 것입니다. 하지만 `Proxy` 서버를 통해 서버의 요청을 주고 받으려고 하면 `IP` 기반으로 한 설정이 적용이 되지 않습니다. 그렇기에 `IP`기반으로 설정이 가능토록 `guard`를 적용해주어야 합니다.  

 

Throttler Guard 작성

@Injectable()
export class ThrottlerBehindProxyGuard extends ThrottlerGuard {
  protected getTracker(req: Record<string, any>): string {
    return req.ips.length ? req.ips[0] : req.ip;
  }
}

 

이제 적용하기 원하는 컨트롤러에 가드를 설정해주면 되겠습니다. 

@UseGuards(ThrottlerBehindProxyGuard)

 

Decorator

`Throttler`에서 제공하는 데코레이터가 있습니다. 어떤것이 어떤 기능을 제공하는지 보도록 하겠습니다.

 

`@Throttle`은 설정값을 오버라이드 시킬 수 있는 데코레이터 입니다. 원하는 엔드포인트에 직접 지정 해주면 해당 엔드포인트만 다른 값의 설정을 지정 할 수 있습니다. 

@Throttle(3, 60)

 

`@SkipThrottle` 적용된 엔드포인트에는 `Throttle` 지정을 하지 않는 데코레이터 입니다. 

@SkipThrottle()

'Backend > Nest.js' 카테고리의 다른 글

Nest.js Integration Test 와 Mocking  (1) 2023.10.10
Nest.js mongodb-memory-server, cache 적용  (1) 2023.10.05
Nest.js Swagger 보안 설정  (0) 2023.09.30
Nest.js bcrypt (hashing)  (0) 2023.09.27
Nest.js Module  (0) 2023.09.26