일차적으로 인증된 사용자 (토큰을 발급받은 사용자) 만 API를 사용할 수 있게 필터를 두긴 했지만, 아직 충분하지는 않습니다.
인증된 사용자라고 해도 지나치게 API를 사용하면 API 서버에 부하가 갈 수 있습니다.
따라서 일정 기간 내에 API를 사용할 수 있는 횟수를 제한하여 서버의 트래픽을 줄이는 것이 좋습니다.
유료 서비스라면 과금 체계 별로 횟수에 차이를 둘 수도 있습니다.
예를 들면 무료로 이용하는 사람은 1시간에 열 번을 허용하고, 유료로 이용하는 사람은 1시간에 100번을 허용하는 식입니다.
이러한 기능 또한 npm에 패키지로 만들어져 있습니다.
이 기능을 제공하는 express-rate-limit 패키지를 소개합니다.
nodebird-api 서버에 다음 패키지를 설치합시다.
npm install express-rate-limit
verifyToken 미들웨어 아래에 apiLimiter 미들웨어와 deprecated 미들웨어를 추가합니다.
이제 apiLimiter 미들웨어를 라우터에 넣으면 라우터에 사용량 제한이 걸립니다.
이미 미들웨어의 옵션으로는 windowMs (기준 시간), max (허용 횟수), handler (제한 초과 시 콜백 함수) 등이 있습니다.
현재 설정은 1분에 한 번 호출 가능하게 되어있습니다.
사용량 제한을 초과할 때는 429 상태 코드와 함께 허용량을 초과했다는 응답을 전송합니다.
deprecated 미들웨어는 사용하면 안되는 라우터에 붙여줄 것입니다.
410 코드와 함께 새로운 버전을 사용하라는 메시지를 응답합니다.
사용량 제한이 추가되었으므로 기존 API 버전과 호환되지 않습니다.
새로운 v2라우터를 만들어 봅시다.
토큰 유효 기간을 30분으로 늘렸고, 라우터에 사용량 제한 미들웨어를 추가했습니다.
기존 V1 라우터를 사용할 때는 경고 메시지를 띄워 줍니다.
라우터 앞에 deprecated 미들웨어를 추가하여 V1으로 접근한 모든 요청에 deprecated 응답을 보내도록 합니다.
실제 서비스 운영 시에는 V2가 나왔다고 바로 V1을 닫아버리거나 410 에러를 응답하기보다는
일정한 기간을 두고 옮겨가는 것이 좋습니다.
사용자가 변경된 부분을 자신의 코드에 반영할 시간이 필요하기 때문입니다.
노드의 LTS 방식도 참고할 만한 방식입니다.
앞으로 이런 식으로 V3, V4 라우터를 추가하면서 V1, V2와 같은 이전 라우터는 순차적으로 제거하면 됩니다.
새로 만든 라우터를 서버와 연결합니다.
사용자 입장(NodeCat)으로 돌아와서 새로 생긴 버전을 호출해봅시다. 버전만 V1에서 V2로 바꾸면 됩니다
이에 제는 사용량을 초과하는 것을 보여주고자 1분에 한 번으로 사용량을 제한했습니다.
실제 서비스에서는 서비스 정책에 맞게 제한량을 조절하세요.이후 코드에서는 1분에 열 번으로 설정했습니다.
현재 nodebird-api 서버가 재시작되면 사용량이 초기화되므로 실제 서비스에서 사용량을 저장할 데이터베이스를
따로 마련하는 것이 좋습니다. 보통 레디스가 많이 사용됩니다.
단, express-rate-limit 은 데이터베이스와 연결하는 것을 지원하지 않으므로
npm에서 새로운 패키지를 찾아보거나 직접 구현해야합니다.
'clone toy projects > node_express_sns' 카테고리의 다른 글
테스트 준비하기 (0) | 2023.08.25 |
---|---|
CORS 이해하기 (0) | 2023.08.25 |
SNS API 서버 만들기 (0) | 2023.08.25 |
다른 서비스에서 호출하기 (0) | 2023.08.25 |
JWT 토큰으로 인증 하기 (0) | 2023.08.25 |