处理被盗的JWT?

时间:2018-10-25 17:08:25

标签: node.js security jwt credentials client-side-attacks

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

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

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

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

  2. 我知道,jwt需要1个月的时间。我也有想法,每次客户端登录时都会生成一个新令牌(exp。time 2 days)。但是,如果攻击者仅获得1个有效令牌,那么他也将获得新令牌,不是吗?

您有什么建议吗?

谢谢,干杯!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-1)

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

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

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