프로덕션용 API 요청 제한 시스템 구축 가이드
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 백엔드 개발자, API 설계자, DevOps 엔지니어
- 중간 수준 이상의 Node.js, Redis 경험자
- API 확장성 및 보안 요구사항을 다루는 개발자
핵심 요약
- Redis 기반 슬라이딩 윈도우 알고리즘을 사용해 요청 제한 구현
createRateLimiter
/createAdvancedRateLimiter
미들웨어로 다중 사용자 계층(프리, 프리미엄, 기업) 지원- X-RateLimit-* 헤더를 통해 클라이언트에게 제한 상태 전달
- Redis Cluster + Circuit Breaker를 통한 고가용성 및 장애 대응
섹션별 세부 요약
1. 요청 제한의 목적
- 악의적 요청 차단 (DDoS 방어)
- 자원 공평 분배 (모든 사용자에 대한 일관된 서비스)
- 성능 유지 (서버 과부하 방지)
- 비용 관리 (BW/컴퓨팅 자원 최적화)
2. 알고리즘 선택
- Fixed Window: 간단하지만 윈도우 경계에서 버스트 발생 가능성
- Sliding Window: Redis Sorted Set 활용으로 정확도 극대화
- Token Bucket/Leaky Bucket: 평균 처리량 유지 및 트래픽 스무딩
3. 기초 구현 (Express + Redis)
- 의존성 설치
"express": "^4.18.2", "redis": "^4.6.5", "dotenv": "^16.0.3"
const client = redis.createClient({ host: process.env.REDIS_HOST });
const pipeline = client.multi();
pipeline.incr(windowKey);
pipeline.expire(windowKey, Math.ceil(windowMs / 1000));
4. 고급 기능 구현
- 사용자 계층 구분
const tiers = {
free: { windowMs: 900000, maxRequests: 100 },
enterprise: { windowMs: 900000, maxRequests: 10000 }
};
pipeline.zremrangebyscore(key, 0, windowStart);
pipeline.zcard(key);
pipeline.zadd(key, now, `${now}-${Math.random()}`);
5. 분석 및 모니터링
- 429 응답 로깅
client.hincrby(analyticsKey, req.ip, 1);
client.expire(analyticsKey, 86400 * 30); // 30일 보관
결론
- Redis Cluster + Circuit Breaker로 고가용성 보장
- 사용자 계층별 동적 제한을 위한
createAdvancedRateLimiter
미들웨어 활용 - X-RateLimit-* 헤더를 통해 클라이언트에게 명확한 제한 상태 전달
- CDN 수준 요청 제한을 병행해 네트워크 계층에서 보호
- 30일 보관 기간의 Redis 분석 키로 트래픽 패턴 분석 가능