전장의 안개 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을 구현할 수 있습니다. 필요한 설정을 적용하여 요청 제한을 관리하고 원하는 액션에 적용할 수 있습니다.