Короткий ответ
Грубую фильтрацию по объёму и известным паттернам эффективнее останавливать как можно раньше — на уровне CDN/WAF/API-gateway, до того как запрос дойдёт до бизнес-логики, а содержательные решения, зависящие от состояния аккаунта и бизнес-правил, остаются на уровне приложения, где доступен весь нужный контекст.
Как это работает подробнее
CDN/WAF фильтрует трафик до того, как он потребляет ресурсы серверов приложения, что особенно важно при объёмных атаках, где цель — исчерпать инфраструктуру; но эти слои обычно не видят бизнес-контекст (например, что конкретный аккаунт за последний час создал 500 бесплатных пробных подписок), поэтому такие проверки естественно живут в коде приложения.
- Компромисс. Фильтрация на периметре (CDN/WAF/gateway) дешевле по стоимости обработки и быстрее останавливает объёмные атаки, но ограничена в точности без бизнес-контекста и может случайно блокировать легитимных пользователей за общими IP; защита на уровне приложения точнее, но требует, чтобы трафик вообще дошёл до него. Критерий выбора — тип угрозы (объёмная vs поведенческая) и стоимость ложных срабатываний на каждом уровне для конкретного продукта.
Пример кода
example.txt
CDN/WAF: фильтрует объёмный DDoS, известные вредоносные IP/User-Agent
API-gateway: базовый rate limiting по IP/API-ключу, блокировка явных ботов
Приложение: поведенческий анализ -- "аккаунт X создал 50 заказов за минуту
с одинаковым адресом доставки" -> точечная блокировка аккаунта,
а не всего диапазона IP, с которого он работаетЧто использовать на практике
- Практика. Разумная стратегия — многоуровневая защита: сетевой/объёмный DDoS останавливается на CDN, базовый rate limiting и блокировка известных плохих IP/User-Agent — на API-gateway, а детальная поведенческая защита — в приложении с возможностью точечно банить аккаунт, а не весь IP.
Подводные камни
- Риск. Пытаются решить все классы злоупотреблений на одном уровне — писать сложную поведенческую логику прямо в edge-прокси, что сложно поддерживать так же быстро, как меняется паттерн атаки; либо пропускают весь трафик до приложения без базовой фильтрации, делая инфраструктуру уязвимой к простому объёмному исчерпанию ресурсов.