속도 제한(rate limiting)은 클라이언트가 일정 시간 안에 보낼 수 있는 요청 수에 상한을 두어 서버를 과부하·남용·공격으로부터 보호하는 기법입니다.
한도를 초과하면 서버는 보통 `429 Too Many Requests` 상태 코드로 응답하고, 언제 다시 시도하면 되는지 `Retry-After` 헤더로 알려줍니다.
대표 알고리즘이 몇 가지 있습니다. (1) 고정 창(fixed window): 1분 같은 창마다 카운트를 리셋 — 단순하지만 창 경계에서 순간 폭주가 가능. (2) 슬라이딩 창(sliding window): 경계 문제를 완화. (3) 토큰 버킷: 버킷에 토큰을 일정 속도로 채우고 요청마다 하나씩 소비 — 평소엔 여유분(burst)을 허용하면서 평균 속도를 제한해 가장 널리 쓰입니다. (4) 누수 버킷(leaky bucket): 일정 속도로 처리해 트래픽을 평탄화. 분산 환경에서는 Redis 같은 공유 저장소로 여러 서버의 카운트를 합산합니다.
실무에서는 API 게이트웨이가 이 역할을 맡아 사용자·API 키·요금제·IP별로 서로 다른 한도를 적용합니다. 응답에는 `X-RateLimit-Limit`·`Remaining`·`Reset` 같은 헤더로 남은 할당량을 알려 주는 것이 좋은 관행입니다. 목적은 DDoS·크리덴셜 스터핑·크롤링 남용 방어, 공정한 자원 분배, 비용 통제입니다. 클라이언트 측에서는 `429`와 `Retry-After`를 존중해 지수 백오프로 재시도해야 하며, 웹훅 수신처럼 상대의 재시도가 폭주할 수 있는 지점에서도 중요합니다.