Функция ограничения скорости в Laravel
Функция ограничения скорости в Laravel помогает контролировать количество запросов, которые API или конкретный маршрут может обработать за определённый период времени. Это необходимо для предотвращения злоупотреблений, перегрузки ресурсов или чрезмерного количества запросов от одного пользователя или IP-адреса в короткий промежуток времени.
Основные концепции
✔️Промежуточное ПО Throttle: Laravel предоставляет промежуточное ПО throttle, которое позволяет определять ограничения скорости для маршрутов или групп маршрутов.
✔️Определение лимитов: Вы можете задать количество разрешённых попыток и продолжительность (например, 100 запросов в минуту). Если лимит превышен, Laravel автоматически вернёт ответ HTTP 429 Too Many Requests (Слишком много запросов).
✔️Алгоритм «Leaky Bucket»: Laravel использует алгоритм «протекающего ведра» для равномерной обработки запросов с течением времени, вместо того чтобы допускать всплески запросов до достижения лимита.
✔️Динамическое ограничение скорости: Laravel позволяет устанавливать разные лимиты для различных пользователей, маршрутов или параметров запроса, что даёт больше контроля над конкретными случаями.
✔️Фасад RateLimiter: Фасад RateLimiter Laravel предоставляет более продвинутую конфигурацию и управление. Вы можете задавать лимиты на основе атрибутов запроса, таких как идентификатор пользователя, IP-адрес или другие свойства.
✔️Заголовки Retry: Когда клиент превышает лимит запросов, Laravel включает в ответ заголовки Retry-After, которые указывают, когда клиент может повторить запрос.
Пример ограничения скорости в Laravel
В файле routes/web.php или routes/api.php вы можете определить лимиты скорости следующим образом:
Route::middleware(['throttle:60,1'])->group(function () {
// Определите маршруты здесь
});В данном случае throttle:60,1 означает, что пользователь может совершить 60 запросов в минуту.
Настройка лимитов
Вы можете настроить ограничения с помощью фасада RateLimiter. Например, можно задать лимит на основе идентификатора пользователя:
use Illuminate\Support\Facades\RateLimiter;
RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(100)->by($request->user()?->id ?: $request->ip());
});
Этот код ограничивает количество запросов до 100 в минуту, и использует идентификатор аутентифицированного пользователя, либо IP-адрес, если пользователь не аутентифицирован.
Когда использовать ограничение скорости
🔸Предотвращение злоупотреблений или DDoS-атак: Ограничение скорости помогает смягчить последствия вредоносных действий, таких как атаки распределённого отказа в обслуживании (DDoS), контролируя количество запросов, которые может выполнить один пользователь или IP за определённый промежуток времени.
🔸Ограничение скорости API: При предоставлении API внешним пользователям, ограничение скорости гарантирует, что ни один пользователь или клиент не потребляет слишком много ресурсов, что может негативно сказаться на производительности приложения.
🔸Защита чувствительных конечных точек: Для маршрутов, которые выполняют ресурсоёмкие операции, такие как загрузка файлов или запросы к базе данных, ограничение скорости помогает защитить инфраструктуру от перегрузки.
🔸Поддержание справедливого использования: Если вы предлагаете разные уровни обслуживания (например, бесплатный и премиум), ограничение скорости может обеспечить различную частоту запросов для этих категорий, позволяя премиум-пользователям делать больше запросов, чем бесплатным.
🔸Предотвращение перегрузки системы ботами: Веб-приложения часто нуждаются в защите от автоматизированных действий (например, отправка форм или получение данных ботами). Ограничение скорости помогает контролировать такие активности.