记住我cookie的解码过程
我用春天记得我的服务。我看到一个奇怪的行为。记住我cookie的解码过程
步骤我走:
登录使用的用户名/密码,我的网站和检查记住我复选框
比我关闭浏览器,并打开一个新的浏览器,并打开新的浏览器。技术上我必须自动登录。这也正在发生。我正在使用
PersistentTokenBasedRememberMeServices
。-
现在我再关闭浏览器,重新打开一个新的浏览器,当我尝试访问我的网站,我收到以下异常:
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/Spring-Security] threw exception org.springframework.security.web.authentication.rememberme.CookieTheftException: Invalid remember-me token (Series/token) mismatch. Implies previous cookie theft attack. at org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices.processAutoLoginCookie(PersistentTokenBasedRememberMeServices.java:102) at org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.autoLogin(AbstractRememberMeServices.java:115) at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:97) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
我向下钻取更多,我看到了我的过去两年请求记得我令牌
SPRING_SECURITY_REMEMBER_ME_COOKIE
价值为bUpwUUJ3dGpUcVJjaGpIYXJxcmFkdz09OlBBRlZXbDVnYmZZQjM2RmFYVDNVMXc9PQ
但弹簧解码的(org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices.tokenRepository)
final String presentedSeries = cookieTokens[0];
final String presentedToken = cookieTokens[1];
正确第一请求而在第二请求的解码它东西presentedToken不同导致的cookie盗窃异常。
这是正确的行为吗?我该如何解决这个问题?
我有这个完全相同的问题。 第一个请求是匹配令牌,然后创建一个新的令牌,但在此之后,第二个请求将到达(与第一个请求具有相同的令牌),并且令牌不再匹配!
我无法弄清楚为什么第二个请求会在第一个请求之后直接进入。
最后我的解决方案是子类PersistentTokenBasedRememberMeServices
和覆盖processAutoLoginCookie
方法。我只是评论了检查cookie盗窃例外(这会产生一个安全漏洞,但它可以接受我的目的)。
如果您想要一个更安全的解决方案,您可以轻松地添加逻辑来匹配最后两个呈现的令牌。
当用户通过cookie登录时,它''PersistentTokenBasedRememberMeService'总是创建一个新的令牌。 因此,对于2.和3.登录必须有不同的cookie值。 - 检查您的浏览器是否发送不同的cookie值。 – Ralph 2013-02-08 14:39:20
我检查了浏览器每次发送相同的cookie。SPRING_SECURITY_REMEMBER_ME_COOKIE是MWJ0cmc0SGxFelJzcStXUmhsaVhtUT09OjI0cWlVcHk1Q2QrWVJTb2hKZU1BNmc9PQ我用萤火虫检查过。 – 2013-02-08 14:54:25
我检查相同的cookie下面一行String ACCESS_TEXT = new String(Base64.decode(cookieValue.getBytes()));正在创建不同的值。这很奇怪... 。该行位于org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.decodeCookie(String)方法中。 – 2013-02-08 15:02:19