为啥要在服务器端保存刷新令牌?

Posted

技术标签:

【中文标题】为啥要在服务器端保存刷新令牌?【英文标题】:Why should refresh tokens be saved in the server side?为什么要在服务器端保存刷新令牌? 【发布时间】:2019-12-03 20:58:00 【问题描述】:

我了解访问令牌(通常)不会保存在服务器端,只是使用一些密钥算法进行验证。但是,似乎正常行为是将刷新令牌保存在服务器端(即:数据库),并在用户尝试刷新其访问令牌时将其与用户进行比较。我的问题是为什么不以验证访问令牌的方式验证刷新令牌?

【问题讨论】:

【参考方案1】:

如果令牌是针对数据库验证的 ID,通常会更安全,因为这允许随时撤销令牌(通过将其从数据库中删除或将其标记为无效)。

自我验证令牌,例如 JWT,不能被撤销(不使用数据库,这会破坏使用自我验证令牌的大部分好处)——它们只能过期。因此,它们的有效期应该很短。自验证令牌的好处不仅在于性能,还在于消除依赖关系,因为资源服务器不需要连接到授权服务器拥有的数据库。相反,它可以简单地使用受信任的公钥自行验证令牌。

使用数据库也更容易实现,因为大多数 Web 应用程序已经有了一个,而且自我验证令牌很容易出错(那里有许多 JWT 库存在缺陷或错误的默认值)。

刷新令牌仅用于请求新的访问令牌,因此性能并不重要。请求被发送到授权服务器,该服务器“拥有”任何与授权相关的数据库,因此它不会添加任何不需要的依赖项。

请注意,访问令牌不必是自验证令牌。如果它们也只是针对数据库验证的 ID,那就太好了。访问令牌和刷新令牌之间的分离只能使选择使用自验证访问令牌的实现成为可能。

【讨论】:

以上是关于为啥要在服务器端保存刷新令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何在前端和后端存储 JWT 刷新令牌?

为啥 APP 要用 token 而不用

JWT, 为啥需要刷新令牌?

在 NextJS 中刷新用户身份验证服务器端?

刷新的 OAuth2 令牌具有无效签名 (Azure AD OAuth2)

为啥要撤销访问令牌?