EMZETT.
Войти

Ограничение частоты запросов: лимиты и сдерживание злоупотреблений

Коротко: Ограничение частоты запросов (rate limiting) ограничивает, как часто клиент может обращаться к интерфейсу за период; защищает от перегрузки, перебора и скрапинга и сопровождается ответом HTTP 429.

Подробнее: Без ограничений один клиент (или бот) может нагрузить сервер, базу данных и счёт. Типичные цели: вход (подбор паролей), регистрация/сброс пароля (почтовый спам), дорогие конечные точки (поиск, ИИ), скрапинг, честное использование публичного API.

Подробности

Алгоритмы

  • Фиксированное окно: не более 100 запросов в минуту; просто, но даёт пики на границе окна (до 2× в быстрой последовательности).
  • Скользящее окно: точнее, несколько сложнее.
  • Token bucket: ведро наполняется со скоростью r, каждый запрос стоит токен; допускает короткие всплески до размера ведра.
  • Leaky bucket: сглаживает до постоянной скорости истечения.
  • Лимит параллелизма: не более N параллельных запросов на пользователя.

Кто считается?

Выберите ключ: IP-адрес (осторожно: NAT/школьные сети делят один IP; за прокси читайте реальный IP из X-Forwarded-For только у доверенных прокси), учётная запись, ключ API, комбинация (например, учётная запись + IP при входе). Строже для анонимных, щедрее для вошедших/платящих пользователей. Защита входа: дополнительно ограничивайте по имени пользователя, нарастающие задержки, captcha, блокировка с уведомлением.

Реализация

  • Счётчики в Redis (INCR + EXPIRE) или библиотеки (Upstash Ratelimit, express-rate-limit, Nginx limit_req, правила Cloudflare/WAF).
  • Бессерверные среды/несколько экземпляров: счётчики не в памяти процесса, а централизованно (Redis, база данных).
  • Отвечайте HTTP 429 Too Many Requests с Retry-After и при желании заголовками RateLimit-Limit/Remaining/Reset.
  • Клиентам следует повторять с экспоненциальной отсрочкой + jitter.
  • Дополнительно тайм-ауты, ограничения размера, пагинация и квоты (в день/месяц).

Пределы и практика

Одно ограничение частоты не остановит распределённые атаки (DDoS): для этого CDN/WAF, обнаружение ботов, защита выше по потоку. Не блокируйте и добросовестных пользователей: выводите лимиты из реальных измерений, сообщение об ошибке понятное, журналирование/тревога при устойчивом превышении. Тестируйте лимиты, документируйте лимиты в документации API. Конфиденциальность: IP-адреса — персональные данные, храните их недолго.

См. также: Debounce и throttle