В спецификациях JWT и JWS время всегда хранится как целое число, представляющее количество секунд, прошедших с 1 января 1970 года UTC (Unix Epoch). Такой формат упрощает сравнение, вычисления и передачу временных меток между системами.
В библиотеке Jsrsasign для этих целей используется класс
KJUR.jws.IntDate, который предоставляет удобные методы для
преобразования дат в числовой формат и обратно, а также для выполнения
операций со временем без использования громоздких объектов
Date в чистом виде.
Ключевая идея IntDate — работа исключительно с целыми
секундами, а не миллисекундами, как это принято в стандартном
JavaScript Date.
IntDate — это числовое значение:
1714650000
Это количество секунд с начала эпохи Unix.
Для сравнения:
Date.now() возвращает миллисекундыIntDate работает в секундахРазница принципиальна, так как JWT стандарт (RFC 7519) требует именно секунды.
KJUR.jws.IntDate.getNow()
Возвращает текущее время в формате IntDate.
Эквивалент:
Math.floor(Date.now() / 1000)
Используется при формировании JWT claims:
iat (issued at)nbf (not before)exp (expiration time)KJUR.jws.IntDate.getInt(date)
Преобразует объект Date в Unix time (секунды).
Пример:
const d = new Date("2026-01-01T00:00:00Z");
const intDate = KJUR.jws.IntDate.getInt(d);
Результат — целое число секунд.
Особенность реализации:
KJUR.jws.IntDate.getDate(intDate)
Преобразует числовое значение обратно в объект JavaScript
Date.
Пример:
const date = KJUR.jws.IntDate.getDate(1714650000);
Это полезно при разборе JWT, когда необходимо отобразить временные поля в человекочитаемом виде.
KJUR.jws.IntDate.getString(intDate)
Возвращает строковое представление даты в UTC формате.
Пример результата:
"2026-05-02T12:00:00Z"
Используется для логирования и отладки JWT токенов.
В JSON Web Token временные поля строго определены:
iat — время выпуска токенаexp — время истеченияnbf — токен не действителен до этого времениПример payload:
const payload = {
sub: "user123",
iat: KJUR.jws.IntDate.getNow(),
exp: KJUR.jws.IntDate.getNow() + 3600,
nbf: KJUR.jws.IntDate.getNow()
};
Здесь IntDate обеспечивает корректный формат, совместимый с RFC.
IntDate позволяет выполнять арифметику времени напрямую через секунды.
Так как IntDate — это число, добавление выполняется обычной арифметикой:
const now = KJUR.jws.IntDate.getNow();
const inOneHour = now + 3600;
const inOneDay = now + 86400;
Это стандартный подход для JWT expiration logic.
Типичный сценарий — сравнение текущего времени и
exp:
function isTokenExpired(exp) {
return KJUR.jws.IntDate.getNow() > exp;
}
Также учитывается возможный временной сдвиг (clock skew), когда серверы могут иметь небольшую разницу во времени.
Пример с запасом:
const skew = 60; // 60 секунд
const isExpired = KJUR.jws.IntDate.getNow() > (exp + skew);
Несмотря на наличие IntDate, в реальных приложениях часто требуется
конвертация в стандартный Date.
const date = new Date();
const intDate = KJUR.jws.IntDate.getInt(date);
const backToDate = KJUR.jws.IntDate.getDate(intDate);
Это полезно для:
Важно учитывать:
Это может влиять на:
При проверке токена библиотека Jsrsasign опирается на IntDate для сравнения claims:
iat — проверка времени выпускаexp — проверка срока действияnbf — проверка минимального времени начала
действияПример логики:
const now = KJUR.jws.IntDate.getNow();
if (payload.nbf && now < payload.nbf) {
throw new Error("Token not active yet");
}
if (payload.exp && now > payload.exp) {
throw new Error("Token expired");
}
При создании JWT важно избегать ошибок:
Date.now() без деления на 1000Правильный подход:
const iat = KJUR.jws.IntDate.getNow();
const exp = iat + 3600;
const token = {
iat,
exp
};
IntDate всегда работает в UTC, что исключает:
Это делает формат устойчивым в распределённых системах.
// ошибка
const exp = Date.now() + 3600;
Правильно:
const exp = KJUR.jws.IntDate.getNow() + 3600;
new Date() > exp // некорректно
Правильно:
KJUR.jws.IntDate.getNow() > exp
Использование IntDate напрямую влияет на:
Модель работы основана на простом принципе: всё время — это число секунд, и оно сравнивается без дополнительной логики