实现 JWT 的最佳方式?

Posted

技术标签:

【中文标题】实现 JWT 的最佳方式?【英文标题】:Best way to implement JWT? 【发布时间】:2016-06-14 04:12:19 【问题描述】:

我正在创建 JWT 身份验证,但我有一些疑问:

    为了提高安全性,最好保存在数据库中 用户的令牌,并且每次检查 API 发送的令牌是否 与保存到数据库中的匹配?真的有用吗?

    为了避免在会话中保存用户信息,放置电子邮件是个好主意吗? 如果他是 JWT 有效负载中的管理员等?

    如果我将用户信息保存在 JWT 的有效负载中,并且用户更改了他的 电子邮件或其他信息,我如何自动更新用户的 令牌保存在他的浏览器中?

    最好将令牌保存为 cookie 或网络存储?

【问题讨论】:

你读过jwt.io吗?如果是 - 你为什么要问这个问题? 一件事:“我正在创建 JWT 身份验证”请告诉我你不是在滚动自己的。请使用an existing library。 @ScottArciszewski。我正在使用 Firebase JWT。昨天,我开始阅读和创建我的第一个 jwt 身份验证 @u_mulder:不,我不知道那个网站。 您确定 JWT 适合您吗? cryto.net/~joepie91/blog/2016/06/19/… 【参考方案1】:

为了提高安全性,最好保存在数据库中 用户的令牌,每次都检查 API 发送的令牌是否匹配 保存到数据库中的那个?真的有用吗?

这完全违背了使用 JWT 的目的。 JWT 的优点是您不必在服务器端跟踪会话 - 它们纯粹是客户端。 JWT 的缺点是您无法因此而撤销令牌(您支付的价格)。如果您想要额外的安全性,请不要使用 JWT 并使用随机令牌(CSPRNG,128 位)在服务器端跟踪会话。

为了避免在会话中保存用户信息,放置电子邮件是否是个好主意,如果 他是 JWT 有效负载中的管理员等? 如果我将用户信息保存在 JWT 的有效负载中,并且用户更改了他的 电子邮件或其他信息,我如何自动更新用户的令牌 保存在他的浏览器中?

您可以使用用户标识符而不是电子邮件。例如,用户表的主键。然后,如果他们更新他们的信息,令牌仍然有效。您应该设置较短的到期日期,因此如果用户不再是管理员,他们将不得不请求一个新令牌(通常称为刷新令牌),并且新令牌不会拥有管理员声明。

最好将令牌保存为 cookie 或网络存储?

由你决定。如果存储在 cookie 中,它会随每个请求一起发送。如果您希望使用 javascript 检索值,请使用网络存储。如果使用 cookie,请设置 Secure 标志以防止它通过普通 HTTP 泄漏,并设置 HttpOnly 标志以保护它免受域上的任何 XSS 漏洞的影响。 Web 存储无法以相同的方式抵御 XSS(您需要确保整个域都受到保护),但是通过普通 HTTP 泄露的可能性较小。

【讨论】:

【参考方案2】:

与@SilverlightFox 的响应类似 - 请注意,您可能需要数据库检查刷新令牌而不是访问令牌。这样您就可以根据需要调整持续时间,以在安全性和效率之间进行权衡

【讨论】:

以上是关于实现 JWT 的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JWT 进行身份验证的最佳实践

Spring Boot 中 JWT 的最佳实践是啥?

使用护照 jwt 进行身份验证

存储JWT令牌的位置?

混合护照-facebook和passport-jwt的最佳方法是什么?

Token存储方式JWT