429 Too Many Requests는 클라이언트가 정해진 시간 안에 너무 많은 요청을 보내 속도 제한(rate limiting)에 걸렸다는 뜻입니다. API 남용·과도한 폴링·봇 트래픽으로부터 서버를 보호하기 위한 코드입니다.
잘 설계된 서버는 응답에 Retry-After 헤더(대기 시간, 초 또는 날짜)와 종종 RateLimit-* 헤더를 함께 실어, 클라이언트가 얼마나 기다렸다 재시도해야 하는지 알려줍니다.
GET /api/search?q=test HTTP/1.1
Host: api.example.com
Authorization: Bearer abc123HTTP/1.1 429 Too Many Requests
Retry-After: 30
RateLimit-Remaining: 0
Content-Type: application/json
{"error":"rate_limited","retryAfter":30}async function fetchWithBackoff(url, tries = 5) {
for (let i = 0; i < tries; i++) {
const res = await fetch(url);
if (res.status !== 429) return res;
const wait = Number(res.headers.get('Retry-After') || 2 ** i);
await new Promise(r => setTimeout(r, wait * 1000));
}
throw new Error('rate limited');
}# Limit each client IP to 10 req/s, returning 429 on excess
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
location /api/ {
limit_req zone=api burst=20 nodelay;
limit_req_status 429;
}