【发布时间】:2022-01-20 19:38:55
【问题描述】:
老实说,我找不到我正在寻找的答案,所以这是我正在努力解决的一个问题,
让我说一件事,如果我要说的完全是狗屁,请告诉我,但我所追求的解决方案也很好
tldr:将客户端日期与 jwt.exp 进行比较以确定 jwt 是否过期是不安全的
让我们看一下典型的 react(client) 和 nodejs(server) 示例,其中 JWT 访问令牌被插入到请求标头中,以便从受保护的 API 路由中获取数据,
- 客户端向服务器发送登录请求,
- 服务器在响应中返回访问令牌(例如,有效期为 2 分钟)并创建一个带有刷新令牌的 cookie(例如,有效期为一天) - 两个令牌都是根据服务器时间创建的
现在假设服务器上的时间是下午 3 点,客户端上的时间是下午 1 点 不是因为时区 - 客户端和服务器都在同一个时区,客户端系统时钟无论出于何种原因都只是落后 2 小时
现在,用户已登录,客户端可以将访问令牌添加到请求标头中
3 分钟后,另一个请求会在标头中发送带有访问令牌的请求,以获取一些秘密数据, 请求在客户端被拦截,然后它到达服务器以检查 jwt.exp 以防需要静默 JWT 刷新
所以它运行
如果 Date.now() > JWT.exp
它会返回 false,下午 1:03 不是 > 然后是下午 3:03
如果为 false -> 不需要进行静默令牌刷新
但由于访问令牌仅在 2 分钟内有效,请求显然失败
服务器时间落后于客户端时间的场景,可能会使访问令牌的有效时间比它实际应该有效的时间长
现在,我是个白痴吗?或者我认为检查JWT.exp时应该与服务器时间进行比较是正确的,因为服务器创建了令牌,
感谢阅读
【问题讨论】: