简体中文

开发者工具 · JWT 解码器

JWT exp、iat 和 nbf:NumericDate 是秒,而不是毫秒

· 工作原理

jwt 时间戳 调试

JWT NumericDate 秒与毫秒浏览器时钟对齐
原始 ToolAcre 矢量图

JavaScript 给你毫秒,而 JWT 需要秒,所以时间戳的错误是千分之一。这篇文章解释了 NumericDate 以及如何正确读取三个时间声明。

永不过期或在到达之前过期的令牌 - 单位错误的两个症状

千分之一的错误会产生严重的症状。在代币生产者期望纪元秒的地方提供 JavaScript 毫秒可以将到期时间推迟数千年。再次除以秒值可以将其放置在 1970 附近,使新颁发的令牌在其第一个合法请求之前看起来已过期。

解码器通过在 ISO 读数旁边显示数字声明来帮助揭示比例。该显示仅用于诊断。攻击者可以将任何 `exp`、`iat` 或 `nbf` 数字写入未签名或伪造的有效负载中,因此转换后的时钟时间只有在其他地方进行签名和策略验证后才具有权威性。

NumericDate 7519 — 自 Unix 纪元以来的秒数,作为 JSON 数字,允许使用分数,但很少使用

JWT 时间声明使用 NumericDate 表示形式:一个 JSON 数字,从 Unix 纪元开始计算秒数。小数可以表示亚秒位置,因为实现在构造日期之前将该值乘以 1,000。它不会首先将有效的有限数舍入为整数。

ToolAcre 将 `exp`、`nbf`、`iat`、`auth_time` 和 `updated_at` 识别为用于显示的时间形状字段。只有前三个属于其注册权利要求描述。非数字、无限或无效的日期结果将被忽略,而不是呈现为有意义的时间,从而防止诸如“soon”之类的字符串伪装成时间戳。

Date.now() 是毫秒 - JavaScript 习惯会产生遥远的未来到期

`Date.now()` 返回毫秒,而 NumericDate 值以秒表示。因此,从浏览器时钟导出声明的生产者需要进行显式的比例转换,通常在应用自己的舍入策略之前除以 1,000 。 ToolAcre 读取路径执行逆乘法仅用于显示。

保持单位转换在代码审查中可见。 `exp` 中的 13 位数字是一个有用的警告标志,但数字计数不是验证,不能取代生产者的合同。解码器将尝试呈现 JavaScript Date 可以表示的任何有限数字声明;它不会默默地将毫秒重新解释为秒。

exp、nbf 和 iat — 过期、不早于和发布于,以及验证者如何应用它们

`exp` 指定验证者不应再根据其策略接受令牌的时间。 `nbf` 指定一个边界,在该边界之前不应接受该边界。 `iat`记录发布时间。 ToolAcre 标记这些含义,并仅将 `exp` 和 `nbf` 与提供的参考时钟进行比较。

当解码的到期时间早于现在时,返回的状态为 `expired`;当不早于现在时,返回的状态为 `future`;对于其他显示的时间声明,返回的状态为 `past`。这些标签是关于有效负载算术的观察结果。它们不是身份验证决策,也不评估发行者、受众、密钥或签名。

时钟差异和余地属于验证者;该解码器既不定义

概要询问了多少时钟偏差是合理的,但 JWT 解码器配置和实现都没有定义回旋余地。该号码属于验证者及其部署要求。在这里发明默认值会将检查文章变成未记录的安全策略,因此本节故意不提供任何内容。

如果服务拒绝边界附近的令牌,请使用可信日志比较服务时钟、颁发者时钟和配置的验证者策略。 ToolAcre 解决针对浏览器当前日期的索赔,没有容差窗口。因此,即使两者解析相同的数字,其结果也可能与故意留有余地的服务器不同。

工作示例 - 将示例 exp 值转换为人类可读的时间并根据 iat 检查它

假设合成有效负载包含 `iat: 1717243200` 和 `exp: 1717246800`。乘以 1,000 得到 ISO 时刻 `2024-06-01T12:00:00.000Z` 和 `2024-06-01T13:00:00.000Z`。减去原始秒值会得到一小时的间隔,而无需将浏览器毫秒混合到计算中。

该算术描述了有效负载的内容。它并不表明发行人选择了这些值或一小时适合任何应用程序。 ToolAcre 漂亮地打印数字,生成 UTC 行,并且可以将到期日期称为相对于今天的旧日期;验证者必须独立验证并执行自己的接受规则。

这不包括什么——特定服务器是否会接受令牌,这取决于它的时钟和余地;解码器显示值,而不是结论

解码器无法预测特定服务器是否会接受令牌。服务器可以使用不同的时钟、配置的容差、更严格的声明模式或附加的发行者和受众检查。仅签名失败就可以拒绝显示的 NumericDates 看起来非常普通的令牌。

相反,面向未来的到期并不会使未经验证的令牌有效。将时间表视为发现可能的单元错误并收集调试证据的一种方法。实际的结论属于服务器日志或具有预期密钥和策略的受控验证测试,而不是在解码面板中。

要点:阅读声明,进行算术运算 — ToolAcre JWT 解码器显示 exp、iat 和 nbf,以便您可以自己检查单位

阅读声明并故意执行比例算术:NumericDate 秒仅在日期边界处变为 JavaScript 毫秒。 ToolAcre 在源代码中显式地进行乘法运算并显示结果 ISO 值,同时忽略格式错误的时间类型,而不是猜测其作者的意图。

保持安全区别同样明确。 `exp` 显示不是到期强制, `nbf` 显示不是准入控制,并且 `iat` 不是发行证明。检查一次性令牌后,使用受信任的验证程序对其进行身份验证并应用服务的真实时钟和声明策略。