我正在构建一个带有jwt身份验证的nodejs服务器。
目前,我的 jwt 的有效期为 1 个月。 如果用户进入登录页面,我会检查他的请求是否包含有效的 jwt,如果是,他不必输入用户名和密码。 如果他注销,则 jwt 将在客户端删除,因此用户下次必须使用他的凭据登录。
如果攻击者侦听连接(我已经在使用 ssl(并获取令牌怎么办? 即使用户注销并在下一个会话中获取新令牌,攻击者也可以使用旧令牌模拟用户,只要它有效,对吗?
-
将用户的"当前"令牌的 IAT 存储在数据库中并将其与请求中令牌的 IAT 进行比较以避免攻击者的访问是否是一个好主意?
-
我知道,1 个月对于 jwt 来说是相当长的时间。我还想到了每次客户端登录时生成一个新令牌的想法(经验时间为 2 天(。但是,如果攻击者只获得 1 个有效令牌,他也会获得新令牌,不是吗?
你有什么建议吗?
谢谢,干杯!
您的顾虑正是安全人员建议不要将 JWT 用于会话数据的原因之一 - 请参阅"您不能使单个 JWT 令牌无效"部分。 换句话说,使 JWT 令牌失效的唯一方法是在呈现数据库时强制进行数据库查找 - 但这首先破坏了 JWT 的全部要点(大多数人使用它们,因为他们试图避免在服务器上进行数据库查找(。
将令牌和任何会话数据(例如登录用户的用户 ID(存储在服务器上。这使您可以完全控制数据和会话。它还消除了许多滥用途径(JWT 标准允许(。
执行此操作时,如果您知道令牌被盗,只需在服务器上将其标记为无效,并让您的应用程序忽略它。
实际上,这意味着只需在 cookie 中拥有一个令牌,并将用户 ID 和其他会话数据存储在数据库表或服务器端缓存(例如 mysql 表或 redis 缓存(中。