提问者:小点点

将JWT存储在数据库中有意义吗?[关闭]


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章来回答事实和引文。

原始关闭原因未解决

我已经实现了一个基本的身份验证系统,将Spring Boot,Spring Security,OAUTH2和JWT作为身份验证令牌。它工作正常,但我在想将 JWT 存储在数据库中并在每次有人使用它发出经过身份验证的请求时检查令牌是否存在是否有意义?我特别想到了以下场景:用户在移动设备中进行身份验证,但他们丢失了它,因此他们想要取消对该设备的授权。然后,他们将能够发出一个操作,清除颁发给其用户 ID 的令牌,并取消授权分配给他的所有令牌。还有其他方法吗?我是否认为这是错误的或过于复杂的事情?

这是为了保护将从移动应用程序调用的REST API。


共2个答案

匿名用户

您可以将JWT存储在数据库中,但您会失去JWT的一些好处。JWT为您提供了无需每次都检查数据库中的令牌的优势,因为您可以使用密码学来验证令牌是否合法。如果您必须在数据库中查找令牌,您还不如使用不透明的令牌,它不携带信息,让服务器和数据库为您提供信息。另一方面,如果您要在数据库中存储令牌,我认为JWT对于您的令牌类型来说不是一个糟糕的选择。如您所说,如果您将令牌存储在数据库中,则撤销具有优势。这完全取决于您想要实现的目标(更快的授权等与按需撤销的能力)。

如果需要,您仍然可以将JWT与OAuth2一起使用,而无需在数据库中存储令牌。JWT有一个可配置的到期时间,您可以设置-之后它们无效。访问令牌(无论是否是JWT)通常应该是短暂的,以确保安全。如果担心某人的手机被盗并获得访问令牌,我认为解决方案是让这些令牌快速过期(30分钟?)。如果您使用的是oAuth2,阻止某人继续使用该应用程序的方法是让真正的所有者取消授权授权服务器上的移动应用程序客户端,这样就不会再提供访问令牌。

匿名用户

您可以设置到期日期(对于移动设备 1 周)。为用户添加一些自定义字段刷新 ID(您可以为此使用 uuid)。下一组 在声明参数 (“iat”) 下发出。将刷新 Id 存储到 db 中,并将其设置为声明参数。然后,每次验证令牌时,都应检查令牌的“年龄”。如果超过一小时,则应从数据库加载数据并检查 refreshId 值,并使用当前“iat”值创建新令牌并将其发送到移动设备。当您需要停用令牌时,只需在数据库中为 refreshId 生成新值。一小时后,所有令牌都将不正确,因此用户需要再次登录每台设备。如果需要,您可以制作更多自定义解决方案。