Защита от DDoS

Fresh — это веб-фреймворк для Deno, ориентированный на минимальный JavaScript на клиенте, серверный рендеринг и строгую типизацию. Архитектурные особенности Fresh напрямую влияют на устойчивость приложений к DDoS-атакам, поскольку многие векторы перегрузки эффективно нейтрализуются ещё на уровне дизайна системы.

Ключевые свойства Fresh, важные для защиты от DDoS:

  • Server-Side Rendering без клиентского бандла
  • Отсутствие сборки и runtime-зависимостей
  • Изоляция запросов на уровне Deno
  • Явная работа с HTTP-запросами
  • Нативная поддержка edge-окружений

Модель угроз DDoS для JavaScript-приложений

DDoS-атаки на серверные JavaScript-приложения обычно делятся на несколько категорий:

  • L7 HTTP Flood — большое количество легитимных HTTP-запросов
  • Slowloris-подобные атаки — удержание соединений
  • Атаки на рендеринг — перегрузка логики SSR
  • Атаки на маршрутизацию — создание нагрузки через динамические роуты

Fresh решает часть этих проблем архитектурно, а остальное — через корректную конфигурацию и код.


Изоляция запросов в Deno и влияние на DDoS

Fresh работает поверх Deno, который использует:

  • асинхронную модель ввода-вывода
  • строгую песочницу
  • ограничение системных ресурсов через permissions

Каждый HTTP-запрос обрабатывается в изолированном event loop, что снижает риск блокировок при пиковых нагрузках.

Deno.serve(async (req) => {
  return new Response("OK");
});

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


Минимизация вычислительной нагрузки

Fresh не использует:

  • client-side hydration по умолчанию
  • виртуальный DOM на сервере
  • сложные middleware-цепочки

Это критично при DDoS, так как каждый запрос:

  • рендерит только HTML
  • не инициализирует лишние JS-модули
  • не выполняет клиентский код

Частичная гидратация (Islands)

JavaScript выполняется только для отдельных компонентов:

export default function Counter() {
  const [count, setCount] = useState(0);
  return <button onCl ick={() => setCount(count + 1)}>{count}</button>;
}

Во время DDoS-атаки это снижает нагрузку на сервер, так как:

  • гидратация не участвует в SSR
  • нет массового выполнения JS-логики

Контроль входящих запросов на уровне роутов

Fresh использует файловую маршрутизацию. Это позволяет явно контролировать обработку каждого эндпоинта.

export const handler = {
  GET(req: Request, ctx: HandlerContext) {
    return new Response("data");
  }
};

Для защиты от HTTP Flood:

  • отказ от универсальных wildcard-роутов
  • минимизация динамических параметров
  • ранний возврат ответа без вычислений
if (req.method !== "GET") {
  return new Response(null, { status: 405 });
}

Rate Limiting без middleware-слоя

Fresh не навязывает middleware, что упрощает внедрение прямого rate limiting:

const ipMap = new Map<string, number>();

export function limit(req: Request): boolean {
  const ip = req.headers.get("x-forwarded-for") ?? "unknown";
  const count = ipMap.get(ip) ?? 0;
  ipMap.set(ip, count + 1);
  return count < 100;
}

Преимущества:

  • отсутствие дополнительной абстракции
  • контроль над жизненным циклом данных
  • минимальная задержка

Для edge-окружений используется KV-хранилище или CDN-лимиты.


Edge-развёртывание как защита от DDoS

Fresh изначально проектировался под edge-платформы:

  • Deno Deploy
  • Cloudflare Workers (через адаптацию)
  • Fastly Compute

Edge-исполнение даёт:

  • географическое распределение нагрузки
  • автоматическое масштабирование
  • отсечение атак близко к источнику
export const config = {
  runtime: "edge",
};

DDoS-трафик не доходит до центрального сервера, а распределяется по узлам.


Кэширование как средство подавления атак

Fresh легко интегрируется с HTTP-кэшированием:

return new Response(html, {
  headers: {
    "Cache-Control": "public, max-age=60",
  },
});

Эффект:

  • повторные запросы не обрабатываются сервером
  • SSR не выполняется заново
  • CDN отвечает напрямую

Особенно эффективно против:

  • повторяющихся GET-запросов
  • бот-сетей без поддержки cache-headers

Защита от Slow HTTP атак

Deno использует таймауты соединений на уровне runtime. Дополнительно можно:

  • проверять Content-Length
  • отклонять запросы без body-лимитов
  • игнорировать keep-alive при необходимости
if (req.headers.get("content-length") === null) {
  return new Response(null, { status: 411 });
}

Отказ от тяжёлых зависимостей

Fresh поощряет использование стандартной библиотеки и ES-модулей без node-пакетов. Это важно для DDoS-устойчивости:

  • меньше времени инициализации
  • меньше памяти на каждый запрос
  • отсутствие цепочек require/import

Каждый импорт — потенциальная точка деградации под нагрузкой.


Логирование без деградации

Во время атаки логирование может стать узким местом. В Fresh логика полностью под контролем разработчика:

if (Deno.env.get("ENV") === "production") {
  // минимальное логирование
}

Рекомендуется:

  • отключать синхронный вывод
  • использовать sampling
  • логировать только ошибки

Поведение приложения при перегрузке

Fresh позволяет явно контролировать деградацию:

try {
  return await render();
} catch {
  return new Response("Service Unavailable", { status: 503 });
}

Предсказуемый отказ предпочтительнее зависаний и утечек ресурсов.


Архитектурный эффект Fresh на DDoS-устойчивость

Суммарный эффект от использования Fresh:

  • снижение CPU-нагрузки на запрос
  • отсутствие лишнего JavaScript
  • быстрый отказ без каскадных сбоев
  • высокая совместимость с CDN и edge-инфраструктурой

Fresh не является защитным инструментом сам по себе, но его минималистичная архитектура существенно уменьшает поверхность атаки и упрощает реализацию активной защиты от DDoS на уровне JavaScript-приложения.