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

问题描述 投票:0回答:1

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

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

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

据我所知,JWT 似乎是一个不断发展的标准。它基本上保存了调用者的数据,因此每次他向您发出 API 请求时,您都会使用您的

encrypt(base64(header) + "." + base64(payload))
,并将其与令牌本身最后部分中提供的签名进行比较。它避免了必须执行数据库事务。

问题

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

选项2

。网站的流量将受到限制且较小,因此将令牌存储在数据库中似乎是一个小而值得的权衡,并允许我对这些令牌执行任何我想要的操作,包括管理它们的生命周期和权限。它还可以避免像选项 1 那样暴露用户的凭据,以防他们在其他在线服务中使用相同的凭据。 我只是想知道我对智威汤逊的担忧是否正确,或者我是否误解了它的功能?另外,即使我已经阅读了很多有关这些不同选项的内容,请随意链接任何可以启发我并帮助我做出更好选择的内容。谢谢。

authentication authorization jwt access-token api-design
1个回答
2
投票

使用 JWT,您还可以设置一个

令牌黑名单

来存储注销和过期时间之间的令牌,标记过期并在每个请求中检查它。您可以仅包含 ID(JWT 的 secret 声明)或使用上次登录日期和

jti
声明(发布于)
当用户更改密码/权限时使令牌无效的其他技术是使用这些字段的哈希对令牌进行签名。如果字段值发生更改,任何先前的令牌都会自动验证失败。 

参见

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

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

iat

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.