鉴权总翻车?原来浏览器藏着失效 Cookie「定时炸弹」

最近在做服务治理的工作时,发现了一个历史遗留bug,今天就给大家分享下。

后端服务现在最常见的鉴权方式就是IDaaS了,即Identity as a Service(身份即服务),当用户通过IDaaS认证成功后,IDaaS会给用户浏览器设置一个身份凭证,通常是JWT(Json Web Token), 这些凭证通常以Cookie的形式保存到本地浏览器,但是浏览器会缓存多个失效的Cookie。

Cookie失效之后,服务端在处理Http请求时,拿到失效的Cookie去验证用户身份,就容易踩坑,以下是服务中的代码。

 ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();

 HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
            Cookie[] cookies = httpServletRequest.getCookies();
            
            if(EmptyUtil.isNotEmpty(cookies)){
                for (Cookie cookie : cookies) {
                    String name = cookie.getName();
                    // bug在这里
                    if(name.equals("XXX-Token")){
                        token=cookie.getValue();
                        break;
                    }
                }
            }

ServletRequestAttributes是 Spring 框架中的一个类,用于封装 HTTP 请求相关的属性。

通过它我们可以获取到请求的详细信息,即HttpServletRequest类。

httpServletRequest中包含浏览器发送的cookies信息,cookies默认是按照在IDaaS在浏览器设置缓存的时间从远到近排序。

这样的话,cookies[0]一般都是失效的, 用上述方式过滤的话,拿到的token同样是失效的。

我们有两种方式可以解决cookie失效问题。

第一种,用无痕模式登录业务系统或者清理浏览器缓存。

第二种,通过业务代码检验。以下是优化后的代码。

	for(Cookie cookie : cookies){
		// 通过maxAge属性筛选出有效的token
		if(cookie.getMaxAge() > 0){
			……
		}
	}

Cookie 的 maxAge 属性用于指定 Cookie 的有效时长,单位为秒。

  • 当 maxAge 大于 0 时,从 Cookie 被创建开始,经过 maxAge 秒后,Cookie 就会过期失效。
  • 当maxAge为-1时,表示该 Cookie 仅在当前浏览器会话期间有效。当用户关闭浏览器时,该 Cookie 会被自动删除。

你可能感兴趣的:(后端,cookie,idaas,服务鉴权)