• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

api호출 제한이 안되는 질문에서 제로초님이 제공해주신 코드중에서의 질문입니다!

24.04.25 21:46 작성 24.04.25 21:47 수정 조회수 70

0

해당 질문에서 제로초님이

const limiter = rateLimit({
  widowMs: 60 * 1000,
  max: (req, res) => {
    if (req.user?.type === 'premium') { return 10 }
    return 1;
  },
  handler(req, res) {
    res.status(this.statusCode).json({
      code: this.statusCode,
      message: `1분에 ${req.user?.type === 'premium' ? '열' : '한'} 번만 요청 할 수 있습니다...`,
    });
  },
});

exports.apiLimiter = async (req, res, next) => {
  let user;
  if (res.locals.decoded) {
    user = await User.findOne({ where: { id: res.locals.decoded.id } });
  }
  req.user = user;
  limiter(req, res, next);
};

이렇게 주셨는데 여기서 limiter을 상수형태로 참조하게끔하면 그럼 다수의 유저가 호출을 하게 될때

limiter이 같은 함수를 가르키고있어서 다른 유저가 호출한 api횟수에 영향을 받게 되지않나요?

 

강의 너무 잘보고있습니다!

답변 2

·

답변을 작성해보세요.

0

이건 내부적으로 apiLimiter 메모리에 객체로 유저아이디와 해당 api 호출 횟수가 저장되어있습니다. 그래서 하나만 선언해도 개별 유저의 정보를 저장하고있습니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.25

안녕하세요, 인프런 AI 인턴입니다.

김창훈님의 질문에 대해 제로초님께서 제공한 코드와 관련된 비슷한 상황을 찾아본 결과, “10.6 재질문…!” 게시글에서 유사한 상황이 논의되었습니다. 이 질문에서는 api 호출 제한을 설정하는 미들웨어의 작동 방식에 대한 질문이었고, 한 사용자의 요청이 다른 사용자의 요청에 어떤 영향을 미치는지에 대한 궁금증이 해결되었습니다.

제로초님의 답변에서 확인할 수 있었던 핵심은, limiter가 각 요청마다 별도로 실행되는 콜백 함수 (req, res) => {...}를 받음으로써 제한된 요청 횟수(max)가 각 사용자나 각 조건에 따라 독립적으로 적용된다는 점입니다. 이는 실제로 limiter가 동일한 함수를 참조하더라도 각 요청마다 max에 주어진 함수가 평가되어 해당 요청의 상황에 맞는 요청 제한이 적용된다는 것을 의미합니다.

다수의 유저가 호출을 할 때, rateLimit 미들웨어는 내부적으로 각 요청의 고유한 식별자(여기서는 req.user.id)를 기준으로 요청을 추적하므로, 다른 유저가 호출한 API 횟수에 영향을 받지 않습니다. 각 요청은 리미트 설정을 개별적으로 적용받아 독립적인 제한 내에서 처리됩니다.

조현영님의 답변을 좀 더 자세히 살펴보시면, 다수의 사용자 상황에서도 각 사용자별로 요청 제한을 어떻게 적용할지에 대한 해답을 찾을 수 있습니다. 이런 방식으로, 각각의 사용자가 API를 요청할 때 limiter 설정이 특정 사용자의 요청에만 영향을 미치게 됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김창훈님의 프로필

김창훈

질문자

2024.04.25

네 해당답변과 chatgpt를 통해 여러번 질문해서 알아본결과


limiter(req,res,next);

이것이 ratelimit 미들웨어를 생성하는 생성자의 역할을 하고 때문에 여러 유저가 호출을해도 독립적인 미들웨어에서 활동하게 된다는것을 알 수 있었습니다.

근데 그럼 어쨌든 한 유저가 여러번 api를 호출한다면 원래의 문제처럼 계속해서 ratelimit미들웨어가 새로생성되어 api 호출카운트가 초기화되어야 하지 않나요?

물론 제로초님의 코드를 참고하여 올바르게 작동을하게 구현하는데엔 성공했지만, 이게 왜 문제를 해결할수있게 했는지는 정확히 이해가 되지않습니다..ㅜ

혹시 해결이 가능하게해준 원리를 구체적으로 알수있을까요? ㅜㅜ