Node.js 处理偷来的JWT?

Node.js 处理偷来的JWT?,node.js,security,jwt,credentials,client-side-attacks,Node.js,Security,Jwt,Credentials,Client Side Attacks,我正在使用jwt身份验证构建一个nodejs服务器 目前我的JWT有效期为1个月。 如果用户进入loggin页面,我检查他的请求是否包含有效的jwt,如果是,他不必输入用户名和密码。 如果用户注销,jwt将在客户端被删除,因此用户下次必须使用其凭据登录 如果攻击者侦听连接(我已经在使用ssl)并获取令牌,该怎么办。 即使用户注销并在下一次会话中获得新令牌,攻击者也可以使用旧令牌模拟用户,只要旧令牌有效,对吗 将用户的“当前”令牌的IAT存储在DB中,并将其与请求中令牌的IAT进行比较,以避免攻击

我正在使用jwt身份验证构建一个nodejs服务器

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

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

  • 将用户的“当前”令牌的IAT存储在DB中,并将其与请求中令牌的IAT进行比较,以避免攻击者的访问,这是一个好主意吗

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

  • 你有什么建议吗


    谢谢,干杯

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

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


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

    您的担忧正是其中一个原因——请参阅“无法使单个JWT令牌无效”一节。换句话说,使JWT令牌无效的唯一方法是在它出现时强制进行数据库查找——但这首先破坏了JWT的整个要点(大多数人使用JWT是因为他们试图避免在服务器上进行数据库查找)

    然后我应该使用什么来代替JWT?;)@mcAngular2执行会话管理的传统方法是使用存储在数据库中的会话id。几乎每个web应用程序框架都支持这一点。许多开发人员正在切换到JWTs以避免数据库访问,但正如我们所看到的,正是您提出的要点,它带来了安全后果。如果您使用的是Oauth或open id connect,那么使用JWTs是合理的,前提是访问令牌的生命周期较短,但您不希望对刷新令牌使用JWTs。我同意这个答案。JWT不得用于会话管理。请注意,最近的规范还允许将令牌绑定到当前连接(HTTPS或HTTP)RFC8471到RFC8473,以防止使用被盗令牌。