Remember Me如何在Spring Security中工作?

时间:2010-06-29 16:31:52

标签: java tomcat spring-security remember-me

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

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

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

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

P.S。 Spring Security和重新部署的另一个相关问题:即使我没有勾选RememberMe并登录,我仍然可以在重新部署约3分钟后得到认可。它可以修复吗?

2 个答案:

答案 0 :(得分:12)

The Spring Security docs discuss这实际上是如何运作的。

  

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

     

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

     

...

     

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

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

  1. 从后端检索给定用户名的密码
  2. 从数据库计算用户名/密码/ etc的md5Hex()并将其与Cookie中的值进行比较
  3. 如果匹配 - 您已登录!如果不匹配,那么您提供了伪造的cookie或其中一个用户名/密码/密钥已更改。
  4. 这里的基本假设是散列函数 - 上面的md5Hex()部分 - 提供了一种方法,可以在一个方向上轻松编码某些数据,但却非常难以逆转(从中恢复密码) md5Hex文字)。

答案 1 :(得分:10)

请勿将会话Cookie与Remember Me Cookie混淆。

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

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

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