Ограничение частоты запросов: лимиты и сдерживание злоупотреблений
Коротко: Ограничение частоты запросов (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, Nginxlimit_req, правила Cloudflare/WAF). - Бессерверные среды/несколько экземпляров: счётчики не в памяти процесса, а централизованно (Redis, база данных).
- Отвечайте HTTP 429 Too Many Requests с
Retry-Afterи при желании заголовкамиRateLimit-Limit/Remaining/Reset. - Клиентам следует повторять с экспоненциальной отсрочкой + jitter.
- Дополнительно тайм-ауты, ограничения размера, пагинация и квоты (в день/месяц).
Пределы и практика
Одно ограничение частоты не остановит распределённые атаки (DDoS): для этого CDN/WAF, обнаружение ботов, защита выше по потоку. Не блокируйте и добросовестных пользователей: выводите лимиты из реальных измерений, сообщение об ошибке понятное, журналирование/тревога при устойчивом превышении. Тестируйте лимиты, документируйте лимиты в документации API. Конфиденциальность: IP-адреса — персональные данные, храните их недолго.
См. также: Debounce и throttle