Подключение Iron в качестве middleware начинается с определения места в цепочке обработки HTTP-запросов, где необходимо обеспечить защищённое хранение состояния. Чаще всего это слой между входящим запросом и бизнес-логикой маршрутов, где создаётся или читается сессионный контекст.
Перед подключением middleware требуется добавить пакет в проект:
npm install iron-session
В экосистеме Node.js библиотека используется в двух основных сценариях: классические серверы на Express и серверные функции в Next.js. Несмотря на различия, принцип остаётся единым — оборачивание обработчика в middleware, который добавляет объект сессии в контекст запроса.
Основная особенность Iron — криптографическая защита данных сессии. При подключении middleware необходимо задать параметры шифрования и поведения cookie.
Типичная конфигурация включает:
password — секретная строка для шифрования (должна быть
длинной и случайной)cookieName — имя cookie, в котором хранится сессияcookieOptions — параметры безопасности cookieПример базовой конфигурации:
const sessionOptions = {
password: process.env.SESSION_SECRET,
cookieName: "app_session",
cookieOptions: {
secure: process.env.NODE_ENV === "production",
httpOnly: true,
sameSite: "lax"
}
};
Ключевой момент — использование длинного пароля (обычно не менее 32 символов), поскольку Iron использует его для симметричного шифрования данных сессии.
В Express Iron подключается как middleware, расширяющий объект
req новым свойством session.
import express from "express";
import { ironSession } from "iron-session/express";
const app = express();
app.use(
ironSession(sessionOptions)
);
После этого каждый запрос получает доступ к сессионному объекту:
app.get("/profile", async (req, res) => {
if (!req.session.user) {
return res.status(401).send("Unauthorized");
}
res.json(req.session.user);
});
Middleware автоматически:
session к reqПосле подключения middleware работа с данными сессии сводится к прямому изменению объекта:
app.post("/login", async (req, res) => {
req.session.user = {
id: 123,
role: "admin"
};
await req.session.save();
res.sendStatus(200);
});
Важно, что сохранение состояния выполняется явно. Это позволяет контролировать момент записи в cookie и избегать лишних операций при каждом запросе.
Удаление сессии происходит через очистку объекта:
app.post("/logout", async (req, res) => {
req.session.destroy();
res.sendStatus(200);
});
Iron middleware встраивается в стандартный поток Express и выполняет несколько этапов:
Cookiereq.sessionТакой подход исключает необходимость ручного управления токенами или отдельным хранилищем сессий.
Iron можно комбинировать с другими middleware. Важно учитывать порядок подключения, так как сессия должна быть доступна до бизнес-логики маршрутов.
app.use(express.json());
app.use(ironSession(sessionOptions));
app.use((req, res, next) => {
if (!req.session.visits) {
req.session.visits = 1;
} else {
req.session.visits += 1;
}
next();
});
Любая логика, зависящая от пользователя, должна располагаться после
подключения Iron, иначе объект req.session будет
недоступен.
В TypeScript необходимо явно расширять интерфейс запроса, чтобы избежать ошибок типов:
declare module "express-session" {
interface SessionData {
user?: {
id: number;
role: string;
};
}
}
Или при использовании Express:
declare global {
namespace Express {
interface Request {
session: any;
}
}
}
Это позволяет корректно работать с middleware в строго типизированной среде.
Iron хранит данные сессии в зашифрованном виде внутри cookie. Это означает, что:
Нежелательно хранить:
Middleware автоматически сериализует объект в строку, шифрует и кодирует его перед отправкой клиенту.
Ошибки чаще всего возникают в следующих случаях:
passwordПри некорректной сессии middleware обычно создаёт пустой объект без прерывания запроса, что позволяет приложению корректно восстановить состояние.
Пример проверки:
app.use((req, res, next) => {
if (!req.session) {
req.session = {};
}
next();
});
При использовании middleware в production необходимо учитывать:
secure: true для cookiepassword при необходимостиMiddleware не требует внешнего хранилища, что упрощает масштабирование, но делает критичным контроль над cookie-политикой.
При проектировании архитектуры Express-приложений middleware с Iron обычно размещается сразу после базовых парсеров запроса и до маршрутизации:
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(ironSession(sessionOptions));
app.use("/api", apiRouter);
Такое расположение гарантирует, что:
Поскольку сессия хранится на клиенте, а не в базе данных, горизонтальное масштабирование серверов не требует синхронизации состояния. Любой экземпляр приложения способен расшифровать cookie независимо.
Это делает middleware подходящим для:
При этом критически важно единообразие конфигурации
password во всех инстансах.