refactor: шаг 2 — лимитеры вынесены в src/middleware/rateLimit.js

This commit is contained in:
2026-05-30 13:36:10 +03:00
parent 631641bbf0
commit 35210291d0
2 changed files with 47 additions and 21 deletions
+45
View File
@@ -0,0 +1,45 @@
/**
* src/middleware/rateLimit.js — настройки ограничения частоты запросов.
*
* Зачем вынесено отдельно:
* - Лимиты можно менять в одном месте, не трогая роуты.
* - Легко подключать только нужный лимитер к конкретному роуту.
* - Упрощает тестирование — можно заменить на no-op лимитер в тестах.
*
* express-rate-limit считает запросы по IP (по умолчанию — req.ip).
* Если приложение стоит за reverse-proxy (nginx/traefik), нужно
* настроить app.set('trust proxy', 1) чтобы X-Forwarded-For работал корректно.
*/
'use strict';
const { rateLimit } = require('express-rate-limit');
// ── mutationLimiter — для мутирующих POST-запросов ────────────────────────────
// Применяется к: POST /add, /edit/:id, /delete/:id, /admin/limit/:id
//
// Лимит 30 запросов за минуту с одного IP — достаточно для ручного
// пользования и при этом блокирует простые скриптовые атаки.
//
// При превышении лимита — 429 Too Many Requests.
const mutationLimiter = rateLimit({
windowMs: 60_000, // скользящее окно: 1 минута
limit: 30, // не более 30 POST-запросов за окно
standardHeaders: 'draft-7', // добавляет заголовки RateLimit-* и Retry-After
legacyHeaders: false, // не добавлять устаревшие X-RateLimit-* заголовки
message: { error: 'Слишком много запросов. Подождите минуту.' },
});
// ── exportLimiter — для публичного GET /export ────────────────────────────────
// /export не требует авторизации (ТЗ) — поэтому ограничиваем жёстче.
// 20 запросов в минуту достаточно для автоматической синхронизации
// (nginx/firewall обычно опрашивают раз в несколько минут).
const exportLimiter = rateLimit({
windowMs: 60_000,
limit: 20,
standardHeaders: 'draft-7',
legacyHeaders: false,
message: 'Слишком много запросов к /export. Подождите минуту.',
});
module.exports = { mutationLimiter, exportLimiter };