В системах, использующих @hapi/iron, токен представляет
собой защищённый контейнер для данных, который может быть проверен и
расшифрован только при наличии корректного ключа. В отличие от
классического JWT, Iron делает акцент не только на подписи, но и на
шифровании содержимого, что меняет подход к проектированию данных внутри
токена.
Основное правило проектирования: токен — это транспортный механизм, а не хранилище состояния приложения.
Любая информация, помещённая внутрь токена, становится:
Поэтому выбор между токеном и базой данных — это выбор между временной, переносимой идентификацией и централизованным, изменяемым состоянием.
Токен должен содержать минимальный набор данных, необходимый для идентификации запроса и базовой авторизации.
Наиболее безопасный и распространённый вариант:
userIdsub (subject)const payload = {
userId: 42
};
Этот идентификатор используется как ключ для дальнейшего обращения к базе данных.
Любой токен должен иметь ограниченный срок действия:
exp (expiration time)iat (issued at)В Iron эти параметры часто добавляются автоматически, но концептуально они всегда должны присутствовать.
const payload = {
userId: 42,
exp: Date.now() + 1000 * 60 * 15
};
Допустимо хранить только те данные, которые не требуют мгновенного обновления:
role: "admin" | "user")isVerified)const payload = {
userId: 42,
role: "admin"
};
Важно учитывать, что любые изменения ролей не вступят в силу до перевыпуска токена.
Иногда добавляется:
sessionIddeviceIdЭто позволяет связать токен с серверной сессией или конкретным устройством.
const payload = {
userId: 42,
sessionId: "a8f3c1"
};
Iron шифрует данные, но это не отменяет фундаментального принципа: токен может быть украден, сохранён или переиспользован.
Нельзя помещать:
Даже при шифровании это создаёт ненужные риски и усложняет ротацию данных.
Любая информация, которая может измениться без перевыпуска токена:
Причина: токен становится неактуальным сразу после изменения данных в системе.
Iron-токен передаётся в каждом запросе. Поэтому нельзя хранить:
Это приводит к:
Если токен отвечает за идентификацию, то база данных отвечает за истинное состояние системы.
База данных должна хранить:
id | name | email | hashed_password | created_at
Все изменяемые атрибуты пользователя находятся здесь.
Вместо хранения ролей в токене лучше использовать таблицы:
Это позволяет менять доступ без перевыпуска токена.
Если требуется контроль сессий:
Любая предметная область:
Архитектурно система строится вокруг принципа:
токен содержит ссылку на данные, база данных содержит сами данные
userIduserId происходит запрос в базуДублирование информации между токеном и базой приводит к рассинхронизации.
Пример проблемы:
"user""admin"Система будет вести себя неконсистентно до перевыпуска токена.
Iron отличается тем, что:
Это создаёт иллюзию безопасности, но не отменяет архитектурных ограничений:
Чем больше данных в токене, тем сложнее:
Токен не предназначен для хранения кэшированных данных пользователя. Это приводит к:
Полное доверие токену без обращения к базе данных допустимо только в крайне ограниченных сценариях. В реальных системах это приводит к:
Любая система, использующая Iron, должна придерживаться разделения: