Rate limiting и защита API
Один клиент может уронить API пачкой запросов, а один скрипт — брутфорсить пароли. Открытый endpoint без ограничений — часы до неприятностей.
Лимит запросов за окно
import { rateLimit } from "express-rate-limit";
// 100 запросов с одного IP за 10 минут
const limiter = rateLimit({
windowMs: 10 * 60 * 1000,
max: 100,
standardHeaders: true
});
app.use("/api/", limiter);
Превысили — ответ 429 Too Many Requests с заголовками, когда можно снова.
Распределённый лимит на Redis
// Счётчик с TTL — скользящее окно между нодами
await redis.incr(`rl:${ip}:${window}`);
await redis.expire(`rl:${ip}:${window}`, 600);
💡
От брутфорса логина: лимит по IP + лимит по аккаунту, капча после серии неудач, экспоненциальная пауза. И отдельный лимит для «сырых» публичных эндпоинтов.
ℹ️
В проде следите и за скоростью: 429 с «вернись через N сек» + мониторинг дропов (урок 50) дают спокойный сон. Лимиты — не фича, а гигиена прода.