...
API 사용량 제한하기
만일 인증된 사용자가 과도한 API 사용을 하게 되면 API 서버에 무리가 갈 수 있다.
또한 DOS공격에도 대비해야 되는데, DOS란 지속적으로 서버에 요청을 과도하게 해서 서버를 망가뜨리는 걸 의미한다.
예를 들어, api요청을 계속 새로고침해서 마구마구 요청하게 되면 그게 DOS공격인 셈이다.
이를 개인이 하지않고 집단이 단체로 하게되면, 한번 쯤 들어본 디도스 공격이 바로 이걸 의미한다.
따라서 일정 기간 내에 API를 사용할 수 있는 횟수를 제한하여 서버의 트래픽을 줄이는 것이 좋다.
거기다 유료/무료 서비스를 운영한다고 하면, 과금 체계별로 횟수에 차이를 둘 수도 있을 것이다. (무료 회원은 100번만, 유료 회원은 1000번 이용가능하게 설정)
이러한 기능은 express-rate-limit 패키지로 간단히 구현이 가능하다.
express-rate-limit 사용법
> npm install express-rate-limit
패키지를 설치해주고 다음 커스텀 미들웨어 함수를 추가해준다.
const RateLimit = require('express-rate-limit');
//* 사용량 제한 미들웨어. 도스 공격 방지
exports.apiLimiter = new RateLimit({
windowMs: 60 * 1000, // 1분 간격
max: 5, // windowMs동안 최대 호출 횟수
handler(req, res) { // 제한 초과 시 콜백 함수
res.status(this.statusCode).json({
code: this.statusCode, // statusCode 기본값은 429
message: '1분에 5번만 요청 할 수 있습니다.',
});
},
});
express-rate-limit으로 apiLimiter 미들웨어를 추가해주었다.
위 설정은 1분에 최대 5번 호출 가능하게 되어있으며, 사용량 제한을 초과하면 429 상태 코드와 함께 허용량을 초과했다는 응답을 전송한다.
이제 이 미들웨어를 라우터에 넣으면 api 요청을 받는 라우터에 사용량 제한이 걸리게 된다.
여기서 조심해야 할 점은, 서버가 재시작되면 사용량이 초기화 된다는 점이다.
따라서 실제 서비스에선 사용량을 저장할 데이터베이스를 따로 마련하는 것이 좋다.
보통 REDIS에 많이 저장하는 편이다.
express-rate-limit 패키지는 데이터베이스와 연결하는 것을 지원하지 않으므로 npm에서 새로운 패키지를 찾아보거나 직접 구현해야 한다.
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.