JSON Web Token 和 2038 年错误

JSON Web Token and the year 2038 bug

JSON Web Token is a fairly recent standard (May 2015) and yet they decided to go for UNIX timestamps in order to represent dates.

这不是将标准暴露给潜在的 Year 2038 problem in the various implementations? Instead, going for something like the ISO8601 似乎更适合未来。

为什么要二选一?

Unix 时间戳还不错——它们绝对可以帮助您简化一系列计算,而不是解析日期。

在大多数情况下,JWT 中的日期声明应该与 NOW()(想想 exp 声明)进行比较,因此在那里使用时间戳是有意义的。

我不担心 Y2038 错误,因为 32 位系统会比发布 JWT 有更大的问题。

JSON 不限制数字的精度,因此 JWT 格式本身不存在溢出问题。这完全取决于实施。

某些实现,例如 JavaScript,将所有 JSON 数字视为双精度浮点数。虽然在宇宙热寂之前它们不会溢出,但在不到 3 亿年的时间里它们将开始变得不准确,并且随着时间的推移问题会变得更糟(比如你创建一个代币的问题一小时后到期,但该值不能表示为双精度浮点数,最接近的值在 2 小时内,因此它要到 2 小时后才会到期。

其他实现可能使用 64 位有符号整数。这些将在 3000 亿年后溢出,在太阳变成红巨星并吞噬地球之后很久。

唯一易受 Y2038 问题影响的实现是在解析日期时决定使用 32 位带符号整数的实现。这样的实现是愚蠢的。无论你选择什么格式,你都无法防止愚蠢 - ISO8601 在这里没有任何帮助,因为虽然这可能是网络上出现的内容,但每个单独的实现都会将它解析为一定数量的时间自某个时代以来的单位,因为这是所有计算机处理日期的方式,并且是实际进行计算的唯一方式,例如令牌是否已过期。因此,即使在使用 ISO8601 时,每个实现都容易选择精度较低的数字表示来处理特定时间之后的日期,包括选择带符号的 32 位整数将日期表示为自 1970 年以来的秒数,即 Y2038 问题.由每个实现选择一个适当大小的数字类型来表示它们解析的日期,您可能会发现它们都这样做(如果没有,您应该报告错误)。

所以,不,JWT 使用自 UNIX 纪元以来的秒数作为日期没有任何问题。