rest - JWT 好像不安全?不是吗?
问题描述
我正在开发一个 REST API,但 JWT 对我来说看起来不对。我们都称它们为“无状态令牌”,但实际上它们带来了很多问题。
我们都说,它们不应该存储在数据库或内存缓存解决方案中。但是对我来说,该 API 有 3 个核心条件,请告诉我如何在不访问/存储在数据库中的情况下实现它们。
当用户更改密码时,令牌应立即失效。当用户注销时,令牌应立即失效。该架构应该可以轻松地水平扩展。我不想惹麻烦。如果我们在每个请求中针对这些条件进行数据库/缓存查找,JWT 是一个完全没用的解决方案,不是吗?
解决方案
根据您的要求,它们大多不适合。您可以在服务器端使用户会话无效,也可以是无状态的,但不能两者兼而有之。
“不安全”是一个强有力的声明,但默认情况下它们不会缓解某些威胁。
JWT 在不了解风险和限制的情况下被过度使用。JWT 的一种用途是单点登录场景,但实际上并没有很多人需要它。另一种用途是真正的无状态应用程序,但这些都有风险。JWT 有一些用途,它们并非无用,但它们的使用量往往超出应有的范围。
如果您需要服务器端会话失效(强制注销),您的解决方案将不是无状态的。如果你想要无状态,JWT 很棒,但你必须接受它们的风险和限制。如果您有一个身份提供者的 sso,该身份提供者发布您的应用程序用来验证用户的令牌,那么 JWT 是通过 OpenID Connect 实现这一目标的标准方法。如果您想说将有限的、有时间限制的会话传递给 Web 应用程序以外的其他东西,那么 JWT 可能会派上用场。在用户登录同一域并仅查看页面或使用同一来源的 api 的普通 Web 应用程序中,普通的旧会话 id 更安全。
简而言之,您需要为工作选择正确的工具。有时它是 JWT,但有时不是。
推荐阅读
- amazon-web-services - 在 AWS EFS 上可以边读边写吗?
- android - 使用具有多个 .a 文件的 cmake for android 构建库 [CMake 无法确定目标的链接器语言]
- javascript - 链接 .apply() 和 .bind() 令人惊讶的行为
- amazon-web-services - ECS 容器中的临时 DNS/Internet 中断
- math - 三次贝塞尔曲线 - 获得给定 X 的 Y - 控制点 X 增加的特殊情况
- python - 将数组转换为 python 列表列表
- html - Ionic 3 - 离子选择无法看到选择选项的值
- angular - 如何在 PDF.js 中将 blob 传递给 viewer.js 以及如何在单独的窗口中显示 pdf
- jupyter-notebook - 将 ipython 笔记本转换为笔记本时隐藏一些单元格
- javascript - 如何从 Firebase 获取文档准备好的数据