본문 바로가기
Back-end/Node.js

[Node.js] 사용량 제한 구현하기

by 며루치꽃 2021. 6. 14.

전문적인 정보를 다루는 것이 아닌 개인적으로 학습한 내용에 대해

포스팅을 했기 때문에 이점을 감안하여 봐주시면 감사하겠습니다👏

 

인증된 사용자라고 해도 과도하게 API를 사용하면 API 서버에 무리가 갑니다.

따라서 일정 기간 내에 API를 사용할 수 있는 횟수를 제한하여 서버의 트래픽을 줄이는 것이 좋습니다.

또한 한 사람이 새로고침을 여러번 해서 여러번 공격하는 것을 DOS 공격, 여러 사람이 여러번 공격하는 것을 DDOS 공격 등을 대비해야합니다.

일정 시간동안 횟수 제한을 두어 무차별적인 요청을 막을 필요가 있습니다.

 

npm 설치

npm i express-rate-limit

 

express-rate-limit 사용하기

const RateLimit = require('express-rate-limit');

exports.apiLimiter = new RateLimit({
  windowMs: 60 * 1000, // 1분
  max: 10,
  delayMs: 0,
  handler(req, res) {
    res.status(this.statusCode).json({
      code: this.statusCode, // 기본값 429
      message: '1분에 한 번만 요청할 수 있습니다.',
    });
  },
});

apiLimiter 미들웨어를 router에 넣으면 라우터에 사용량 제한이 걸리게 됩니다. 

이 미들웨어의 옵션으로는 windowMs(기준 시간), max(허용횟수), delayMs(호출 간격), handler(제한 초과 시 콜백 함수)

등이 있습니다. 위의 옵션은 1분간 한번 호출하고, 0초 간격을 갖는다는 뜻입니다.

사용량 제한을 초과할 때는 429 상태 코드와 함께 허용량을 초과했다는 응답을 전송합니다.

 

deprecated 미들웨어 사용하기

 

routes / middleware.js

exports.deprecated = (req, res) => {
  res.status(410).json({
    code: 410,
    message: '새로운 버전이 나왔습니다. 새로운 버전을 사용하세요.',
  });
};

deprecated 미들웨어는 사용하면 안 되는 라우터에 붙여줍니다. 410 코드와 함께 새로운 버전을 사용하라는 메시지를 응답합니다. 

 

예를 들어 업데이트가 꼭 필요하여 특정 route에만 적용할 경우 아래와 같이 route 뒤에 deprecated 미들웨어를 장착하는 방식으로 사용하면 됩니다.

const { verifyToken, deprecated } = require('./middlewares');

const router = express.Router();

router.post('/token', deprecated, async (req, res) => {
  const { clientSecret } = req.body;
  try {
    ...
  } catch (error) {
    console.error(error);
    return res.status(500).json({
      code: 500,
      message: '서버 에러',
    });
  }
});

 

업데이트 되어서 이제 사용하지 않은 모든 라우터에 적용될 경우 아래와 같이 제일 위에

route.use(deprecated) 형식으로 공통되는 미들웨어를 장착하면 됩니다.

이 때는 순서에 유의해야합니다.

const { verifyToken, deprecated } = require('./middlewares');
const { Domain, User, Post, Hashtag } = require('../models');

const router = express.Router();

router.use(deprecated); // 모든경우
  • 참고

- zerocho 님의 ' Node.js 교과서'

댓글