还记得我在春季安全方面工作?
-
01-10-2019 - |
题
我很好奇记得我如何工作,它如何在春季安全方面工作?
我了解服务器将长寿命的cookie发送给客户端。然后客户端将cookie发送回去,服务器可以识别客户端 cookie --> session
.
我不明白在服务器[Tomcat]重新启动后,服务器[服务器端应用程序]如何识别Cookie的客户端。
弹簧安全性如何以及在何处保存 cookie-session
服务器关闭之前的地图?它是否特定于服务器(即Tomcat,Jetty等发生了不同的事情)?
ps春季安全和重新部署的另一个相关问题:即使我不打勾 RememberMe
并登录,在重新部署约3分钟后,我仍然被认可。可以解决吗?
解决方案
春季安全文档讨论 这实际上是如何工作的。
这种方法使用哈希来实现有用的记忆策略。从本质上讲,在成功的交互式身份验证后,将cookie发送到浏览器,而cookie的组成如下:
base64(username + ":" + expirationTime + ":" + md5Hex(username + ":" + expirationTime + ":" password + ":" + key))
...
因此,请记住我的令牌仅适用于指定的期限,并且规定用户名,密码和密钥不会更改。值得注意的是,这存在潜在的安全问题,因为捕获的记住我的令牌将从任何用户代理都可以使用,直到令牌到期为止。这与Digest身份验证是相同的问题。
基本上,cookie包含用户名,密码,到期时间和键(您指定),所有这些都是 哈希 一起。当您的浏览器将此cookie的内容发送到服务器时,Spring Security:
- 从后端检索给定用户名的密码
- 计算
md5Hex()
数据库中的用户名/密码/等 - 如果他们匹配 - 您将登录!如果不是匹配,那么您提供了伪造的cookie或一个用户名/密码/密钥之一已更改。
这里的基本假设是哈希函数 - md5Hex()
上面的一部分 - 提供了一种轻松地在一个方向上编码某些数据的方法,但逆转却是难以置信且不可行的(要从 md5Hex
文本)。
其他提示
不要将cookie与记住我饼干混淆。
Session Cookie由服务器(例如Tomcat)发送,并用于将传入请求与会话相关联。
请记住,我的cookie是由春季安全性发送的,以在不同的会话中对客户端进行身份验证(例如,原始会话到期后或在服务器重新启动之后)。
为了对用户进行身份验证,请记住我Cookie Spring Security提供了2种策略:
TokenBasedRememberMeServices
- 默认使用的默认安全 - cookie包含密码和其他数据的哈希PersistentTokenBasedRememberMeServices
- 更安全,需要数据库访问 - cookie intaint存储在数据库中的唯一标识符