Защита API · Урок 80

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) дают спокойный сон. Лимиты — не фича, а гигиена прода.