关于cookie domain中的点前缀

今天同事遇到一个问题,大概描述如下:

浏览器已经接收指令,之前在一级域名下存储了相关的信息。这里为了简化问题,假设我们有两个应用A和B,域名分别为:a.b.com和c.a.b.com。(显然B是A的一个子域)。

上面的描述就是:在.b.com这个一级域名下,我们已经成功写入了一个cookie,假设为:b=level1。

在正常用户的浏览行为中,应用A会向自己的域下写入a=level2(domain:a.b.com)。

在A正常的页面中,有些场景会有异步的请求发出到B应用的页面(用于获取数据),合理的一种想法是:发送到B应用的请求,应该携带着上面的b=level1,a=level2这两个cookie信息到B应用的服务器去才对。但是,实际的情况是,b=level1被如愿携带上来,但是a=level2这个信息却被丢弃了!(确切的说是没有跟着request一起被发送到B的服务端)。

为啥?在访问子域应用时,不是父域名下的cookie都应该被携带上来吗?就像上面的b=level1那样?

 

其实,关于这点,在cookie的RFC规范中,并没有太明显的说明,至少我没有看到,即使又看了一遍RFC6265中关于Domain Matching的描述也是如此。

但实际的使用过程中,某个域下的cookie如果希望能够被他的子域具有可见性(即可以读取),必须要注意的一点是,应该保证这个cookie在被Set的时候,应该以"."开头。回到上面的例子,之所以a=level2这个cookie没有在用户浏览器请求B应用时被携带到B的server端,就是因为a=level2这个cookie的domain不是.a.b.com,而是a.b.com

事实上,上面例子中的A应用,在向自己的域名下写入a=level2这个cookie时,压根就没有显示的设置domain这个属性,这样一来,浏览器接受到这个Set Cookie的请求时,就会以默认以当前应用的域名作为cookie的domain。(不过据说某些版本的Firefox到是会自作聪明的在当前域名的前面自动加上一个点,这个待验证!)

 

这一个小点的区别,还是很容易被忽略的,不过产生的浏览行为还是有细微差别的。(涉及到cookie是否上传,是否占用网络流量等)

 

PS:关于上面说到的那个问题,stackoverflow上的这个有个截图,看着说明就直观很多了。

### 如何在SSO单登录中正确清除Cookie 在SSO(Single Sign-On,单登录)系统中,为了确保用户安全退出并彻底结束会话,在登出过程中需要有效地清除存储于客户端的凭证信息。具体来说,这涉及到删除由服务器设置并通过HTTP响应头`Set-Cookie`指令传递给浏览器保存的cookie。 对于跨多个子域的应用程序而言,如果这些应用共享同一顶级域名下的单一身份验证机制,则不仅要在当前页面所在的特定站上移除token对应的cookie,还需要通知其他关联的服务也执行相应的清理操作[^1]。 #### 清楚主域名中的Token Cookie 当接收到用户的注销请求时,SSO服务端应当负责协调整个过程: - **定位目标Cookies**: 需要明确哪些cookies是用于表示已认证状态的关键标识符; - **构建Logout逻辑**: ```java // Java Servlet 示例代码片段展示如何处理logout请求 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取session对象以便后续可能的操作 HttpSession session = request.getSession(false); if (null != session){ // 销毁现有的HttpSession实例 session.invalidate(); } // 创建新的空Cookie覆盖旧有的同名项来达到删除效果 Cookie killCookie = new Cookie("your_token_name", null); killCookie.setPath("/"); killCookie.setMaxAge(0); // 设置最大存活时间为0秒即刻失效 String domain = ".example.com"; // 替换成实际使用的根域名前缀加上. if (!domain.isEmpty()){ killCookie.setDomain(domain); } // 将此Cookie加入到Response头部返回给浏览器 response.addCookie(killCookie); // 跳转至指定URL完成最终重定向动作... } ``` 上述代码展示了通过创建一个新的具有相同名称但值为空且生存期设为零(`setMaxAge(0)`意味着立即过期) 的Cookie实例,并将其路径属性设定为"/"(代表该主机下所有资源),以及可选地指定了作用范围更广的`.example.com`(适用于多级子域名场景)。这样做能够确保无论哪个子域发起的请求都能被有效识别进而更新本地缓存记录。 此外,考虑到现代Web应用程序架构复杂度日益增加的情况,除了基本的cookie管理外,还应考虑集成额外的安全措施如HTTPS强制传输层保护、CSRF防护令牌等手段进一步增强系统的安全性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值