📝 BLOG

API Rate Limiting: троттлинг, квоты и защита от DDoS

API rate limiting предотвращает злоупотребление и перегрузку вашего API. Это руководство охватывает стратегии rate limiting, троттлинг, управление квотами и защиту от DDoS.

Обновлено:

Подготовлено: Gsetsoft

API Rate Limiting: троттлинг, квоты и защита от DDoS

Что такое Rate Limiting?

Rate limiting — это ограничение количества запросов, которые могут быть сделаны за определённый период времени (секунда, минута, час).

Цели: предотвращение злоупотребления API, обеспечение справедливого использования, защита серверных ресурсов, снижение DDoS-атак.

При превышении rate limit: возвращается HTTP-статус 429 (Too Many Requests). Указывает, когда повторить, с помощью заголовка Retry-After.

Rate limiting повышает доступность и надёжность API. Обеспечивает соблюдение SLA (Service Level Agreement).

Алгоритмы Rate Limiting

Fixed Window: счётчик в фиксированном временном окне (например, 100 запросов в минуту). Просто, но проблема boundary (всплеск на границах окна).

Sliding Window Log: храните timestamp каждого запроса. Подсчитывайте запросы за последние N секунд. Точнее, но использует больше памяти.

Sliding Window Counter: гибрид fixed window и sliding window log. Меньше памяти, более точный результат.

Token Bucket: токены производятся с определённой скоростью. Каждый запрос потребляет один токен. Обеспечивает поддержку burst.

Leaky Bucket: запросы добавляются в очередь и обрабатываются с фиксированной скоростью. Обеспечивает smoothing трафика.

Стратегии Rate Limiting

На основе IP: лимит на основе IP-адреса запрашивающего. Просто, но пользователи за NAT (один IP) имеют проблемы.

На основе пользователя: лимит на основе аутентифицированного пользователя. Справедливее. Идентифицируйте пользователя с помощью API key или JWT.

На основе эндпоинта: разный лимит для каждого эндпоинта. /login (5/мин) vs /users (100/мин).

Tiered: разные лимиты для разных типов пользователей. Free (100/мин), Pro (1000/мин), Enterprise (10000/мин).

Global vs per-endpoint: глобальный лимит (для всего API) + лимит per-endpoint. Используйте оба вместе.

Реализация

Redis: храните счётчики rate limit в Redis. Атомарный счётчик с командами INCR и EXPIRE. Идеально для распределённого rate limiting.

Middleware: middleware Express.js (express-rate-limit), Django (django-ratelimit), Spring Boot (Bucket4j).

API Gateway: rate limiting с помощью Kong, AWS API Gateway, Cloudflare. Централизованное управление и мониторинг.

Response headers: возвращайте информацию о лимите с заголовками X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.

Client SDK: клиентские библиотеки читают информацию о rate limit и автоматически выполняют retry и backoff.

Защита от DDoS

Rate limiting сам по себе не обеспечивает защиту от DDoS. DDoS-атаки приходят в объёмах, превышающих rate limit.

Cloudflare: защита от DDoS, WAF (Web Application Firewall), управление ботами. Доступен бесплатный tier.

AWS Shield: защита от DDoS для сервисов AWS. Standard (бесплатный) и Advanced (платный).

Репутация IP: блокируйте IP с плохой репутацией. Используйте списки репутации, такие как Spamhaus, AbuseIPDB.

CAPTCHA: верифицируйте подозрительный трафик с помощью CAPTCHA. reCAPTCHA v3 (invisible) или hCaptcha.

Geo-blocking: блокируйте трафик из определённых стран (при необходимости).

Лучшие практики

Graceful degradation: давайте чёткое сообщение об ошибке пользователю при превышении rate limit. Указывайте, когда повторить, с помощью заголовка Retry-After.

Мониторинг: отслеживайте hit'ы rate limit. Аномальный рост может указывать на атаку или баг.

Whitelist: вносите доверенные IP (внутренние сервисы, API партнёров) в whitelist.

Документация: чётко указывайте политику rate limit в документации API. Информация о лимите, окне и retry.

Тестирование: тестируйте поведение rate limit с помощью load testing. Используйте k6, Artillery или JMeter.

Связанные инструменты

Ваш выбор конфиденциальности

Необходимые cookie обеспечивают безопасность и сеансы. Базовые визиты учитываются; с вашего разрешения включается дополнительная аналитика. Политика cookie