记住我如何在Spring Security中工作?

2022-09-04 08:38:34

我很好奇Remember Me是如何工作的,它在Spring Security中是如何工作的?

我知道服务器向客户端发送长期存在的cookie。然后客户端将cookie发送回去,服务器可以识别客户端,因为服务器上有关系的哈希映射。cookie --> session

我不明白服务器[服务器端应用程序]如何在服务器[Tomcat]重新启动后通过cookie识别客户端。

在服务器关闭之前,Spring Security如何以及在哪里保存地图?它是特定于服务器的(即在Tomcat,Jetty等中发生了不同的事情)?cookie-session

附言:Spring安全和重新部署的另一个相关问题:即使我不打勾并登录,在重新部署约3分钟后,我仍然会被识别出来。它是可修复的吗?RememberMe


答案 1

Spring Security文档讨论了这实际上是如何工作的。

这种方法使用散列来实现有用的“记住我”策略。实质上,在成功的交互式身份验证后,Cookie 会发送到浏览器,其组成如下:

base64(username + ":" + expirationTime + ":" + md5Hex(username + ":" + expirationTime + ":" password + ":" + key))

...

因此,记住我令牌仅在指定的时间段内有效,并且用户名,密码和密钥不更改。值得注意的是,这存在一个潜在的安全问题,因为捕获的记住我令牌将可从任何用户代理使用,直到令牌过期。这与摘要式身份验证的问题相同。

基本上,Cookie包含用户名,密码,到期时间和密钥(您指定),所有这些都是散列在一起的。当您的浏览器将此cookie的内容发送到服务器时,Spring Security:

  1. 从后端检索给定用户名的密码
  2. 从数据库中计算用户名/密码/等,并将其与 cookie 中的值进行比较md5Hex()
  3. 如果它们匹配 - 您已登录!如果不匹配,则表示您提供了伪造的 Cookie 或用户名/密码/密钥之一已更改。

这里的基本假设是,哈希函数 ( 上面的部分 - 提供了一种在一个方向上轻松编码某些数据的方法,但很难逆转(从文本中恢复密码)是非常困难和不切实际的。md5Hex()md5Hex


答案 2

不要将会话 Cookie 与“记住我”Cookie 混淆。

会话cookie由服务器(例如Tomcat)发送,并用于将传入请求与会话相关联。

记住我cookie由Spring Security发送,用于在不同的会话中对客户端进行身份验证(例如,在原始会话到期后或服务器重新启动之后)。

要通过记住我cookie对用户进行身份验证,Spring Security提供了2种策略:


推荐