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