authentication - JSON Web token (JWT) 的安全性和可靠性问题

标签 authentication authorization jwt access-token api-design

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

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

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

据我所知,JWT 似乎是一个不断发展的标准。它基本上保存了调用者的数据,因此每次他发出 API 请求时,您都需要使用您的 secret 加密(base64(header) + "."+ base64(payload)),然后进行比较它带有 token 本身最后部分提供的签名。它避免了必须执行数据库事务。

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

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

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

最佳答案

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

使用 JWT,您还可以设置 token 黑名单来存储注销和过期时间之间的 token 、标记过期并在每个请求中检查它。您可以仅包含 ID(JWT 的 jti 声明)或使用上次登录日期和 iat 声明(发布于)

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

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

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

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

关于authentication - JSON Web token (JWT) 的安全性和可靠性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38940671/

相关文章:

php - 限制文件下载php

spring-boot - 如何在 Spring Boot 中使用 Authentication Basic 获取作为 header 发送的访问 token

Android Webview Facebook 登录

linux - 登录 RHEL 时的自定义启动画面

c# - 在 WinRT 应用程序中重新请求授权

java - 是否有用于 aws cognito API 的 JWT 验证的 java 示例?

java - 如何从 Flutter 中的 RSA 私钥生成 token ?

android - 如何确定移动应用程序中用户的登录状态

c# - 我们可以在 web.config 中为 SSO 使用多个联合配置吗?

python - App Engine 的用户名和密码登录?