JWT 似乎不是 REST API 的安全解决方案

Posted

技术标签:

【中文标题】JWT 似乎不是 REST API 的安全解决方案【英文标题】:JWT seems to be not secure solution for a REST API 【发布时间】:2020-09-23 22:02:45 【问题描述】:

我正在开发一个 REST API,但 JWT 在我看来是错误的。我们都称它们为“无状态令牌”,但实际上它们带来了很多问题。

我们都说,它们不应该存储在数据库或内存缓存解决方案中。但是对我来说,该 API 有 3 个核心条件,请告诉我如何在不访问/存储在 DB 中的情况下实现它们。

    当用户更改密码时,令牌应该失效 立即。 当用户注销时,令牌应该失效 立即。 架构应该可以轻松地进行水平扩展。我不想惹麻烦。

如果我们在每个请求中针对这些条件进行数据库/缓存查找,JWT 是一个完全没用的解决方案,不是吗?

【问题讨论】:

有新的cmets吗? 【参考方案1】:

我不相信 JWT 允许像您正在寻找的那样强制到期。您希望使用的更多的是参考令牌,可以在这里找到https://identityserver4.readthedocs.io/en/latest/topics/reference_tokens.html?highlight=reference。

话虽如此,JWT 仍然非常有用。但是,它们最好在非常短的到期日内实施。

【讨论】:

我看到很多 API 以错误的方式使用 JWT。因为,我在上面提到的条件对于 REST API 来说是非常常见的东西。如果您设置非常短的到期日期,那仍然不能提供正确的东西。一分钟就是一分钟。它应该失效,这是一个安全漏洞。 您可能会在 blog.logrocket.com/jwt-authentication-best-practices 找到一些关于如何使 JWT 令牌“过期”的答案。但是,这不是 JWT 框架中内置的逻辑,而是您必须在其之上构建的东西。 JWT 代币非常有用,但它们确实有一些权衡,必须接受其风险。 如果我为这些 JWT 令牌使用 Redis 白名单。会是什么?很难扩展吗? 我不确定。当我们需要严格的使任何令牌过期的能力时,我们会使用引用令牌。我之前没有使用过 Redis 缓存。 这个引用令牌是直接存储在数据库中的吗?

以上是关于JWT 似乎不是 REST API 的安全解决方案的主要内容,如果未能解决你的问题,请参考以下文章

使用 JWT 安全令牌访问 REST API

使用 REST API 如何进行 JWT 令牌安全管理?

SpringBoot采用jwt作为REST API安全机制的应用示例

需要一些有关 REST API 的 JWT 身份验证的信息

使用 Spring 安全性和 JWT 在 REST 中使用 <img> 标签访问私有图像

使用JWT或OAuthv2保护REST + AngularJS