1

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

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

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

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

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

你有什么建议吗?

谢谢,干杯!

4

2 回答 2

2

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

于 2018-10-25T18:21:34.290 回答
-1

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

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

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

于 2018-10-25T17:26:09.280 回答