13

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

我了解服务器会向客户端发送长期有效的 cookie。然后客户端发回 cookie,服务器可以识别客户端,因为服务器上有 hash-map 之类的东西cookie --> session

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

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

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

4

2 回答 2

12

Spring Security 文档讨论了这实际上是如何工作的。

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

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

...

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

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

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

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

于 2010-06-29T16:48:37.893 回答
10

不要将会话 cookie 与记住我的 cookie 混淆。

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

记住我 cookie 由 Spring Security 发送以在不同会话中验证客户端(例如,在原始会话到期后或服务器重新启动后)。

要通过记住我的 cookie 对用户进行身份验证,Spring Security 提供了 2 种策略:

于 2010-06-29T16:56:51.777 回答