Remember Me如何在Spring Security中工作?

Rom*_*man 12 java tomcat spring-security remember-me

我很好奇Remember Me如何工作以及它如何在Spring Security中运行?

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

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

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

PS弹簧安全和重新部署的另一个相关问题:即使我没有打勾RememberMe并登录,我仍然可以在重新部署约3分钟后得到认可.它可以修复吗?

mat*_*t b 12

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

这种方法使用散列来实现有用的记住策略.本质上,在成功进行交互式身份验证后,cookie将被发送到浏览器,其中cookie的组成如下:

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

...

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

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

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

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


axt*_*avt 10

不要将会话cookie与Remember Me cookies混淆.

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

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

要通过Remember Me cookie对用户进行身份验证,Spring Security提供了两种策略: