提问者:小点点

JSON Web令牌(JWT)的安全性和可靠性问题


我正在为个人项目创建API和SPA,我在以下解决方案之间犹豫不决以验证用户身份(注意:通过HTTPS):

  1. HTTP基本身份验证(每个请求发送用户名/密码)
  2. 基于令牌的身份验证(将SHA1-ed用户令牌存储在数据库中)
  3. JSON Web Token(JWT)认证

我什至不考虑OAuth,因为它似乎真的很痛苦,而且我不需要使用其他应用程序进行身份验证,我只关心对用户进行身份验证。

据我所知,JWT似乎是一个不断发展的标准。它基本上保存了调用者的数据,所以每次他发出API请求时,您都可以使用您的秘密对其进行加密。它避免了执行数据库事务。

问题是,如果我使用JWT 1)我不可能手动撤销特定的令牌,最重要的是2)如果我更改用户的权限,先前授予的JWT仍然拥有旧数据和他的旧权限,只要他没有获得具有新权限的新令牌,这可能会授予/限制他对某些数据的持续访问,这真的很有问题,我很惊讶我还没有看到任何人提到这个问题。此外,3)JWT声称允许服务器在没有访问数据库的情况下验证访问,但我无法想象任何不涉及数据库的API请求,如果只是为了返回用户要求的数据。所以这个论点对我来说没有任何意义。

对我来说,我现在最好的选择是选项2。网站将具有受限和较小的流量,因此在数据库中存储令牌似乎是一个很小且值得的权衡,并允许我使用这些令牌做任何我想做的事情,包括管理它们的生命周期和权限。它还避免像选项 1 中那样暴露用户的凭据,以防他们对其他在线服务使用相同的凭据。

我只想知道我对JWT的担忧是正确的还是我误解了它的功能?此外,即使我已经阅读了很多关于这些不同选项的内容,也可以随意链接任何可以启发我并帮助我做出更好选择的内容。谢了。


共1个答案

匿名用户

您是对的,在到期时间之前使令牌无效是一个常见的JWT问题。有几个原因需要考虑:帐户已删除/被阻止/暂停,密码已更改,权限已更改,用户已由管理员注销。

使用JWT,您还可以设置一个令牌黑名单来存储注销之间的令牌

当用户更改其密码/权限时,使令牌无效的其他技术是用这些字段的散列来签署令牌。如果字段值发生变化,任何先前的令牌都会自动验证失败。

看见https://stackoverflow.com/a/37520125/6371459

最后,请注意令牌是使用服务器私钥(未加密)签名的

sign(base64(header) + "." + base64(payload))