Я создаю спокойный API для пользователей моего приложения Laravel для извлечения их данных.
Текущий план состоит в том, что они могут генерировать токен API в приложении, чтобы затем аутентифицировать свои запросы API. Я не знаю, откуда они будут делать запросы.
Основная причина, по которой я хочу реализовать ограничение скорости, состоит в том, чтобы уменьшить влияние случайного / преднамеренного DDOS, а также части текущего пакета подписки пользователя (необходимо). Из-за последнего у разных пользователей могут быть разные тарифы.
Laravel уже предоставляет встроенный ограничитель скорости, включая доступ к динамическим пользовательским ограничениям, указанным в таблице User.
Мне интересно, хотя, как сессия обрабатывается. Из того, что я вижу, класс Laravel TokenGuard не хранит пользователя между запросами. Поэтому пользователь извлекается между каждым запросом, даже для получения ограничения скорости. Это, кажется, лишает смысла ограничитель скорости, если мы все еще делаем запросы к базе данных каждый раз.
Каков подходящий способ справиться с этим?
Если я напишу свое собственное промежуточное ПО аутентификации и сохраню пользователя в сеансе, это сработает? Обрабатывают ли запросы, отправленные с другого сервера (не браузера), сессии?
Благодарю.
Каждый раз, когда кто-то заходит на ваш сайт, вы раскручиваете весь экземпляр Laravel, который уже создает нагрузку на ваш сервер. DDOS не зависит только от проблем с вашей БД. Если кто-то решит DDOS вас, вы заметите! Все, что вы можете сделать, это смягчить проблему, поэтому не беспокойтесь слишком сильно, что каждый запрос связан с вызовом БД.
У вас может быть локальный сеанс, но в долгосрочной перспективе это плохое проектное решение, поскольку оно вводит состояние на ваш сервер, что значительно усложнит масштабирование в будущем. (https://12factor.net/ для получения дополнительной информации об этом.) Именно поэтому Laravel использует пользователя, хранящегося в БД.
Если вы не делаете что-то особенное, обычно можно предположить, что Laravel использует адекватное решение. Они делают фреймворки, чтобы вы могли беспокоиться о бизнес-логике!
Наконец, есть много сайтов. Скорее всего, к тому времени, когда вы станете достаточно большими, чтобы привлечь внимание людей, пытающихся DDOS, вас (помните, что это потребует ресурсов и, следовательно, денег), вы, вероятно, будете использовать гораздо более сложную систему.
Если запрос с каким-либо токеном достигнет вашего приложения, вам не понадобится какой-либо сеанс. Как вы и предполагали: сеанс обычно обрабатывается с помощью файлов cookie, но необработанные HTTP-вызовы (как это делает cURL) обычно не используют их.
Не переоценивайте стоимость получения текущего пользователя из базы данных — если ваше приложение выполняет еще какие-то действия, эти дополнительные действия будут иметь значение! Получение одного объекта из базы данных довольно дешево по сравнению со всем остальным, и для проверки правильности разрешений и ограничений скорости это, очевидно, необходимо.
Все остальное выглядит так, как будто вы ищете что-то вроде Laravel Passport (см. https://laravel.com/docs/5.7/passport). Дополнительные инструменты, такие как пакет газа (см. https://github.com/GrahamCampbell/Laravel-Throttle) поможет вам включить ограничение скорости для ваших маршрутов