inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

API 사용량 제한하기

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

281

김창훈

작성한 질문수 14

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횟수에 영향을 받게 되지않나요?

 

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

node.js mysql mongodb express typescript socket.io jwt

답변 2

0

제로초(조현영)

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

0

인프런 AI 인턴

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

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

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

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

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

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

0

김창훈

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


limiter(req,res,next);

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

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

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

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

깃헙 질문

0

79

2

강의 1-1 수업노트의 로드맵 링크가 작동하지 않습니다.

0

74

1

aws - lightsail 이용 관련

0

56

1

4강 http 서버 만들때 ESM방식으로 해도 될까요?

0

78

2

모듈 사용 시 단점이 있나요?

0

78

1

node.js 버전 및 typescript 적용 문의

0

91

2

12.7. 방장기능(강퇴) 질문드립니다.

0

78

2

12.7 socket.js코드 그대로 뱃겨서 했는데, socket.request.session.color가안나오네요

0

67

1

12.7 코드 그대로 뱃겨서 햇는데 스샷같이 오류가뜹니다.

0

73

2

12.7.1스스로 해보기 질문되나요

0

89

3

시퀄라이즈 실습하기 질문드립니다.

0

186

9

<7-5. 시퀄라이즈 사용하기>수업 질문 드립니다.

0

94

2

크롬에서 user id를 인풋에 입력하고 등록하면 404 에러처리 페이지가 뜹니다.

0

109

2

구매 결제관련 질문입니다 !

0

120

1

다수의 supertest 가 실행될 때 force:true로 인한 DB 초기화 문제

0

130

2

node 설치 방법이 전혀다르게 바뀐것 같습니다.

0

147

2

12강 깃허브에 있는 12.7 chat.html 복붙했는데 css오류

0

119

2

무료/프리미엄 동시 소유 시 질문

0

113

1

비주얼 스튜디오 코드로 계속 진행해도 괜찮을까요?

0

133

2

10강 cors에러 localhost:4000으로 접속했을때 에러

1

155

2

webstorm 해결할 수 없는 변수 문제

0

152

2

혹시 몽고DB 쓸거면 MySQL 강의 스킵해도 되나요?

0

146

2

LightSail 실행 중 오류 질문드립니다!

0

198

2

RedisStore 사용법 질문

0

129

2