处理被盗的 JWT?

Posted

技术标签:

【中文标题】处理被盗的 JWT?【英文标题】:Handle stolen JWT? 【发布时间】:2019-03-30 09:13:24 【问题描述】:

我正在构建一个带有 jwt 身份验证的 nodejs 服务器。

目前我的 jwts 有 1 个月的到期时间。 如果用户进入登录页面,我会检查他的请求是否包含有效的 jwt,如果是,他不必输入用户名和密码。 如果他注销,jwt 会在客户端被删除,因此用户下次必须使用他的凭据登录。

如果攻击者监听连接(我已经在使用 ssl)并获取令牌怎么办。 即使用户注销并在下一次会话中获得新令牌,攻击者也可以使用旧令牌冒充用户,只要它是有效的,对吗?

    将用户的“当前”令牌的IAT存储在数据库中并与请求中令牌的IAT进行比较以避免攻击者访问是否是一个好主意?

    我知道,1 个月对于 jwt 来说是相当长的时间。我也有想法在每次客户端登录时生成一个新令牌(有效期为 2 天)。但如果攻击者只获得 1 个有效令牌,他也会获得新令牌,不是吗?

你有什么建议吗?

谢谢,干杯!

【问题讨论】:

【参考方案1】:

您的担忧正是security people advise against using JWTs for session data 的原因之一——请参阅“您不能使单个 JWT 令牌无效”部分。换句话说,使 JWT 令牌无效的唯一方法是在出现时强制进行数据库查找——但这首先破坏了 JWT 的全部意义(大多数人使用它们是因为他们试图避免数据库查找在服务器上)。

【讨论】:

我应该用什么来代替 JWT ?;) @mcAngular2 进行会话管理的传统方式是使用存储在数据库中的会话 ID。几乎每个 Web 应用程序框架都为此提供支持。许多开发人员正在切换到 JWT 以避免数据库访问,但正如我们所看到的,正是您提出的观点,它带来了安全后果。如果您使用 Oauth 或 open id connect,则使用 JWT 是合理的,前提是您的访问令牌的生命周期很短——但您不想为刷新令牌这样做。 我同意这个答案。 JWT 不得用于会话管理。作为记录,请注意最近的规范还允许将令牌绑定到当前连接(HTTPS 或 HTTP)RFC8471 到 RFC8473,以防止使用被盗令牌。【参考方案2】:

在服务器上存储令牌和任何会话数据(例如登录用户的用户 ID)。这使您可以完全控制数据和会话。它还消除了许多滥用途径(JWT 标准允许这样做)。

这样做时,如果您知道令牌被盗,您只需在服务器上将其标记为无效,并让您的应用程序忽略它。

实际上,这意味着在 cookie 中只包含一个令牌,并将用户 ID 和其他会话数据存储在数据库表或服务器端缓存(例如 mysql 表或 redis 缓存)中。

【讨论】:

以上是关于处理被盗的 JWT?的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 ASP.NET Core Web API 免受被盗 JWT 令牌以进行模拟

公共设施被盗难处理,Yunxion货物监控设备来助力

qmail处理用户权限被盗用大量发送垃圾邮件

为啥 JWT 长度超过?我们能处理吗?

如何正确处理 JWT 刷新?

第十一篇SpringSecurity基于JWT实现Token的处理