rate-limiter

Тема дорожной карты · Node.js

Ограничение частоты запросов (rate limiting) — это техника безопасности и производительности в серверных приложениях Node.js, ограничивающая количество запросов, которые клиент может сделать за заданный временной промежуток, и защищающая сервисы от брутфорс-атак, отказа в обслуживании (DoS) и неконтролируемых потребителей API. Npm-пакет express-rate-limit является наиболее распространённым middleware для ограничения частоты запросов в приложениях Express.js на Node.js и позволяет настроить правила вроде максимум 100 запросов за 15 минут с одного IP-адреса буквально несколькими строками кода. Для распределённых развёртываний Node.js, работающих на нескольких процессах или контейнерах, ограничение частоты запросов в памяти недостаточно, поскольку каждый экземпляр ведёт собственный счётчик; поэтому алгоритмы со скользящим окном на основе rate-limit-redis или ioredis обеспечивают согласованное применение ограничений по всему кластеру. Модуль @nestjs/throttler предоставляет ограничение частоты запросов для NestJS-приложений с декларативными декораторами, а Fastify имеет @fastify/rate-limit — оба естественно интегрируются с Redis для разделённого состояния в средах микросервисов Node.js. Реализация ограничения частоты запросов на уровне приложения Node.js дополняет, но не заменяет ограничение частоты запросов на уровне API-шлюза или обратного прокси, а TypeScript-типы для конфигурации ограничений помогают обеспечить корректность параметров на этапе разработки.

Как это работает

rate-limiter имеет слои: валидация input (zod, ajv) на границе, параметризованные SQL-запросы, эскейп пользовательского контента в HTML (или templating engine с авто-эскейпом), HTTPS везде (терминируется на reverse proxy), секреты в env (не в репо), правильные флаги JWT/cookie (HttpOnly, Secure, SameSite). Middleware helmet добавляет разумные HTTP-заголовки (HSTS, X-Frame-Options, CSP).

Когда применять

Security-baseline с первого дня: rate-limit на auth-эндпойнтах, лимит размера body, хеш паролей через bcrypt/argon2, подпись JWT сильным секретом + короткий TTL, валидация каждого input. npm audit в CI с гейтом на high/critical. OWASP ASVS — как чек-лист при планировании. Penetration test перед публичным запуском — bug bounty дешевле инцидентов.

Типичные ошибки

Ловушки rate-limiter: игнор CVE в зависимостях (каждый — потенциальный инцидент); JWT-секрет утёк в клиентский код или git-history; SQL-инъекция, потому что кто-то забыл параметр (SELECT * FROM u WHERE id = ${req.query.id} — никогда); eval или Function() на user-input; пароли в MD5/SHA1 (используйте argon2id с правильными параметрами). Security — это процесс, не разовый аудит.

Связанные понятия

Полезные ресурсы