跳到主要内容

关于 cookie 那点事

  • name:

    cookie 的名称,cookie 一旦创建,名称就不能改

  • value:

    cookie 的值

  • maxAge:

    cookie 失效的时间,单位秒。如果为正数,则该 cookie 在 maxAge 秒之后失效。

    如果为负数,该 cookie 为临时 cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该 cookie。

    如果为 0,表示删除该 cookie。

    默认为-1。

  • secure:

    该 cookie 是否仅被使用安全协议传输。安全协议。安全协议有 HTTPS,SSL 等,在网络上传输数据之前先将数据加密。默认为 false

  • path: cookie 的使用路径。如果设置为/test/,则只有 contextPath 为/test 的程序可以访问该 cookie。

    如果设置为/,则本域名下 contextPath 都可以访问该 cookie。注意最后一个字符必须为/。

  • domain:

    可以访问该 cookie 的域名。如果设置为.github.io,则所有以 github.io 结尾的域名都可以访问该 cookie。注意第一个字符必须为.。

    关于 Secure 属性

    当设置为 true 时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证。但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障。从 Chrome 52 和 Firefox 52 开始,不安全的站点(http:)无法使用 Cookie 的 Secure 标记。

    关于 HttpOnly 属性

    如果在 Cookie 中设置了 HttpOnly 属性,那么通过程序(JS 脚本、Applet 等)将无法读取到 Cookie 信息。

对于以上两个属性,

首先,Secure 属性是防止信息在传递的过程中被监听捕获后信息泄漏,HttpOnly 属性的目的是防止程序获取 cookie 后进行攻击。但并不能解决 Cookie 在本机出现的信息泄漏的问题,毕竟 Chrome 也好 FireFox 也好,都可以直接看到 Cookie 的相关信息。

背景问题​

前一段时间做了一个业务上的修改,(以下均为举例) 原始在 violatangxl.github.io 下有个名为 XXX_id 的 cookie (生成机制,简单理解成一个带有时间戳的字段吧,每次生成结果都不一致),因为某些原因,想把该 cookie 的 domain 扩大到 github.io。

简单想着,嗨,就是一个把 cookie 的 domain 扩大的情况,应该不会有什么问题。结果 run 起来发现一个“意料之中”的情况: 因为之前的 cookie 没有清,导致不同域名下,有两个相同的名称的 cookie。因为不同的后端服务,读取到的 XXX_id 不同,导致线上崩了。

原因与收获​

回归主题,上面说出现了两个同名不同 domain 下的 cookie,然后不同的后端服务,读取 cookie 的顺序又不同,导致出现了 bug。 通过这次事故,这里有几个小点需要备注一下:

不同 domain 下,同名的 cookie,后端都会收到,不会说有什么 domain 的优先级,导致后端只收到“优先级高”的一个。

后端取到的,只有 cookie 的 name 与 value,所以拍脑袋想通过 domain 过滤出需要的 cookie 是不可取的

参考一下 RFC6265 HTTP State Management Mechanism 传递到后端的 cookie 顺序不一定。(原文意思是后端不应该依赖 cookie 的顺序)

但在 chrome 测试,发现后端收到 cookie 还是有一个稳定的顺序的:path 更长的 cookie 更靠前,path 相等的,更早创建的 cookie 更靠前

原文链接:https://violatangxl.github.io/2021/01/19/same-name-cookie/