Cookie 基础概念

1. 定义与作用

  • HTTP状态管理机制:在客户端存储小型数据(通常≤4KB)

  • 核心用途

    • 会话管理(登录状态、购物车等)

    • 个性化设置(主题、语言偏好)

    • 用户行为跟踪(分析、广告)

2. 工作原理

客户端请求 → 服务器响应(Set-Cookie) → 后续请求自动携带Cookie

Cookie 属性详解

1. 基本属性

Set-Cookie: sessionId=abc123; Domain=.example.com; Path=/; 
           Expires=Wed, 21 Oct 2025 07:28:00 GMT; 
           Secure; HttpOnly; SameSite=Lax
属性 说明 示例
Domain 作用域名 .example.com(子域名共享)
Path 作用路径 /api
Expires/Max-Age 过期时间 Expires=Wed,... 或 Max-Age=3600
Secure 仅HTTPS传输 Secure
HttpOnly 禁止JS访问 HttpOnly
SameSite CSRF防护 Strict/Lax/None

2. SameSite策略对比

模式 跨站请求携带 适用场景
Strict 完全不携带 敏感操作(如支付)
Lax 安全方法(GET)携带 默认推荐值
None 总是携带 需要跨站时(需配合Secure)

Cookie 安全实践

1. 安全防护措施

  • 敏感Cookie设置

    // Java Servlet示例
    Cookie cookie = new Cookie("auth", token);
    cookie.setHttpOnly(true);
    cookie.setSecure(true);
    cookie.setPath("/");
    cookie.setMaxAge(3600);
    response.addCookie(cookie);
  • 签名与加密

    • 对值进行HMAC签名

    • 敏感数据加密存储

2. 常见攻击防御

  • CSRF:SameSite属性+CSRF Token

  • XSS:HttpOnly限制+内容安全策略(CSP)

  • 会话固定:登录后变更SessionID

现代Web中的Cookie替代方案

1. 存储方案对比

技术 容量 可访问性 生命周期
Cookie 4KB 自动携带 可设置
localStorage 5-10MB 仅客户端 持久
sessionStorage 5-10MB 仅当前标签页 会话级
IndexedDB ≥250MB 异步API 可控制

2. 认证新趋势

  • 无状态Token:JWT/OAuth2

    // JWT存储在客户端
    localStorage.setItem('token', 'xxx.yyy.zzz')
    fetch('/api', {
      headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') }
    })
  • HTTP Only Cookie + JWT 混合模式

性能优化技巧

1. Cookie优化策略

  • 精简Cookie大小:删除不必要数据

  • 域名拆分

    • 静态资源使用无Cookie域名

    • static.example.com vs www.example.com

  • 分区设置

    # Nginx配置示例:静态资源不设置Cookie
    location ~* \.(jpg|css|js)$ {
      expires 1y;
      add_header Set-Cookie "";
    }

2. 现代浏览器限制

  • SameParty属性(替代第三方Cookie)

  • CHIPS标准(分区存储)

  • Storage Access API处理沙盒限制

实际开发示例

Node.js Cookie操作

// 设置Cookie
res.setHeader('Set-Cookie', [
  `user_token=${token}; HttpOnly; Secure; SameSite=Lax; Max-Age=3600`,
  `lang=en; Path=/; Domain=.example.com`
])

// 解析Cookie
const cookies = req.headers.cookie?.split(';').reduce((acc, cur) => {
  const [name, value] = cur.trim().split('=')
  return {...acc, [name]: value}
}, {})

浏览器端操作

// 读取(非HttpOnly Cookie)
document.cookie // "name=value; name2=value2"

// 写入
document.cookie = "username=john; path=/; max-age=3600"

// 删除(设置过期时间)
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT"

合规与隐私

1. GDPR/ePR要求

  • 明确告知Cookie用途

  • 提供选择退出机制

  • 分类管理(必要/分析/营销)

2. 合规实施方案

<!-- Cookie同意弹窗示例 -->
<div id="cookie-consent">
  <p>我们使用必要的Cookie确保网站正常运行</p>
  <button id="accept-necessary">仅必要</button>
  <button id="accept-all">接受所有</button>
</div>

<script>
  document.getElementById('accept-necessary').addEventListener('click', () => {
    setCookie('consent', 'necessary', 365)
  })
</script>

Cookie技术虽然经典,但在现代Web开发中需要结合安全、隐私和性能要求谨慎使用。对于新项目,建议考虑Token-based认证与客户端存储的组合方案,同时遵循最新的Web安全标准和隐私法规。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐