API Rate Limiting의 개념과 주요 전략은 무엇인가요?
한 줄 답변
Rate Limiting은 정해진 시간 내 요청 횟수를 제한해 시스템 과부하를 방지합니다. 주로 Redis와 Token Bucket을 활용해 버스트 트래픽에 대응하며 서비스 가용성을 안정적으로 유지합니다.
핵심 개념 정리
API Rate Limiting은 서비스의 가용성을 유지하고 DoS 공격이나 비정상적인 트래픽 폭주로부터 시스템을 보호하기 위한 필수적인 설계 요소입니다. 클라이언트가 정해진 임계치 이상의 요청을 보내면 429 Too Many Requests 응답을 반환하여 서버 자원의 고갈을 막습니다. 이는 단순히 보안 목적뿐만 아니라 써드파티 API 비용 관리나 특정 사용자의 자원 독점을 방지하는 데에도 사용됩니다.
가장 널리 쓰이는 'Token Bucket' 알고리즘은 버킷에 토큰이 있을 때만 요청을 처리하며, 일정한 속도로 토큰이 채워지는 방식입니다. 이 방식은 짧은 시간의 버스트 트래픽을 허용하면서도 장기적인 평균 속도를 제한할 수 있어 매우 유연합니다. 예를 들어 초당 100개의 토큰이 생성되고 버킷 크기가 500이라면, 평소에는 초당 100건을 처리하다가도 순간적으로 500건까지는 수용이 가능합니다.
반면 'Leaky Bucket'은 요청을 큐에 담아 일정한 속도로 처리하는 방식입니다. 버스트 트래픽을 제어하고 일정한 처리 속도를 강제하기에 적합하지만, 큐가 가득 차면 새 요청이 즉시 버려진다는 특징이 있습니다. 이는 인프라 자원이 한정적인 상황에서 네트워크 대역폭이나 데이터베이스 I/O를 일정하게 유지해야 할 때 주로 선택되며, 트래픽 쉐이핑(Traffic Shaping) 용도로도 훌륭합니다.
대규모 분산 환경에서는 개별 서버가 카운트를 관리하면 전체 제한이 부정확해지므로, Redis의 INCR 연산이나 Lua Script를 활용해 중앙 집중식으로 카운트를 관리하는 것이 일반적입니다. 이를 통해 수십 대의 서버 인스턴스가 협력하여 정확한 Rate Limit을 수행할 수 있으며, 사용자 ID나 API Key 기반으로 정밀한 제어가 가능해집니다.
비교 정리
| 항목 | Token Bucket | Leaky Bucket |
|---|---|---|
| 동작 방식 | 토큰이 있으면 즉시 처리 | 큐를 통해 일정 속도 처리 |
| 트래픽 유연성 | 일시적 버스트 트래픽 허용 | 고정된 처리 속도 강제 |
| 주요 장점 | 구현이 간단하고 효율적임 | 메모리 사용량이 예측 가능함 |
| 적합한 사례 | 일반적인 API 제한 서비스 | 트래픽 쉐이핑이 필요한 경우 |
면접에서 이렇게 답하세요
단순히 알고리즘을 설명하는 데 그치지 말고, '분산 환경에서의 동기화 문제'를 언급하세요. Redis를 활용한 글로벌 카운팅 방식과 로컬 캐시를 혼용하는 계층적 제한 전략을 설명하면 높은 점수를 받을 수 있습니다. 또한 제한 임계치를 결정하는 기준(CPU, DB 부하 등)에 대한 실무 고민과 X-RateLimit 헤더를 통한 클라이언트 피드백의 중요성을 덧붙이는 것이 차별화 포인트입니다.
자주 묻는 추가 질문
Q. 분산 환경에서 카운트 정합성 문제를 어떻게 해결하나요?
Redis의 원자적 연산이나 Lua Script를 사용하여 여러 서버 인스턴스 간에 공유되는 카운터를 안전하게 업데이트합니다.
Q. Rate Limit 임계치는 어떻게 설정하는 것이 좋나요?
과거 트래픽 패턴 분석과 부하 테스트를 통해 시스템이 감당 가능한 임계치를 산정하고, 사용자 등급별로 차등 적용합니다.
Q. 클라이언트에게 제한 정보를 어떻게 전달하나요?
X-RateLimit-Limit, Remaining, Reset 같은 커스텀 HTTP 헤더를 통해 현재 상태와 재시도 가능 시간을 알려줍니다.
커뮤니티 하이라이트
“실무에서는 Redis 성능 저하를 막기 위해 Sliding Window Log보다 Fixed Window나 Token Bucket을 선호하게 되더라고요.”
“애플리케이션 계층뿐만 아니라 API Gateway나 Nginx 레벨에서 1차 차단을 해주는 게 서버 자원 보호에 훨씬 유리합니다.”
42명의 개발자가 이 질문에 참여했습니다
관련 면접 질문
앱에서 직접 답변해보세요
매일 3개의 면접 질문에 답변하고,
다른 개발자들의 답변을 비교해보세요.