# 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 的覆盖:
- 如果两个系统使用相同的 Cookie 名称(如 session_id),后设置的 Cookie 会直接覆盖先前的值。
- 例如:用户先在
example.com:8080
登录,生成Cookie session_id=123;
随后在example.com:3000
登录,生成同名Cookie session_id=456
。浏览器会认为这是对同一 Cookie 的更新,导致前者失效。
# 解决方案
不同系统使用不同的 Cookie 名称
为 Cookie 设置不同的作用域
- 通过cookie-path隔离
- 通过domain子域名隔离
源码不可控的情况下,直接使用子域名的方案;
← 内容安全策略(CSP)手记 浏览器 →