Механизм «токен внутри токена» в библиотеке Iron основан на идее многослойной защиты данных. Внешний токен выполняет роль контейнера, внутри которого находится другой токен — уже содержащий полезную нагрузку (payload) или дополнительные уровни аутентификации. Такой подход применяется для повышения безопасности, разделения ответственности и гибкости в управлении доступом.
В Iron каждый токен представляет собой зашифрованную и подписанную строку, формируемую на основе пароля (или набора паролей) и параметров криптографии. Вложенность означает, что результат одной операции seal становится входом для другой.
Структура выглядит следующим образом:
OuterToken = seal({
inner: InnerToken,
metadata: {...}
}, outerPassword)
InnerToken = seal({
user: {...},
permissions: [...]
}, innerPassword)
Ключевые особенности:
Вложенные токены позволяют передавать ограниченный доступ третьим сторонам:
Шлюз проверяет внешний слой, не имея доступа к чувствительным данным внутри.
Разделение позволяет обновлять или отзывать один уровень, не затрагивая другой.
Микросервисы могут работать только с внешним токеном, не имея доступа к внутренним данным.
const Iron = require('@hapi/iron');
const innerPayload = {
userId: 123,
role: 'admin'
};
const innerPassword = 'inner-secret';
const innerToken = await Iron.seal(innerPayload, innerPassword, Iron.defaults);
const outerPayload = {
token: innerToken,
issuedAt: Date.now()
};
const outerPassword = 'outer-secret';
const outerToken = await Iron.seal(outerPayload, outerPassword, Iron.defaults);
Процесс происходит в обратном порядке:
const outerData = await Iron.unseal(outerToken, outerPassword, Iron.defaults);
const innerData = await Iron.unseal(outerData.token, innerPassword, Iron.defaults);
Использование разных паролей критически важно:
Можно задавать разные TTL:
Каждый слой:
Это означает, что:
Использование одного и того же пароля для обоих уровней:
Слишком глубокая структура:
Оптимально — 2 уровня.
Если внутренний токен передаётся отдельно:
Каждый вызов seal и unseal:
Рекомендации:
Iron позволяет настраивать параметры:
const options = {
encryption: {
algorithm: 'aes-256-cbc'
},
integrity: {
algorithm: 'sha256'
}
};
Внутренний и внешний токены могут использовать разные конфигурации.
Внешний токен может содержать:
Внутренний — только бизнес-данные.
Можно обновлять:
Это особенно полезно в распределённых системах.
JWT не поддерживает нативную вложенность:
Iron:
Генерация внутреннего токена (данные пользователя)
Оборачивание во внешний токен (сессионный уровень)
Передача внешнего токена клиенту
По запросу:
Для анализа:
Ошибки чаще всего возникают из-за:
Вложенные токены в Iron — это:
Они особенно эффективны в архитектурах с несколькими уровнями доверия, где требуется строгое разграничение доступа и контроль над данными на каждом этапе обработки.