В стандарте JSON Web Token (JWT) временные ограничения являются
ключевым механизмом защиты токена от повторного использования и
преждевременной активации. В библиотеке Jsrsasign проверка этих
параметров реализуется через встроенные функции валидации, которые
учитывают системное время и значения полей exp и
nbf.
Поле exp (expiration time) определяет момент, после
которого токен считается недействительным. Поле nbf (not
before) задаёт момент, ранее которого токен не должен приниматься
системой. Оба значения представлены в формате Unix timestamp (секунды с
1 января 1970 года UTC).
При валидации JWT библиотека Jsrsasign сравнивает текущее время с
полем exp.
Если текущее время больше или равно значению exp, токен
считается истёкшим и отклоняется.
Пример структуры payload:
{
"sub": "user123",
"iat": 1710000000,
"exp": 1710003600
}
В этом случае токен действителен только в течение одного часа после создания.
Ключевой момент заключается в том, что проверка exp
всегда выполняется в сравнении с текущим временем системы, а не временем
создания токена.
Поле nbf используется для ограничения преждевременного
использования токена.
Если текущее время меньше значения nbf, токен считается
ещё не активным.
Пример payload:
{
"sub": "user123",
"nbf": 1710000000,
"exp": 1710003600
}
Такой токен не может быть использован до наступления времени
nbf, даже если он корректно подписан и не истёк.
В реальных сценариях оба поля используются одновременно, образуя временное окно валидности токена:
{
"sub": "user123",
"nbf": 1710000000,
"exp": 1710007200
}
Токен считается валидным только в интервале:
nbf ≤ current_time < exp
Любое нарушение этого условия приводит к отклонению токена при проверке.
В Jsrsasign чаще всего используется функция
KJUR.jws.JWS.verifyJWT, которая автоматически учитывает
exp и nbf, если включена соответствующая опция
проверки времени.
Пример базовой проверки:
const isValid = KJUR.jws.JWS.verifyJWT(token, publicKey, {
alg: ["RS256"]
});
Для более строгого контроля времени используется параметр
verifyAt:
const result = KJUR.jws.JWS.verifyJWT(token, publicKey, {
alg: ["RS256"],
verifyAt: KJUR.jws.IntDate.get("now")
});
При этом библиотека самостоятельно извлекает exp и
nbf из payload и сравнивает их с заданным временем
проверки.
Если поле exp отсутствует, токен считается бессрочным с
точки зрения времени окончания, что на практике нежелательно в системах
с безопасной архитектурой.
Если отсутствует nbf, токен становится действительным
сразу после выдачи, без задержки активации.
Jsrsasign не требует обязательного наличия этих полей, но логика безопасности приложения обычно предполагает их использование.
При работе с exp и nbf важно учитывать
несколько особенностей:
Пример учёта допуска времени:
KJUR.jws.JWS.verifyJWT(token, publicKey, {
alg: ["RS256"],
verifyAt: KJUR.jws.IntDate.get("now") + 30
});
Здесь добавляется 30 секунд допустимого смещения.
На практике часто встречаются следующие проблемы:
Неверный формат времени Использование миллисекунд вместо секунд приводит к мгновенному истечению токена.
Несинхронизированные часы сервера Даже корректный токен может быть отклонён, если системное время отличается от времени, использованного при генерации.
Отсутствие nbf при отложенной активации Токен становится активным сразу, что нарушает ожидаемую бизнес-логику.
Слишком большой срок действия exp Долгоживущие токены увеличивают риск компрометации.
Проверка exp и nbf выполняется только после
успешной проверки подписи токена. Это означает, что даже если временные
параметры корректны, но подпись невалидна, токен будет отклонён раньше
этапа проверки времени.
Последовательность проверки в Jsrsasign:
nbfexpДля работы с временными значениями библиотека предоставляет утилиту
KJUR.jws.IntDate, которая позволяет преобразовывать и
получать текущее время в формате JWT:
const now = KJUR.jws.IntDate.get("now");
Также можно задавать смещения:
const future = KJUR.jws.IntDate.get("now + 3600");
Эти значения часто используются при формировании exp и
nbf.
Комбинация exp и nbf формирует временную
модель доверия к токену. Она позволяет:
Эти параметры не являются формальной частью криптографической подписи, но критически влияют на реальную безопасность системы авторизации.