【发布时间】:2021-09-10 00:31:56
【问题描述】:
我一直在阅读有关此主题的大量内容,并且可以看到使用 JWT 进行身份验证有许多不同的观点和方法。
我的理解如下: 在最简单的形式中,JWT 身份验证机制应该:
- 验证用户名和密码。
- 创建一个签名的 JWT 访问令牌,其中包含有关用户的信息(取决于应用的需要)。
- 在响应中发送该令牌。
- 客户端然后存储令牌(据我了解,对于安全 cookie 或 localStorage 是否更安全存在一些争议),并与每个请求的标头一起发送。
- 然后服务器可以授权用户使用中间件验证 JWT。没有状态,所有信息都包含在 JWT 中。
假设 JWT 没有过期(或者可能是一个很长的过期日期,可能是几个月),这听起来不错,因为我可以为用户提供很长时间的持久登录状态。据我了解,担心的是,如果 JWT 被盗,它本质上是一张无限制的访问卡和一个巨大的安全漏洞。
这就是刷新令牌进入的地方,服务器会发出刷新令牌和访问令牌(刷新令牌具有长/无限过期和访问令牌短)。
服务器数据库保存某种有效刷新令牌表(因此,如果一个被盗,它可以很容易地失效),并且在发布新的访问令牌时,验证刷新令牌。
这还需要在前端添加某种倒计时机制,以便在访问令牌到期日期之前向服务器发送刷新请求,这样用户就不会被注销。
还有我的问题:
为什么?如果我们经历了为刷新令牌创建数据库表的所有麻烦,为什么不制作一个有效访问令牌表并在需要时使它们无效呢?这比使用刷新令牌更安全吗?
谢谢
【问题讨论】:
标签: node.js express authentication jwt