설명
속도 제한은 서버가 남용으로부터 스스로를 보호하는 방식입니다. 모든 공개 API와 웹사이트는 단일 클라이언트가 특정 시간 창 내에 보낼 수 있는 요청 수를 제한합니다 — `100 requests per IP per minute`, `5000 requests per API key per hour`, `30 logins per account per day`. 클라이언트가 한도를 초과하면 서버는 429 Too Many Requests 응답을 반환하거나(경우에 따라 응답을 조용히 지연시키거나, 요청을 대기열에 넣거나, CAPTCHA를 제공하기 시작합니다).
스크래핑 및 데이터 수집 워크로드의 경우, 속도 제한은 얼마나 빠르게 진행할 수 있는지를 결정하는 운영상의 하한선입니다. 단순한 해결책인 요청 수를 줄이는 방식은 처리량을 제한합니다. 진짜 해결책은 요청을 여러 식별자(IP, 계정, 세션 ID)에 분산시켜 단일 식별자가 한도를 초과하지 않도록 하는 것입니다. 이것이 바로 레지덴셜 프록시가 하나의 제품 카테고리로 존재하는 전체 이유입니다.
서버 측 속도 제한 알고리즘에는 몇 가지 형태가 있습니다. 토큰 버킷(Token bucket)은 클라이언트가 한도까지 일정한 속도로 토큰을 축적하도록 하여 한도 크기까지 버스트를 허용합니다. 슬라이딩 윈도우(Sliding window)는 이동하는 시간 창 내에서 요청을 세어 한도를 완만하게 만듭니다. 고정 윈도우(Fixed window)는 시계 경계(분당, 시간당)에서 카운트를 재설정합니다. 각 방식은 스크레이퍼가 요청 속도를 조절하는 방법에 서로 다른 영향을 미칩니다.
작동 방식
서버는 들어오는 모든 요청에서 클라이언트를 식별합니다(IP, API 키, 계정 ID 또는 세션 토큰 기준) 그리고 현재 윈도우에서 해당 식별자에 대한 카운터를 확인합니다. 카운터가 한도 이하이면 요청이 통과되고 카운터가 증가합니다. 카운터가 한도를 초과하면 서버는 대기해야 하는 시간을 나타내는 `Retry-After` 헤더와 함께 429를 반환합니다.
대부분의 대형 API는 여러 식별자를 조합해 사용합니다. 동일한 IP와 계정이 서로 다른 한도를 가진 다른 카운터에 걸릴 수 있습니다. 예를 들어 Cloudflare의 rate-limit 규칙은 IP, URL 경로, 세션 또는 이들의 조합으로 한도 범위를 지정할 수 있습니다. 일부 고급 시스템은 더 매끄러운 제어를 위해 leaky-bucket이나 sliding-window-counter 방식을 사용합니다.