rate limiting은 클라이언트가 시간 창 안에서 할 수 있는 요청 수를 제한합니다. 각 계층이 서로 다른 것을 보기 때문에 여러 계층에 적용하고, 남용자를 식별하는 무엇이든으로 key를 잡습니다.
429 Too Many Requests를 Retry-After와 함께 반환 — 클라이언트가 계속 두드리는 대신 정중하게 물러나도록.# 클라이언트 IP로 key를 잡는 공유 메모리 zone 정의.
# rate=10r/s = 안정적인 토큰 재충전 속도 (token bucket).
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
server {
location /api/ {
# burst=20: 대기열에 쌓이는 20개 요청의 짧은 스파이크 허용
# nodelay: 간격을 두지 않고 burst를 즉시 처리
limit_req zone=api burst=20 nodelay;
# 기본 503이 아닌 429를 반환해 클라이언트가 rate-limit 신호를 보게 함
limit_req_status 429;
proxy_pass http://backend;
}
}
여기서 각 IP는 초당 10요청으로 재충전되고, 최대 20까지 burst할 수 있으며, 그 이상은 429를 받습니다.
rate limiting은 Layer 7 flood, credential stuffing, 폭주하는 scraper에 대한 가장 저렴한 상시 방어입니다. 이를 계층화하고(볼륨은 edge, origin은 proxy, 업무 로직은 app) 올바르게 key를 잡으면 남용자는 막히고 실제 사용자와 정당한 burst는 손상 없이 통과합니다. 실제 baseline에서 한도를 설정하는 것이 이것이 스스로 만든 장애가 되지 않게 합니다.