实现 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 的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章