Rate Limiting은 API나 서비스에 대한 요청 수를 시간당 제한해 과부하와 남용을 방지하는 기법이다. DDoS 완화, 공정한 자원 분배, 비용 통제에 활용된다.
고정 윈도우 (Fixed Window)
1분당 100요청 제한:
00:00~01:00: 100개까지 허용
01:00~02:00: 다시 100개 허용
문제: 경계에서 순간 200개 요청 가능
슬라이딩 윈도우 (Sliding Window)
현재 시점 기준 최근 1분간 100개 제한
더 균일한 제한, 구현 복잡
토큰 버킷 (Token Bucket)
초당 10개 토큰 생성, 최대 100개 보관
요청 시 토큰 1개 소비
토큰 없으면 거부 또는 대기
장점: 순간 버스트 허용 가능
python
import redis
import time
r = redis.Redis()
def is_rate_limited(user_id, limit=100, window=60):
key = f"rate:{user_id}:{int(time.time() // window)}"
current = r.incr(key)
if current == 1:
r.expire(key, window)
return current > limit
# 사용
if is_rate_limited("user_123"):
return {"error": "Too Many Requests"}, 429
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 73
X-RateLimit-Reset: 1716003600
HTTP/1.1 429 Too Many Requests
Retry-After: 60
관련 개념
- •API 게이트웨이 — Rate Limiting 적용 지점
- •Redis — Rate Limiting 카운터 저장
- •DDoS — Rate Limiting으로 완화
참고문헌
- •RFC 6585 — Additional HTTP Status Codes (429)