В системах управления сессиями TTL (Time To Live) определяет период,
в течение которого сессионные данные считаются действительными. В
контексте cookie-сессий на базе Iron TTL чаще всего привязан к параметру
maxAge, задающему время жизни зашифрованного cookie на
стороне клиента.
= t_{created} +
Ключевая особенность TTL в сессиях на базе Iron заключается в том, что данные не хранятся на сервере в классическом виде. Сессия сериализуется, шифруется и помещается в cookie, а срок её жизни контролируется исключительно через метаданные времени.
При фиксированном TTL сессия создаётся один раз и истекает строго через заданный интервал независимо от активности пользователя. Такая модель проста, но приводит к ряду ограничений:
Фиксированный TTL подходит для коротких операций, но плохо масштабируется на сценарии постоянной работы с системой.
Скользящая сессия (sliding session) решает проблему преждевременного истечения. TTL обновляется при каждом запросе пользователя, фактически «сдвигая» время жизни сессии вперёд.
Механизм можно описать как:
t_{expires} = t_{now} +
Каждое взаимодействие с сервером приводит к переустановке срока действия cookie. Таким образом активная сессия остаётся валидной, пока пользователь продолжает работу.
В экосистеме Node.js и библиотеке Iron-session (или аналогичных реализациях с использованием Iron для шифрования cookie) скользящий TTL реализуется через обновление cookie на каждом запросе.
Типовая структура конфигурации:
import { getIronSession } from "iron-session";
const sessionOptions = {
password: process.env.SESSION_SECRET,
cookieName: "app_session",
cookieOptions: {
secure: true,
httpOnly: true,
maxAge: 60 * 60 * 24 // 1 день
}
};
Суть sliding session заключается в том, что после успешной валидации сессии cookie пересоздаётся с новым временем жизни.
export async function handler(req, res) {
const session = await getIronSession(req, res, sessionOptions);
if (!session.user) {
res.status(401).end();
return;
}
session.lastAccess = Date.now();
await session.save();
res.json({ ok: true });
}
Каждый вызов session.save() приводит к повторному
шифрованию данных и установке нового cookie с обновлённым
maxAge.
Iron использует симметричное шифрование (seal/unseal), где cookie содержит:
При каждом сохранении происходит:
Таким образом TTL не хранится как отдельное поле, а пересчитывается при каждом цикле записи.
Обновление TTL при каждом запросе может создавать избыточную нагрузку. Поэтому часто вводится «окно обновления» — минимальный интервал, при котором TTL действительно пересчитывается.
Логика может выглядеть следующим образом:
const now = Date.now();
const shouldRefresh = !session.lastRefresh || now - session.lastRefresh > 5 * 60 * 1000;
if (shouldRefresh) {
session.lastRefresh = now;
await session.save();
}
Sliding TTL усиливает пользовательский комфорт, но увеличивает риск:
Поэтому часто вводится двойная модель:
t_{final} = (t_{created} + T_{absolute}, t_{now} + T_{sliding})
Даже при активном использовании системы сессия не должна жить бесконечно. Для этого вводится абсолютный лимит:
const sessionOptions = {
password: process.env.SESSION_SECRET,
cookieName: "app_session",
ttl: 60 * 60 * 24, // sliding
absoluteTimeout: 60 * 60 * 24 * 7 // 7 дней максимум
};
Логика проверки при каждом запросе:
Постоянная перезапись зашифрованного cookie может быть затратной. В высоконагруженных системах применяются стратегии:
Часто используется принцип «lazy refresh», когда обновление происходит только при необходимости.
Sliding sessions требуют усиленного внимания к безопасности:
httpOnlysecure в HTTPSsameSiteОсобое значение имеет контроль повторного использования cookie при её краже, так как продлеваемый TTL увеличивает окно атаки.
При нескольких одновременных запросах возможна ситуация гонки обновлений:
Для минимизации эффекта используется:
Типовой жизненный цикл sliding session в Iron:
Статическая модель:
Sliding модель:
Sliding TTL особенно полезен в:
Менее уместен в: