redis로 간단한 rate limit 만들기

김지원·2022년 8월 17일
1

redis

목록 보기
2/3

백엔드 개발 상에서 예매나 판매 페이지를 만들 때가 있다.
그 중에서도 여러 트래픽이 존재하는 상황이 발생할 수 있는데 (ex. 아이유 콘서트가 듣기로는 이번에 4만명이 넘게 몰렸다고 한다..)
그 상황이 딱 판매 버튼을 눌러 판매 로직이 실행될 때다.

이 상황에서 사용자는 빠르게 처리하기 위해 판매하기 버튼을 무한클릭하게 될 것이다.
하지만 그렇게 할 때마다 판매 api를 쏘게 된다면...? 대참사가 일어날 것이다..

그래서 간단하게나마 redis로 더블 클릭 방지를 구현해보고자 한다.

1. rate limit 정의

클라이언트가 주어진 시간 내에 너무 많은 요청을 한 경우 에러 처리를 함으로써 디도스 공격이나 보안 공격을 막는 역할
HTTP 서버는 상태 코드 429: Too Many Requests 로 응답할 수 있다.

백엔드 개발을 하다보면 외부 api를 사용하게 될 때가 생각보다 많다.
그때 항상 유의해야되는 점이 rate limit이라고 볼 수 있다.
20 requests per second 이런 문구를 본 적이 있을까?
똑같은 ip로 1초에 20번의 요청을 보내면 api 사용에 제한을 걸어준다는 뜻이다.

하지만 우리는 이런 딮한 rate limit을 걸 필요까지는 없다.

2. 코드 구현해보기

그리고 모듈도 존재한다.

하지만 새로 만들어보는게 또 재미가 있지 않을까싶어 만들어 보았다.

node 기준 코드이다. (ioredis 모듈을 사용하고 있다)

const result = await this.redis.multi().incr(key).expire(key, 10).exec();
const count = result[0][1];

if (count > 1) {
  throw errorHandler(429, 'too many request');
}

이게 전부이다.
정말 간단해보이지만 확실한 효과가 있다.

처음부터 차근차근 말해보자면 key값expire를 이용해 몇 초 유지할 것인지 만들어준 후 increase된 숫자와 limit을 걸 숫자와 비교하여 error를 처리해주는 로직이다.

count와 비교하는 숫자는 자신이 원하는 요청 수를 적어주면 될 것 같다.
그리고 result의 결과값이 배열이라는 것은 ioredis에서 나오는 반환값을 보면 알 수 있을 것이다.

redis의 공식 홈페이지에 나와있는 예시이기 때문에 간단하게 사용하고 싶을 떄 요긴하게 사용할 수 있을 것 같다.

끝!

profile
backend-developer

0개의 댓글