Oauth 为什么要将刷新令牌保存在服务器端?

Oauth 为什么要将刷新令牌保存在服务器端?,oauth,jwt,refresh-token,Oauth,Jwt,Refresh Token,我知道访问令牌通常不会保存在服务器端,只是使用一些密钥和算法进行验证。然而,正常的行为似乎是在服务器端i.e:数据库中保存一个刷新令牌,并在用户尝试刷新其访问令牌时将其与用户的进行比较。我的问题是,为什么不以验证访问令牌的相同方式验证刷新令牌?如果令牌是针对数据库进行验证的ID,则通常更安全,因为这允许随时通过从数据库中删除令牌或将其标记为无效来撤销令牌 自验证令牌(如JWT)不能在不使用数据库的情况下撤销,这会破坏使用自验证令牌的大部分好处—它们只能过期。因此,它们的有效期应该很短。自验证令牌

我知道访问令牌通常不会保存在服务器端,只是使用一些密钥和算法进行验证。然而,正常的行为似乎是在服务器端i.e:数据库中保存一个刷新令牌,并在用户尝试刷新其访问令牌时将其与用户的进行比较。我的问题是,为什么不以验证访问令牌的相同方式验证刷新令牌?

如果令牌是针对数据库进行验证的ID,则通常更安全,因为这允许随时通过从数据库中删除令牌或将其标记为无效来撤销令牌

自验证令牌(如JWT)不能在不使用数据库的情况下撤销,这会破坏使用自验证令牌的大部分好处—它们只能过期。因此,它们的有效期应该很短。自验证令牌的好处不仅是性能,而且消除了依赖关系,因为资源服务器不需要连接到授权服务器拥有的数据库。相反,它可以简单地使用可信公钥自行验证令牌

使用数据库也更容易实现,因为大多数web应用程序已经有了一个数据库,而且自验证令牌很容易出错。有许多JWT库存在缺陷或不好的默认值

刷新令牌仅用于请求新的访问令牌,因此性能并不重要。请求被发送到授权服务器,授权服务器拥有任何与授权相关的数据库,因此不会添加任何不需要的依赖项

请注意,访问令牌不必是自验证令牌。如果它们也是针对数据库进行验证的简单ID,那么这是非常好的。访问令牌和刷新令牌之间的分离只允许选择使用自验证访问令牌的实现