# expires属性

  • 不设置该属性时,默认为Session,即与浏览器会话窗口保持一致
  • 设置了具体的时间值,如:2022-11-18T16:35:38.253Z,则到该日期时,过期。注意,该时间与服务器时间对比,而非与客户机时间对比
  • 如果该时间,为过去的时间,则立即失效

# 同站cookie存储规范

  • 实例 cookie存储实例
  • Cookie 的作用域由 Domain、Path 和 Secure 属性共同决定。
  • 默认情况下,浏览器会忽略端口号(根据 RFC 6265 标准,Cookie 不包含端口信息)。即使两个网站的端口不同,只要域名(Domain)和路径(Path)相同,它们的 Cookie 会被视为同一作用域下的数据
  • 例如:http://example.com:8080 和 http://example.com:3000 会被视为同一域名下的两个服务,它们的 Cookie 可能互相覆盖。
  • 根据RFC 6265 规范:Cookie 的作用域仅由 Domain 和 Path 决定,不包含端口。这是问题的根本原因
  • 大多数浏览器(Chrome、Firefox 等)严格遵循 RFC 标准,忽略端口;少数旧版本浏览器可能支持端口隔离,但不可依赖。配置如下
// Express 示例:强制 Cookie 绑定端口
app.use(session({
  secret: 'keyboard cat',
  cookie: {
    domain: 'example.com',
    path: '/',
    // 强制包含端口到 Cookie 作用域
    httpOnly: true,
  },
  // 其他配置...
}));
//注意:此方案依赖浏览器实现,可能存在兼容性问题。
  • 如果两个系统使用相同的 Cookie 名称(如 session_id),后设置的 Cookie 会直接覆盖先前的值。
  • 例如:用户先在 example.com:8080 登录,生成 Cookie session_id=123;随后在 example.com:3000 登录,生成同名 Cookie session_id=456。浏览器会认为这是对同一 Cookie 的更新,导致前者失效。

# 解决方案

  • 不同系统使用不同的 Cookie 名称

  • 为 Cookie 设置不同的作用域

    1. 通过cookie-path隔离
    2. 通过domain子域名隔离
  • 源码不可控的情况下,直接使用子域名的方案;