在我看来,基于JWT的身份验证是当前最先进的用户身份验证方法。
Spring安全性允许通过覆盖WebSecurityConfigurerAdapter
的configure(HttpSecurity http)
方法来轻松配置安全机制。在这个方法中,我可以将login方法设置为formLogin。据我所知,使用formLogin身份验证,用户需要为每个发送到服务器的请求指定用户名和密码。另一种方法是使用基于JWT的身份验证,在这种情况下,每个请求都需要向服务器发送一个访问令牌。我看不出后者比前者有什么好处,所以我希望有人能给我解释一下。
1条答案
按热度按时间ac1kyiln1#
我不打算解释所有的区别,有太多的区别,但让我们看看一些:
**基于会话的登录(FormLogin)**您向服务器提供您的用户名和密码。然后服务器创建一个会话令牌。这个令牌通常只是一个随机字符串。但是在我们将这个字符串提供给客户端之前,我们还将该字符串存储在服务器上,并且在它旁边存储一个布尔标记,告诉我们该会话是“已登录”的,或者我们通常称之为已验证的。
每次客户端需要发出请求时,都会把这个会话令牌发送给我们,每次有人把这个令牌发送给我们时,我们都会在我们的小存储器中检查是否有这个令牌的记录,并将标记设置为true。
于是我们检查:
当客户端想要注销时,他们只需向我们发送一个注销请求,而我们只需从我们的小存储中删除该记录。
到目前为止一切正常。让我们介绍另一个服务器。
因此,首先服务器使用用户名和密码对用户进行身份验证,然后我们创建一个会话cookie并将其返回给浏览器,我们也存储它,一切都与之前相同。
但这次我们将cookie(我们的会话令牌)提供给2号服务器。
服务器2不知道这个令牌是什么。它没有要检查的存储,因为它不是首先创建令牌的服务器。因此,服务器必须随后调用创建令牌的服务器,或者创建令牌的服务器必须在之前将会话信息发送到服务器2。
这样就很难扩展了,因为服务器需要不断地相互交流,询问诸如“这是什么令牌?"、“它有效吗?”之类的问题。如果您有数百台服务器和数百万用户,这将是一个问题。
基于标记(使用JWT的oauth2)
在一个基于令牌的世界里,你有一个人来验证一个用户(可能使用用户名和密码),还有一个人来发行一个令牌。
JWT是加密签名的,这意味着如果我们有一个密钥,我们就可以检查令牌是否被更改或篡改。
如果我们确保所有的服务器都有密钥,所有的服务器就可以独立地检查它们收到的每个令牌是否真实。它们不需要询问发行者它是否真实,因为它们可以自己检查。
这样,服务器就不需要不断地询问创建令牌的服务器“这个令牌是什么?它有效吗?”等等。
因此,只要我们能够确保所有需要验证令牌的服务器都有正确的密钥来进行验证,我们现在就可以进行扩展。
在这种情况下,没有一个拥有者拥有所有令牌的完整记录,这意味着很难注销某个人。
每个令牌都包含一个时间戳Map,表示它的有效期,当它无效时,客户端需要刷新此令牌。
而这正是事情通常变得复杂的地方。
所以它们一点也不一样。基于会话和基于令牌是非常不同的,我不能向你解释所有的区别,但在这里有一些。如果你想了解更多信息,我建议你在互联网上阅读更多。