Безопасность и сертификаты
Claims JWT: что означают exp, iat и nbf
Claims exp, nbf и iat — это значения NumericDate: числа секунд от эпохи Unix. Они обозначают разные моменты жизненного цикла токена.
Опубликовано
NumericDate — это секунды с начала эпохи Unix
Временные claims JWT используют JSON-число секунд с 1970-01-01T00:00:00Z без учёта дополнительных секунд. Чтобы передать такое число в конструктор JavaScript Date, умножьте его на 1000.
const expiresAt = new Date(payload.exp * 1000);exp: время истечения
Токен нельзя принимать в момент exp и после него. Декодер может сравнить число с текущими часами, но приложению всё равно нужны проверенный токен и ясная политика для отсутствующего или некорректного срока.
if (nowSeconds >= payload.exp) reject("expired");nbf: токен недействителен до этого времени
Токен нельзя принимать до nbf. Это поддерживает отложенную активацию, запланированный доступ и другие сценарии, где выпуск происходит раньше разрешённого использования.
if (nowSeconds < payload.nbf) reject("not active yet");iat: время выпуска, а не правило истечения
iat фиксирует время выпуска токена и помогает вычислить возраст или обнаружить очевидно будущую метку. Он не определяет срок истечения и не заменяет exp.
const tokenAgeSeconds = nowSeconds - payload.iat;Сравнение exp, iat и nbf
| Claim | Значение | Типичная проверка для отказа |
|---|---|---|
| exp | Время истечения | now >= exp |
| nbf | Недействителен до | now < nbf |
| iat | Время выпуска | Проверка возраста или будущего времени по политике приложения |
Для расхождения часов нужен небольшой явный допуск
Спецификация JWT допускает небольшой запас на расхождение часов. Ограничьте и задокументируйте его: большой допуск незаметно продлевает период, когда можно принять просроченный или ещё не действующий токен.
Чек-лист проверки временных claims
- Проверьте подпись, прежде чем доверять любому временному claim.
- Везде используйте секунды и сравнивайте с надёжными часами.
- Отклоняйте повреждённые или нечисловые значения согласно политике приложения.
- Используйте один документированный допуск на расхождение часов.
- Также проверяйте issuer, audience и обязательные прикладные claims.
Проверьте пример
Проверьте exp, iat и nbf как значения NumericDate
Payload содержит все три зарегистрированных временных claim для сравнения секунд и отформатированных дат.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSBMb3ZlbGFjZSIsImFkbWluIjp0cnVlLCJpYXQiOjE3MDAwMDAwMDAsIm5iZiI6MTY5OTk5OTkwMCwiZXhwIjoyMTQ3NDgzNjQ3fQ.ZGVtby1zaWduYXR1cmUОжидаемый результат: Таблица timestamps показывает время выпуска, начало действия и истечение в UTC и локальном представлении.
Прочитайте временные метки
Посмотрите exp, iat и nbf как даты
Декодируйте синтетический токен и сравните каждый исходный NumericDate с представлением в UTC и локальном времени.