记一次前端cookie冲突,导致同一个浏览器其他系统被踢下线问题分享

背景:

首先我在是公司的一个职能部门,所做的软件主要是服务于公司内部员工使用,员工可以通过工号来进行登录,也可以通过其他方式登录,所以整个公司提供了一个统一身份管理平台来员工身份认证、权限进行集中式的管理,实现一个账号打通所有应用服务:

记一次前端cookie冲突,导致同一个浏览器其他系统被踢下线问题分享_第1张图片

 

好处有以下几种吧:

  1. 作为开发人员不需要重新开发登录页面,以及一些身份认证的相关逻辑,节省开发人力
  2. 各个系统登录界面的UI更加一致、统一
  3. 由于登录完成后,一些cookie的设置都是存在主域下面的,这样在同一个浏览器上登录一个系统后,如果系统间的都是该主域的子域名话,cookie之间是可以实现共享,这样当再次打开其他系统时就可以实现免登录的效果

这边就简单讲解一下接入实现逻辑,涉及到后端的接入可能就无法具体讲解了:

1.首先统一身份管理平台在登录成功之后,会跳转到后端一个服务域名上去,目的是将登录人的身份信息通过set cookie方式传给后端(http://xxxx/login?service=后端服务)

2.当后端服务拿到cookie之后会调用统一身份管理平台的认证sdk进行校验,判断该cookie是否在有效期内

3.若在有效期内,则说明认证成功,会跳转到前端域名上,解析html,css,js文件

4.若不在有效期内,说明认证失败,继续重定向到统一身份管理平台进行再次认证

问题描述:

由于我开发的系统是一套中间服务,需要和很多内部系统进行对接,有一天其他系统的产品经理反馈说同一个浏览器上打开两个系统,另外一个系统立马就打不开了并且一直在刷新,非常影响用户体验:

复现:

首先我在我的电脑上复现了全过程,在当我的系统用户信息失效时,再次重新登录时,另外一个系统此时就开始出问题了,这边就简单描述一些问题产生的步骤,中间经历了哪些环节:

1.另外一个系统出问题时,会跳转到统一身份管理平台去重新登录

2.但是那边认为cookie是有效的,又重定向到后端域名上

3.后端服务觉得cookie也是有效的未过期,又重定向到前端域名上来

4.前端域名调用userInfo接口却一直提示401登录信息失效

5.最终导致页面一直在刷新,和产品描述一致

问题思路推理:

那现在问题的根本原因就是一些cookie信息发生了改变,而恰好躲过了统一身份管理平台和后端服务的校验,而这些cookie信息对某些接口却很重要;

因此我开始对比系统正常打开和系统挂了之后两者的cookie:

现象:确实是发生了一些变化,两次ookie信息对比中,某些key被修改了,某些key被删除了;

思考:

然后我就在想是不是在用户信息失效之后,我手动clearCookie导致的,因为这些cookie的key都存在同一个主域下面,当某些key清除或者修改了之后,另外一个系统就不认了;

为了验证,我打开了F12,发现有些cookie是httponly, 有些是完全可以修改的,并且我检查了我的代码,确实是clearCookie的代码逻辑;

当时心里面还经历过一些思想斗争,就觉得在用户信息失效后,前端手动清除cookie也没错啊,如果不清楚有缓存的话也会影响下一次登录;不过话虽如此,最终还是把clearCookie删除并测试了一下,哇塞居然没问题!

总结:

虽然最终解决了问题,但是我觉得后端在cookie的设置上还是不够谨慎,一些重要cookie key信息不设置httponly, 及其容易发生cookie劫持攻击,因为cookie完全是后端设置的,所以也更应该设置成httponly,防止前端修改导致出现的一系列的问题了。

最后如有不足之处,还望在留言区进行补充说明!

你可能感兴趣的:(前端,cookie)