我很好奇“记住我”是如何工作的,以及它在Spring Security中是如何工作的?
我知道服务器会向客户端发送长寿的cookie。然后客户端发回cookie,服务器可以识别客户端,因为在带有关系cookie --> session的服务器上有类似散列映射的东西。
我不明白在服务器Tomcat重启后,服务器端应用程序如何通过cookie识别客户端。
Spring Security在服务器关机前如何以及在哪里保存cookie-session映射?它是特定于服务器的吗(例如,在Tomcat、Jetty等中发生了一些不同的事情)?
另外,还有一个与Spring Security和重新部署相关的问题:即使我没有勾选RememberMe并登录,在重新部署大约3分钟后,我仍然被识别。它是可修复的吗?
发布于 2010-06-30 00:48:38
The Spring Security docs discuss这实际上是如何工作的。
这种方法使用散列来实现一个有用的“记住我”策略。本质上,cookie在交互式身份验证成功后被发送到浏览器,cookie的组成如下:
base64(username + ":" + expirationTime + ":" + md5Hex(username + ":" + expirationTime + ":" password + ":" + key))
..。
因此,在用户名、密码和密钥不变的情况下,remember-me令牌仅在指定的时间段内有效。值得注意的是,这存在一个潜在的安全问题,因为在令牌过期之前,任何用户代理都可以使用捕获的remember-me令牌。这是与摘要身份验证相同的问题。
基本上,cookie包含用户名、密码、过期时间和密钥(由您指定),所有这些都是hashed。当您的浏览器将此cookie的内容发送到服务器时,Spring Security:
cookie
md5Hex(),并将其与cookie
这里的基本假设是,哈希函数-上面的md5Hex()部分-提供了一种在一个方向上轻松编码某些数据的方法,但是要反转(从md5Hex文本恢复密码)是非常困难和不切实际的。
发布于 2010-06-30 00:56:52
不要将会话cookie与记住我的cookie混淆。
会话cookie由服务器(例如Tomcat)发送,用于将传入请求与会话相关联。
记住我cookie是由Spring Security发送的,用于在不同的会话中对客户端进行身份验证(例如,在原始会话到期或服务器重新启动后)。
为了通过Remember Me cookie认证用户,Spring Security提供了两种策略:
cookie -缺省情况下使用,安全性较低-
TokenBasedRememberMeServices包含口令和其他dataPersistentTokenBasedRememberMeServices的哈希-更安全,需要数据库访问- cookie包含存储在数据库中的唯一标识符
https://stackoverflow.com/questions/3142722
复制相似问题