同一域名不同端口 cookie 共享问题

6,827 阅读2分钟

HTTP cookies - HTTP | MDN (mozilla.org)

Cookie 的作用域

Domain 和 Path 标识定义了Cookie的作用域: 即允许 Cookie 应该发送给哪些URL。

Path 属性

Path 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 %x2F ("/") 作为路径分隔符,子路径也会被匹配。

例如,设置 Path=/docs,则以下地址都会匹配:

  • /docs
  • /docs/Web/
  • /docs/Web/HTTP

SameSite attribute

SameSite Cookie 允许服务器要求某个 cookie 在跨站请求时不会被发送,(其中  Site (en-US) 由可注册域定义),从而可以阻止跨站请求伪造攻击(CSRF)。

SameSite cookies 是相对较新的一个字段,所有主流浏览器都已经得到支持

下面是例子:

Set-Cookie: key=value; SameSite=Strict

SameSite 可以有下面三种值:

  • None 浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写。
  • Strict 浏览器将只在访问相同站点时发送 cookie。(在原有 Cookies 的限制条件上的加强,如上文 “Cookie 的作用域” 所述)
  • Lax 与 Strict 类似,但用户从外部站点导航至URL时(例如通过链接)除外。 在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到URL时才会发送。如 link 链接

以前,如果 SameSite 属性没有设置,或者没有得到运行浏览器的支持,那么它的行为等同于 None,Cookies 会被包含在任何请求中——包括跨站请求。
大多数主流浏览器正在将 SameSite 的默认值迁移至 Lax。如果想要指定 Cookies 在同站、跨站请求都被发送,现在需要明确指定 SameSite 为 None。

注意:

  1. Cookie的作用域仅仅由domainpath决定,与协议端口无关。
  2. 相同域名不同端口的两个应用,cookie名字、路径都相同的情况下,后面cookie会覆盖前面的cookie。

结论:根据同源策略,cookie是区分端口的,但是浏览器实现来说,cookie区分域,而不区分端口,也就是说,同一个ip下的多个端口下的cookie是共享的!ip相同,端口不同,覆盖就是这个道理。