• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

apiLimiter미들웨어가 작동을 안합니다.

22.05.30 03:27 작성 조회수 104

0

보시면 비밀키는 제대로 받고 있습니다. type도 프리미엄인걸 확인할 수 있습니다.

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

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

미들웨어에 free와 premium 미들웨어를 추가합니다.

router.use( async (req, res, next) => {
  const domain = await Domain.findOne({
    where: { host: url.parse(req.get('origin')).host },
  });
  if(domain.type === 'premiun') {
    premiumapiLimiter(req, res, next);
  } else {
    freeapiLimiter(req, res, next);
  }
});

도메인 타입에 따라서 해당 미들웨어를 호출합니다

 

그러나 type이 premium든 free든 항상 free미들웨어가 호출됩니다

 

 

답변 1

답변을 작성해보세요.

0

free미들웨어가 호출되었다는 걸 어떻게 확인하시나요? 지금 free랑 premium이랑 둘 다 1분이라서 구분이 안 될 것 같은데요.

wdhgood123님의 프로필

wdhgood123

질문자

2022.05.30

메세지가 free미들웨어 메세지가 뜹니다

Premium은 최대 100번까지 요청할수있는데 구분이 안되나요?

console.log('type', domain.type) 을 if문 위에 넣어서 제대로 찍히는지 확인해보세요.

wdhgood123님의 프로필

wdhgood123

질문자

2022.05.30

free타입이 찍힙니다.

MySQL 테이블을 확인해봐도 여전히 type은 premium이 들어가 있는데 왜 free타입이 찍히나요?

참고로 if문 오타는 제대로 고쳤습니다

코드에 domain.type을 넣어서 나온 결과도 premium이 뜹니다. 그러나

콘솔 결과는 free가 뜹니다

아래는 코드입니다

router.use( async (req, res, next) => {
  const domain = await Domain.findOne({
    where: { host: url.parse(req.get('origin')).host },
  });
  if(domain.type === 'free') {
    console.log('type', domain.type);
    freeapiLimiter(req, res, next);
  } else {
    console.log('type', domain.type);
    premiumapiLimiter(req, res, next);
  }
});

그러면 host를 콘솔로그찍어보세요.

wdhgood123님의 프로필

wdhgood123

질문자

2022.05.31

const domain = await Domain.findOne({
    where: { host: url.parse(req.get('origin')).host },
});

host는 항상 http://localhost:4000아닌가요?

이부분은 교재에 있는 코드지만 왜 쓰였는지 잘 모르겠습니다. 사실 저 코드를 쓰면 가장 첫번째 domain모델이 나오며 그 모델은 type이 free입니다.

클라이언트 비밀키를 콘솔로 찍어보니 첫번째 비밀키가 나옵니다

host는 항상  http://localhost:4000이었습니다

 

wdhgood123님의 프로필

wdhgood123

질문자

2022.05.31

const { clientSecret } = req.body;
  const domain = await Domain.findOne({
    where: { clientSecret },
});

이렇게 바꿔서 해결하였습니다

clientSecret만으로 찾으면 안 되는게 시크릿이 노출될 경우 인증이되어버리기 때문입니다. 호스트로 찾을 때 왜 첫번째 등록한 도메인이 나오는지를 찾으셔야 합니다.

wdhgood123님의 프로필

wdhgood123

질문자

2022.06.01

첫번째로 등록한 도메인이 나오는 이유는 알고 있습니다.

보시다시피 domain모델에 host가 모두 localhost:4000이기 때문입니다.

그렇기에 찾을 때 항상 첫번째 도메인이 나오는 것입니다.

문제 오류는 해결했습니다.

아마 등록할 때 host가 같은경우 이전에 등록된 호스트를 지우면 깔끔한 코드가 나올것 같습니다.

host와 clientSecret 모두로 찾으면 됩니다. 이전 호스트를 지워서는 안 됩니다. host는 중복되어도 되어서요.

wdhgood123님의 프로필

wdhgood123

질문자

2022.06.01

 

const domain = await Domain.findOne({
      where: { host: req.body.host},
    })
    if(domain) {
      await Domain.destroy({ where: { host: req.body.host} });
  }

도메인 등록하기 전에 이 코드를 넣으니 해결 되었습니다.

 

이전 호스트를 지우면 안 됩니다. 여러 사람이 같은 로컬호스트를 쓸 수도 있어서요.

wdhgood123님의 프로필

wdhgood123

질문자

2022.06.02

음 이해했습니다. 감사합니다