레커
Rate limit_nest.js 본문
- Brute Force 공격
인증 정보(사용자 이름과 비밀번호)를 알아내기 위해 공격자가 반복적으로, 체계적으로 매번 다른 사용자 이름과 비밀번호를 입력하는 방식의 공격을 말합니다.
단순하지만 리소스를 많이 소비하는 시행착오 기반의 접근방식으로, 자동화된 툴이나 봇을 이용해 액세스 권한을 획득활 때 까지 대입합니다.
- Rate Limiting
npm i @nestjs/throttler
- app.modules
imports: [
ThrottlerModule.forRoot([{
ttl: 60,
limit: 10
}]),
}),
전역으로 60초 동안 최대 10회로 최대 요청 수를 제한 할 수 있다.
- 특정 라우터만 해제하는 방법
import { Controller } from '@nestjs/common';
import { SkipThrottle } from '@nestjs/throttler';
@SkipThrottle()
@Controller('api/user')
export class UserController {
@SkipThrottle({default: false})
Skip(){
return 'Rate Limiting 다시 설정'
}
doSkip(){
return 'Rate Limiting 해제'
}
}
- Override
@Trottle() 을 이용하여 글로벌로 설정된 limit, ttl 을 재정의하여 특정 class 또는 route에 설정할 수 있다.
@Throttle({ default: { limit: 3, ttl: 60000 } })
@Get()
findAll() {
return "Custom Rate Limiting 설정";
}
- Proxies
// 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 {}
'개발 > TIL' 카테고리의 다른 글
[NestJs] Sentry 를 이용해 Slack에 알림 (0) | 2024.01.26 |
---|---|
Nest.js Passport-kakao (0) | 2024.01.22 |
Interceptor (0) | 2024.01.19 |
CORS (0) | 2024.01.19 |
Container (0) | 2024.01.17 |