Post

전장의 안개 Rate Limiting

1. traefik 트래픽

https://doc.traefik.io/traefik/middlewares/http/ratelimit/

이렇게 설정해보니 요청을 엄청 많이 보냈을때 404 에러를 보내면서 아이피 자체를 아예 차단해버렸다.

1
2
3
4
5
  - "traefik.http.routers.web.middlewares=ratelimit" # 레이트 리밋 미들웨어 추가
  - "traefik.http.middlewares.ratelimit.ratelimit.average=10"
  - "traefik.http.middlewares.ratelimit.ratelimit.period=1s"
  - "traefik.http.middlewares.ratelimit.ratelimit.burst=10"
  - "traefik.http.middlewares.ratelimit.ratelimit.sourcecriterion.ipstrategy.depth=4"

2. nest.js rate limiting

https://trend21c.tistory.com/2295 https://docs.nestjs.com/security/rate-limiting

https://svrforum.com/svr/822088

Nest.js에서 Rate Limiting을 구현하기 위해서는 nestjs-rate-limiter와 같은 패키지를 사용하거나 미들웨어를 직접 작성할 수 있습니다. 여기에서는 nestjs-rate-limiter 패키지를 사용한 예제를 제공하겠습니다.

먼저 nestjs-rate-limiter 패키지를 설치합니다.

1
npm install nestjs-rate-limiter

Nest.js 애플리케이션 모듈(app.module.ts)에서 RateLimiterModule을 가져와 등록합니다. 여기에서는 전역 Rate Limiting 설정을 구현합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import { Module } from '@nestjs/common';
import { RateLimiterModule, RateLimiterRedisOptions } from 'nestjs-rate-limiter';
import * as redisStore from 'rate-limiter-flexible/lib/RedisStore';
import * as redis from 'ioredis';

@Module({
  imports: [
    RateLimiterModule.forRootAsync({
      useFactory: () => ({
        storeClientFactory: () => {
          return new redisStore({
            client: new redis({
              host: 'localhost', // Redis 호스트
              port: 6379, // Redis 포트
            }),
            redisKeyPrefix: 'ratelimit', // Redis 키 접두사
          });
        },
        limiterOptions: {
          points: 10, // 설정된 주기(예: 60초) 동안의 최대 요청 횟수
          duration: 60, // 주기(초)
        },
      } as RateLimiterRedisOptions),
    }),
  ],
})
export class AppModule {}

위의 코드에서는 Redis를 사용하여 Rate Limiting을 구현하고 있으며, 설정된 주기 동안에 최대 10번의 요청을 허용하도록 설정되어 있습니다.

Rate Limiting을 적용할 컨트롤러나 라우트에 @UseInterceptors(RateLimiterInterceptor)를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
typescript
Copy code
import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { RateLimiterInterceptor } from 'nestjs-rate-limiter';

@Controller('api')
@UseInterceptors(RateLimiterInterceptor) // Rate Limiting 적용
export class ApiController {
  @Get('data')
  getData() {
    return 'API Data';
  }
}

이제 getData 액션에 Rate Limiting이 적용되어 60초 동안 최대 10번의 요청만 허용됩니다.

필요한 경우 컨트롤러 액션 메서드에 적용되는 Rate Limiting 설정을 덮어쓸 수 있습니다. 예를 들어, 특정 액션에 대해 다른 제한을 설정하려면 다음과 같이 설정합니다.

1
2
3
4
5
6
7
8
9
10
11
import { Get } from '@nestjs/common';
import { Throttle } from 'nestjs-rate-limiter';

@Controller('api')
export class ApiController {
  @Get('special')
  @Throttle(5, 60) // 특정 액션에 대한 Rate Limiting 설정
  getSpecialData() {
    return 'Special API Data';
  }
}

이제 getSpecialData 액션은 60초 동안 최대 5번의 요청만 허용합니다.

이와 같이 nestjs-rate-limiter를 사용하여 Nest.js 애플리케이션에 Rate Limiting을 구현할 수 있습니다. 필요한 설정을 적용하여 요청 제한을 관리하고 원하는 액션에 적용할 수 있습니다.

This post is licensed under CC BY 4.0 by the author.