为啥 JWT 是无状态认证?

Posted

技术标签:

【中文标题】为啥 JWT 是无状态认证?【英文标题】:Why JWT is a stateless authentication?为什么 JWT 是无状态认证? 【发布时间】:2019-09-16 19:03:44 【问题描述】:

我试图了解 JWT 身份验证如何是无状态的。在有状态身份验证中,会有一个会话 id。这里有一个已签名的 JWT 令牌。所以认证服务器发出 JWT 令牌,但是我可以说在后续请求中对 JWT 令牌的验证是由端点服务器(应用程序服务器)而不是认证服务器完成的。我相信这是可能的,因为 JWT 是用到期日期(以及其他一些信息)签名的,并且身份验证服务器的公共证书对所有端点服务器都可用。

所以认证服务器将只负责颁发令牌而不是验证。验证将由端点服务器完成。

我的理解正确吗?这就是 JWT 无状态的方式吗?否则,我看不出它与有状态身份验证有何不同,因为两者都可以使用令牌来实现。

在有状态身份验证中,中心化服务器将负责颁发令牌以及验证每个请求。

【问题讨论】:

发行服务器必须不维护已发行令牌的任何状态。 谢谢乔纳森。这是否意味着任何服务器都可以验证 JWT(不仅仅是发布服务器)?不是这个主意吗? 是的。任何信任签署 JWT 的证书的人都会信任 JWT——无需询问发行服务器。 谢谢!现在很清楚了。如果您添加了这是答案部分,我可以接受这个作为答案(如果您现在添加,我会接受)。再次感谢您! 【参考方案1】:

JSON Web Tokens (JWT) 被称为 stateless 因为授权服务器需要保持无状态;令牌本身就是验证令牌持有者授权所需的全部内容。

JWT 使用无法伪造的数字签名算法(例如 RSA)签名。因此,任何信任签名者证书的人都可以放心地相信 JWT 是真实的。服务器无需咨询令牌颁发服务器来确认其真实性。

请注意,在此图中,资源服务器不需要与授权服务器进行核对:

来源:https://jwt.io/introduction/

【讨论】:

【参考方案2】:

在无状态身份验证中,无需在会话中存储用户信息。我们可以轻松地使用相同的令牌从我们登录的域以外的域中获取安全资源。

参考:https://www.jbspeakr.cc/purpose-jwt-stateless-authentication/

【讨论】:

以上是关于为啥 JWT 是无状态认证?的主要内容,如果未能解决你的问题,请参考以下文章

带有 JWT 的 Spring Security Oauth2 真的是无状态的吗?

一步步带你了解前后端分离利器之JWT

为啥说“HTTP 是无状态协议”?

用户认证:基于jwt和session的区别和优缺点

新的无状态 JWT 认证理念!它真的安全吗?

jwt 无状态分布式授权