Срок жизни токена и его обновление

В библиотеке Iron модель «токена» реализуется через механизм шифрования и подписи произвольного объекта, который затем может быть безопасно передан клиенту и восстановлен на сервере. Такой объект называют «запечатанным» (sealed value). В отличие от классических JWT, здесь нет строгого формата токена — вместо этого используется сериализованный и зашифрованный payload с метаданными, включая время создания и срок действия.

Ключевым параметром, определяющим жизненный цикл защищённого значения, является ttl (time to live), который задаётся при создании токена.

TTL как основа срока жизни

При создании защищённого значения через Iron.seal() можно указать параметр времени жизни:

  • ttlSec — время жизни в секундах

Внутри зашифрованной структуры сохраняется момент создания токена. При последующей расшифровке через Iron.unseal() библиотека вычисляет разницу между текущим временем и временем создания.

Если текущее время превышает ttl, операция распаковки завершится ошибкой, даже если криптографическая целостность данных не нарушена.

t_{exp} = t_{created} + ttl

Где:

  • t_created — время создания токена
  • ttl — допустимый срок жизни
  • t_exp — момент истечения

Особенности проверки времени

Проверка срока жизни выполняется на этапе unseal, а не при создании. Это означает:

  • токен может быть создан заранее и использован позже
  • истечение срока определяется только при чтении
  • невозможно «продлить» токен без повторного создания

Дополнительно учитывается возможное расхождение системного времени. Поэтому в реальных системах важно синхронизировать часы (NTP), иначе возможны ложные истечения или принятие просроченных токенов.

Структура временных меток внутри Iron

Внутри sealed-значения хранится служебный блок данных, содержащий:

  • время создания (issued time)
  • параметры шифрования
  • версию алгоритма
  • полезную нагрузку (payload)

Эти данные защищены криптографически и недоступны для прямого изменения без нарушения подписи.

С точки зрения логики срока жизни важны именно временные метки, поскольку именно они определяют валидность токена.

Механизм истечения токена

При вызове Iron.unseal() происходит последовательность проверок:

  1. Проверка целостности подписи
  2. Расшифровка данных
  3. Извлечение временных меток
  4. Сравнение текущего времени с ttl

Если срок превышен, библиотека выбрасывает ошибку истечения.

Типичная ошибка:

  • Token expired

Это поведение делает невозможным использование устаревших токенов даже при их перехвате.

Подходы к обновлению токена

В Iron нет встроенного механизма «refresh token» в классическом понимании OAuth. Обновление реализуется на уровне прикладной логики.

Существует несколько распространённых стратегий.

Полное переиздание токена

Наиболее прямой подход — создание нового sealed-значения при каждом обновлении сессии.

Процесс:

  • клиент отправляет действующий токен
  • сервер проверяет его валидность
  • создаётся новый токен с новым ttl
  • старый токен становится неактуальным

Этот подход обеспечивает простую модель безопасности, но требует дополнительной логики на сервере.

Скользящее обновление срока жизни (sliding expiration)

Часто применяется механизм «скользящего TTL», при котором срок жизни продлевается при каждом взаимодействии пользователя с системой.

Логика:

  • токен проверяется при каждом запросе
  • если до истечения осталось меньше порога (например, 20% TTL)
  • создаётся новый токен с обновлённым временем создания

t_{new} = t_{now} + ttl

Такой подход позволяет поддерживать активные сессии без постоянного логина, но требует контроля частоты обновлений, чтобы избежать лишней генерации токенов.

Обновление через промежуточную проверку

Иногда вводится дополнительный слой логики:

  • проверка токена
  • проверка бизнес-условий (роль, права, активность)
  • решение о необходимости обновления

Это позволяет обновлять токен не только по времени, но и по состоянию пользователя.

Ограничения продления срока жизни

Важно понимать, что в Iron невозможно «изменить TTL» у уже созданного токена. Любая попытка обновления фактически означает:

  • создание нового sealed-значения
  • перенос данных из старого токена
  • выдача нового криптографического контейнера

Это принципиальное отличие от систем, где токен хранится в базе и может быть модифицирован.

Безопасность при обновлении токенов

При проектировании системы обновления срока жизни необходимо учитывать несколько факторов:

Повторное использование старого токена

Если старый токен остаётся валидным после обновления, возникает риск replay-атаки. Поэтому часто применяется стратегия:

  • ограничение одного активного токена на пользователя
  • хранение последнего выданного идентификатора
  • проверка версии токена при каждом запросе

Окно параллельной валидности

При обновлении токенов важно учитывать сетевые задержки:

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

Для этого вводится кратковременное пересечение валидности.

Защита от подмены времени

Так как TTL зависит от времени, система уязвима к:

  • изменению системного времени клиента
  • рассинхронизации серверов

Поэтому критически важно, чтобы проверка времени происходила только на серверной стороне.

Практическая модель жизненного цикла

Жизненный цикл sealed-данных в Iron можно представить как последовательность состояний:

  1. Создание объекта
  2. Шифрование и подпись
  3. Передача клиенту
  4. Использование в запросах
  5. Проверка срока жизни при каждом использовании
  6. Истечение или обновление через повторное создание

Каждый цикл обновления полностью заменяет предыдущий экземпляр.

Поведение при истечении срока

После истечения TTL токен становится недействительным независимо от:

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

Единственный способ восстановить доступ — создание нового sealed-значения с повторной авторизацией пользователя или использованием механизма refresh на уровне приложения.

Оптимизация частоты обновления

Чрезмерное обновление токенов может привести к:

  • нагрузке на сервер
  • увеличению трафика
  • снижению производительности

Поэтому часто вводятся пороги:

  • обновление только при оставшемся времени < X%
  • обновление не чаще одного раза в N минут
  • привязка к активности пользователя

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

Влияние длительности TTL на архитектуру

Выбор срока жизни напрямую влияет на поведение системы:

  • короткий TTL повышает безопасность, но увеличивает количество обновлений
  • длинный TTL снижает нагрузку, но увеличивает риск компрометации токена

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

Итоговая модель обновления

Обновление токена в Iron всегда сводится к одному принципу:

  • проверка текущего sealed-значения
  • извлечение payload
  • создание нового sealed-значения с новым временем жизни

Любые «изменения» токена являются фактически полной его пересборкой, а не модификацией.