2010-06-29 51 views
9

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

据我所知,服务器发送长寿命的cookie到客户端。然后客户端发回cookie并且服务器可以识别客户端,因为在服务器上存在类似散列图的关系cookie --> session

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

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

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

回答

9

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

该方法使用哈希来实现有用的记忆我策略。本质上,一个cookie发送到在成功进行认证的浏览器,使用的cookie组成如下:

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

...

这样的记得,我的标记只为指定期限,并且前提是用户名,密码和密钥不会更改。值得注意的是,这存在潜在的安全问题,因为捕获的记忆我令牌将可用于任何用户代理直到令牌过期。这与摘要式身份验证相同。

基本上cookie包含用户名,密码,到期时间和一个密钥(您指定),所有这些密码都是hashed。当你的浏览器发送该cookie的内容到服务器,春季安全:

  1. 从后端指定用户名找回密码
  2. 计算的用户名/密码/等的md5Hex()从数据库进行比较它到cookie中的值
  3. 如果它们匹配 - 您已登录!如果不匹配,那么您提供了伪造的cookie或者其中一个用户名/密码/密钥已更改。

这里的基本假设是,散列函数 - 的md5Hex()部的上方 - 提供了一种容易地编码某些数据块在一个方向上又是非常硬且不切实际的反向(从md5Hex恢复密码文本)。

8

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

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

记住我Cookie由Spring Security发送,以在不同会话中验证客户端(例如,原始会话到期后或服务器重新启动后)。默认情况下使用,不太安全 - - cookie包含密码的哈希和其他数据

  • PersistentTokenBasedRememberMeServices - 更安全

    • TokenBasedRememberMeServices

      要通过记住使用网站Spring Security提供两种策略验证用户,需要数据库访问 - cookie包含存储在数据库中的唯一标识符

  • 相关问题