实施JWT的最佳方式?

时间:2016-03-01 16:22:03

标签: php security jwt slim

我正在创建JWT身份验证,我有些疑惑:

  1. 增加安全性,保存在数据库中可能是一个好主意 每次,如果API发送令牌,用户的令牌和检查 匹配保存到数据库中的那个?这真的很有用吗?

  2. 为了避免在会话中保存用户信息,最好放电子邮件, 如果他在JWT的有效载荷中是管理员等?

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

  4. 最好将令牌保存为Cookie或网络存储空间?

2 个答案:

答案 0 :(得分:2)

  

增加安全性,可能是一个好主意保存在数据库中   如果API发送的令牌匹配,则每次都有用户的令牌和检查   用一个保存到数据库中?这真的很有用吗?

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

  

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

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

  

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

由你决定。如果存储在cookie中,则会随每个请求一起发送。如果您更愿意使用JavaScript检索该值,请使用Web存储。如果使用cookie,请设置Secure标志以防止它通过普通HTTP泄漏,并设置HttpOnly标志以保护它免受域上任何XSS漏洞的影响。 Web存储无法以相同的方式对XSS进行保护(您需要确保整个域都受到保护),但不太可能通过普通HTTP泄露。

答案 1 :(得分:1)

与@SilverlightFox的响应类似 - 请注意,您可能需要数据库检查刷新令牌但不能访问令牌。这样你可以调整持续时间,因为你希望权衡安全性和效率