네트워크
Rate Limiting
다른 이름: 속도 제한 , API Rate Limiting , Throttling
정의
일정 시간 동안 허용하는 요청 수를 제한해 API 남용을 막고 다운스트림 시스템을 보호하는 기법. Fixed/Sliding Window, Token Bucket, Leaky Bucket 등의 알고리즘으로 구현하며, 초과 시 보통 429 Too Many Requests와 Retry-After 헤더를 반환. Nginx limit_req, API 게이트웨이, 애플리케이션 미들웨어 등 여러 계층에서 적용 가능
상세 설명
기술 스펙
- Fixed Window: 고정 시간 구간마다 카운터 초기화, 구현 간단하지만 경계에서 순간 폭주 가능
- Sliding Window Log/Counter: 최근 시간 구간을 이동시키며 카운트, 더 정확하지만 메모리/연산 비용 증가
- Token Bucket: 일정 속도로 토큰을 채우고 요청마다 소비, 버스트 허용
- Leaky Bucket: 요청을 큐에 넣고 일정한 속도로만 처리, 출력 속도를 균일하게 유지
- 분산 환경: Redis INCR+EXPIRE 또는 Lua 스크립트로 원자적 카운팅
실무 활용
- 공개 API의 요금제별 호출 한도 (예: 분당 100회)
- 로그인/OTP 엔드포인트의 무차별 대입 공격 방지
- 내부 마이크로서비스 간 과부하 방지
- Nginx/API 게이트웨이 계층의 1차 방어선
장점
- 서비스 안정성: 트래픽 폭주로부터 백엔드 보호
- 비용 통제: 과도한 리소스 사용 차단
- 공정성: 사용자/키별 균등한 자원 배분
단점 및 제약
- 분산 환경 동기화 비용: 중앙 스토어(Redis) 의존
- 알고리즘 선택에 따른 트레이드오프: 정확도 vs 메모리/연산
- 클록 스큐, 리셋 시점의 thundering herd 등 엣지 케이스 처리 필요
호환성
Nginx, Envoy, Kong 등 API 게이트웨이 / Redis 기반 커스텀 구현 / Express, Spring 등 미들웨어 라이브러리