Java 还记得我在春季安全工作吗?

Java 还记得我在春季安全工作吗?,java,tomcat,spring-security,remember-me,Java,Tomcat,Spring Security,Remember Me,我很好奇MemberMe是如何工作的,它在SpringSecurity中是如何工作的 我知道服务器会向客户端发送长寿命cookie。然后客户机将cookie发送回服务器,服务器可以识别该客户机,因为服务器上有类似于哈希映射的东西,它与cookie-->会话有关系 我不明白服务器[Tomcat]重启后,服务器[server-side application]如何通过cookie识别客户端 在服务器关闭之前,Spring Security如何以及在何处保存cookie会话映射?是否特定于服务器(例如

我很好奇MemberMe是如何工作的,它在SpringSecurity中是如何工作的

我知道服务器会向客户端发送长寿命cookie。然后客户机将cookie发送回服务器,服务器可以识别该客户机,因为服务器上有类似于哈希映射的东西,它与
cookie-->会话
有关系

我不明白服务器[Tomcat]重启后,服务器[server-side application]如何通过cookie识别客户端

在服务器关闭之前,Spring Security如何以及在何处保存cookie会话映射?是否特定于服务器(例如,Tomcat、Jetty等中发生了一些不同的情况)

还有一个与Spring安全和重新部署相关的问题:即使我没有勾选
RememberMe
并登录,重新部署大约3分钟后,我仍然被识别。它能修好吗

这实际上是如何工作的

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

base64(用户名+”:“+expirationTime+”:“+md5Hex(用户名+”:“+expirationTime+”:“密码+”:“+key))

因此,MemberMe令牌仅在指定的时间段内有效,前提是用户名、密码和密钥不发生更改。值得注意的是,这有一个潜在的安全问题,即捕获的memberme令牌在令牌过期之前可以从任何用户代理使用。这与摘要身份验证的问题相同

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

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

  • 这里的基本假设是,散列函数(上面的
    md5Hex()
    部分)提供了一种在一个方向上轻松编码某些数据的方法,但是反转(从
    md5Hex
    文本中恢复密码)非常困难和不实际。

    不要将会话cookie与“记住我”cookie混淆

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

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

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

    • -默认情况下使用,不太安全-cookie包含密码和其他数据的散列
    • -更安全,需要数据库访问-cookie不包含存储在数据库中的唯一标识符