api호출 제한이 안되는 질문에서 제로초님이 제공해주신 코드중에서의 질문입니다!
281
작성한 질문수 14
해당 질문에서 제로초님이
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 인턴입니다.
김창훈님의 질문에 대해 제로초님께서 제공한 코드와 관련된 비슷한 상황을 찾아본 결과, “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





