Ограничение скорости — это стратегия, которую вы можете использовать для управления трафиком в сети. Он ограничивает количество запросов, которые пользователь может сделать в течение определенного периода времени.

Существуют различные алгоритмы ограничения скорости, каждый со своими компромиссами. Один простой и популярный метод — отслеживать IP-адреса запросов и проверять, сколько времени проходит между запросами. Затем система может отклонить запрос, если ее IP-адрес превышает количество запросов, разрешенное лимитом.

Этот подход к ограничению скорости легко внедрить в приложение NodeJS-Express, выполнив всего несколько шагов.

Шаг 1: Настройка среды разработки

Во-первых, вам нужно создать и инициализировать приложение Express.

Начните с создания каталога проекта, выполнив:

mkdir экспресс-приложение

Затем войдите в этот каталог, запустив:

CD экспресс-приложение

Далее инициализируйте npm, менеджер пакетов узла, и создать пакет.json файл в вашем приложении, запустив:

инициализация npm -y

флаг создаст ваш пакет.json файл со всеми настройками по умолчанию.

Далее вам нужно будет установить некоторые зависимости. Зависимости, необходимые для этого руководства:

  • ЭкспрессJS: ExpressJS — это фреймворк NodeJS. который обеспечивает надежный набор функций для веб-приложений и мобильных приложений. Это упрощает процесс создания серверных приложений с помощью NodeJS.
  • Ограничение экспресс-ставки: Express rate limit — промежуточное ПО, ограничивающее скорость для ExpressJS. Он ограничивает повторные запросы к общедоступным API и/или конечным точкам, такие как сброс пароля, вход пользователей в систему и т. д.

Установите необходимые зависимости, запустив:

нпм установить экспресс экспресс-тариф-ограничение

Шаг 2: Создание экспресс-приложения

Вам нужно будет создать базовый сервер Express, который прослушивает запросы, поступающие к вашему приложению.

Сначала создайте index.js файл в корневом каталоге вашего проекта. Это будет входной файл для вашего приложения.

Затем добавьте следующий код в свой index.js файл:

// index.js
константа экспресс = требовать("выражать");
константа приложение = экспресс();
константа порт = процесс.env. ПОРТ || 3000

app.listen (порт, () => {
приставка.журнал(`Приложение работает на порту ${порт}`);
});

Этот код импортирует выражать и создает приложение Express, вызывая функцию express() и сохраняя возвращаемое значение в приложение переменная. Затем он прослушивает трафик на порту 3000 позвонив в Слушать метод на приложение объект.

Шаг 3: Создание обработчиков маршрутов

Затем создайте несколько обработчиков маршрутов, на которых вы сможете реализовать решение по ограничению скорости.

Сначала создайте папку route в корневом каталоге вашего проекта, запустив:

мкдир маршруты

Создайте файл, маршруты.jsвнутри папки маршрутов и добавьте следующий код:

константа экспресс = требовать("выражать");
константа роутер = экспресс. Маршрутизатор();

роутер.получить("/", (треб., реш.) => {
res.send({сообщение: "Привет, это запрос GET" });
});

роутер.пост("/add-demo", (треб., реш.) => {
res.status (201).send({сообщение: "Ресурс успешно создан" });
});

роутер.пут("/update-demo", (треб., реш.) => {
res.status (201).send({сообщение: "Ресурс успешно обновлен" });
});

модуль.экспорт = маршрутизатор;

Этот код импортирует выражать, называет Маршрутизатор метод на выражать, и сохраняет значение в переменной, маршрутизатор. Маршрутизатор Метод позволяет создавать модульные, монтируемые обработчики маршрутов. Вы можете создавать обработчики маршрутов для ПОЛУЧИТЬ запрос на «/», а ПОЧТА запрос на «/add-demo", и ПОМЕЩАТЬ запрос на «/update-demo”. Наконец, экспортируйте маршрутизатор переменная.

Далее импортируйте маршрутизатор переменная в вашем index.js файл:

// index.js
константа маршруты = требовать(""./маршруты/маршруты");

Затем используйте его в качестве промежуточного программного обеспечения в вашем файле index.js:

// index.js
приложение.использовать(маршруты);

Обязательно поместите блок кода выше перед app.listen вызов.

Шаг 4: Реализация ограничения скорости

Сначала создайте «промежуточное ПО» в корневом каталоге вашего проекта, запустив:

ПО промежуточного слоя mkdir

Затем создайте файл с именем «скорость-limiter.js» внутри каталога промежуточного программного обеспечения. Добавьте в этот файл следующий код:

// скорость-ограничитель.js
константа ограничитель скорости = требовать("экспресс-лимит скорости");

константа ограничитель = ограничитель скорости ({
макс: 5,
окноMS: 10000, // 10 секунд
сообщение: "Вы можете'в данный момент не делаю больше запросов. Попробуйте позже",
});

модуль.экспорт = ограничитель

скоростьLimiter функция принимает объект конфигурации с условиями ограничения количества запросов.

Свойства в объекте конфигурации выше:

  • Максимум: это свойство всегда должно быть количество или функция, которая возвращает число. Он представляет максимальное количество запросов, которые пользователь может сделать в течение определенного периода времени. Если это свойство не задано в объекте конфигурации, оно по умолчанию равно 5.
  • WindowsMS: Это свойство всегда должно быть числом. Он представляет собой временной интервал, в течение которого допускается несколько запросов в миллисекунды. Если это свойство не задано в объекте конфигурации, по умолчанию оно равно 60000 миллисекунд (одна минута).
  • сообщение: это свойство может быть нить, объект JSON или любое другое значение, поддерживаемое Ответ экспресса. отправить метод. Если это свойство не задано в объекте конфигурации, по умолчанию оно равно «Слишком много запросов. Пожалуйста, попробуйте позже."

Затем функция проверит повторные запросы к вашему приложению. Если пользователь превышает лимит (Максимум, 5) в течение времени (окноMS, 10 с), он заблокирует запрос. Он также выдаст ошибку «Слишком много запросов» с кодом состояния 429.

Наконец, импортируйте функцию ограничителя в свой index.js файл и примените его в качестве глобального промежуточного программного обеспечения в своем приложении. Сделайте это, поместив app.use (ограничитель) над промежуточным программным обеспечением маршрутов. Это применяет решение по ограничению скорости ко всем маршрутам вашего приложения.

приложение.использовать(ограничитель);

Ограничение скорости определенных маршрутов

Вы также можете применить ограничение скорости для определенных маршрутов. Вы можете настроить их отдельно, чтобы отклонять запросы, сделанные в другой период времени, отображать другое сообщение и т. д.

Например, предположим, что вы реализуете маршрут входа пользователя в свое приложение. Возможно, вам потребуется добавить конфигурацию ограничения скорости для маршрута входа, которая отличается от конфигурации, используемой другими маршрутами.

Во-первых, вам придется удалить ограничитель в качестве промежуточного программного обеспечения уровня приложения и применять его, поскольку в ExpressJS нет встроенной системы фильтрации промежуточного программного обеспечения. Таким образом, даже если вы добавите к маршруту конкретное решение для ограничения скорости, глобальное промежуточное ПО все равно будет работать на этом маршруте.

Затем создайте новую конфигурацию ограничения скорости в вашем скорость-limiter.js файл и экспортировать его.

константа signInLimiter = скоростьLimiter({
макс: 3,
окноMS: 10000, //10 секунд
сообщение: "Слишком много попыток входа. Попробуйте позже."
})

модуль.экспорт = {
ограничитель,
signInLimiter
}

signInLimiter объект конфигурации имеет разное количество Максимум запросы и сообщение об ошибке, отличное от общего ограничителя скорости.

Наконец, обновите свой router.js файл с блоком кода ниже:

// маршрутизатор.js
константа экспресс = требовать("выражать");
константа роутер = экспресс. Маршрутизатор();
константа {ограничитель, signInLimiter} = требовать(""../промежуточное ПО/ограничитель скорости")

роутер.получить("/sign-in", signInLimiter, (req, res, next) => {
res.send({сообщение: "Привет, это запрос GET" });
});

маршрутизатор.использовать(ограничитель)

роутер.пост("/post", (треб., реш.) => {
res.status (201).send({сообщение: "Ресурс успешно создан" });
});

роутер.пут("/put", (треб., реш.) => {
res.status (201).send({сообщение: "Ресурс успешно обновлен" });
});

модуль.экспорт = маршрутизатор;

В приведенном выше блоке кода вы импортировали ограничитель а также знак ограничения. Затем вы подали заявку signInLimiter как специфический ограничитель скорости «/sign-in" маршрут.

Наконец, поместив router.use (ограничитель) над остальными маршрутами вы применили ограничитель в качестве ограничителя скорости для остальных маршрутов.

Важность ограничения скорости

Ограничение скорости снижает нагрузку на ваш веб-сервер, позволяя избежать одновременной обработки слишком большого количества запросов. Он снижает активность ботов, защищает вас от атак типа «отказ в обслуживании» (DoS) и предотвращает атаки грубой силы.