백엔드 개발 상에서 예매나 판매 페이지를 만들 때가 있다.
그 중에서도 여러 트래픽이 존재하는 상황이 발생할 수 있는데 (ex. 아이유 콘서트가 듣기로는 이번에 4만명이 넘게 몰렸다고 한다..)
그 상황이 딱 판매 버튼을 눌러 판매 로직이 실행될 때다.
이 상황에서 사용자는 빠르게 처리하기 위해 판매하기 버튼을 무한클릭하게 될 것이다.
하지만 그렇게 할 때마다 판매 api를 쏘게 된다면...? 대참사가 일어날 것이다..
그래서 간단하게나마 redis로 더블 클릭 방지를 구현해보고자 한다.
클라이언트가 주어진 시간 내에 너무 많은 요청을 한 경우 에러 처리를 함으로써 디도스 공격이나 보안 공격을 막는 역할
HTTP 서버는 상태 코드 429: Too Many Requests 로 응답할 수 있다.
백엔드 개발을 하다보면 외부 api를 사용하게 될 때가 생각보다 많다.
그때 항상 유의해야되는 점이 rate limit이라고 볼 수 있다.
20 requests per second
이런 문구를 본 적이 있을까?
똑같은 ip로 1초에 20번의 요청을 보내면 api 사용에 제한을 걸어준다는 뜻이다.
하지만 우리는 이런 딮한 rate limit을 걸 필요까지는 없다.
그리고 모듈도 존재한다.
하지만 새로 만들어보는게 또 재미가 있지 않을까싶어 만들어 보았다.
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의 공식 홈페이지에 나와있는 예시이기 때문에 간단하게 사용하고 싶을 떄 요긴하게 사용할 수 있을 것 같다.
끝!