我很好奇Remember Me如何工作以及它如何在Spring Security中运行?
我知道服务器会向客户端发送长期存在的cookie。然后客户端发回cookie,服务器可以识别客户端,因为服务器上的哈希映射类似cookie --> session
。
我不明白服务器[服务器端应用程序]在服务器[Tomcat]重新启动后如何通过cookie识别客户端。
Spring Security在服务器关闭之前如何以及在何处保存cookie-session
地图?它是特定于服务器的(即在Tomcat,Jetty等中发生了不同的事情)吗?
P.S。 Spring Security和重新部署的另一个相关问题:即使我没有勾选RememberMe
并登录,我仍然可以在重新部署约3分钟后得到认可。它可以修复吗?
答案 0 :(得分:12)
The Spring Security docs discuss这实际上是如何运作的。
这种方法使用散列来实现有用的记住策略。本质上,在成功进行交互式身份验证后,cookie将被发送到浏览器,其中cookie的组成如下:
base64(username + ":" + expirationTime + ":" + md5Hex(username + ":" + expirationTime + ":" password + ":" + key))
...
因此,remember-me令牌仅在指定的时间段内有效,并且前提是用户名,密码和密钥不会更改。值得注意的是,这具有潜在的安全性问题,因为捕获的记住我令牌将可以从任何用户代理使用,直到令牌到期为止。这与摘要式身份验证的问题相同。
基本上,cookie包含用户名,密码,到期时间和密钥(您指定的密钥),所有这些都是hashed。当您的浏览器将此cookie的内容发送到服务器时,Spring Security:
md5Hex()
并将其与Cookie中的值进行比较这里的基本假设是散列函数 - 上面的md5Hex()
部分 - 提供了一种方法,可以在一个方向上轻松编码某些数据,但却非常难以逆转(从中恢复密码) md5Hex
文字)。
答案 1 :(得分:10)
请勿将会话Cookie与Remember Me Cookie混淆。
会话cookie由服务器(例如Tomcat)发送,用于将传入请求与会话相关联。
记住我是由Spring Security发送的cookie,用于在不同的会话中对客户端进行身份验证(例如,在原始会话到期后或服务器重新启动后)。
要通过Remember Me cookie对用户进行身份验证,Spring Security提供了两种策略:
TokenBasedRememberMeServices
- 默认情况下使用,安全性较低 - Cookie包含密码和其他数据的哈希值PersistentTokenBasedRememberMeServices
- 更安全,需要数据库访问 - cookie包含存储在数据库中的唯一标识符