我完全知道JWT是什么。但是,众所周知,撤销JWT存在问题。
例如,我读过here:
在某些情况下,我们希望HelpTap中的用户通过以下方式注销 清理cookie,但我们不能要求它们每次都这样做。 还要考虑用户手机被盗的情况,而他想 退出所有现有的会话(例如Gmail退出其他会话 特征)。好吧,在JWT的情况下是不可能的。
但是,如果我可以将用户的信息存储在jwt数据部分中,那么我还可以在服务器中创建一个数据库,该数据库将检查是否应撤销特定用户。
如果应该,那么我可以发送一个新的JWT。
问题:
我想念什么?我肯定可以撤消特定用户的JWT并将其发送给他。
答案 0 :(得分:2)
当然,您可以创建一个JWT,并将其(或它的JTI)存储在数据库中,并且可以使用该数据库查找令牌并拒绝吊销的令牌。
但是JWT中的要点是它是无状态的。如果您必须进行数据库查询来检查它,那么也可以向用户发送简单的旧随机会话ID,并在服务器端检索用户数据,这实际上比任何JWT都更安全。通过使用数据库查找,您几乎只具有JWT和会话组合的缺点,并且您的JWT不仅仅是状态会话ID。
答案 1 :(得分:2)
JWS(即签名的JWT)依靠密码签名来确保声明的完整性,因此许多应用程序开发人员倾向于使用它来提供声明。 无状态身份验证:如果签名有效且令牌未过期,则可以信任令牌,而无需依赖服务器上存储的任何状态。
这是一种很棒且强大的方法,但它带有权衡:当您需要管理令牌吊销时,它没有给您太多控制权。因此,它不是 one-size-fits-all 方法:它在某些情况下(例如微服务身份传播)可能效果很好,但可能并不适合所有应用程序。
如果您需要撤消令牌的功能,则需要付出一定的代价:您需要在服务器的某个位置(白名单或黑名单中)跟踪令牌。
要实现此目的,可以为每个令牌分配一个唯一的标识符,然后将该标识符存储在服务器中。验证令牌时,除了检查签名和到期日期外,还必须检查令牌标识符是否已列入白名单(或未列入黑名单)。
最后,jti
声明旨在在令牌中存储唯一标识符:
jti
(JWT ID)声明为JWT提供了唯一的标识符。标识符值的分配方式必须确保将相同值偶然分配给不同数据对象的可能性极小;如果应用程序使用多个发行者,则还必须防止不同发行者产生的值之间发生冲突。jti
声明可用于防止重播JWT。jti
值是区分大小写的字符串。使用此声明是可选的。