Token、Cookie、Session的区别

366 阅读3分钟

1. 存储位置与机制

类型存储位置依赖关系特点
Cookie客户端(浏览器)由服务器通过Set-Cookie响应头设置,自动随请求发送大小受限(约4KB),可设置过期时间;存在安全风险(如CSRF攻击)。
Session服务端(服务器内存/数据库)依赖Cookie中的Session ID与服务端数据关联用户状态存储在服务端,安全性更高;但服务器需维护Session数据,高并发时可能影响性能。
Token客户端(如LocalStorage)由服务端生成并返回,客户端手动在请求头(如Authorization)添加无状态(服务端不存储),可自定义存储位置(如Header、URL参数);无跨域限制,适合分布式系统(如JWT)。

2. 安全性对比

类型安全风险防护措施
Cookie- CSRF攻击(跨站请求伪造) - XSS窃取Cookie内容(若未设置HttpOnly- 设置SameSite属性限制跨站发送 - 标记HttpOnly防止JS访问 - 使用Secure仅HTTPS传输
Session- Session劫持(若Session ID泄露) - 服务端存储压力大(可能被攻击者耗尽资源)- 定期清理过期Session - 结合IP/User-Agent验证 - 加密Session ID
Token- XSS窃取Token(若存储不当) - Token泄露后无法快速失效(需依赖黑名单或短有效期)- Token加密签名(如JWT的签名机制) - 存储于非持久化位置(如内存) - 设置合理过期时间

3. 使用场景

类型适用场景示例
Cookie- 简单的用户状态保持(如登录态) - 需要服务端自动管理的小型数据(如语言偏好)电商网站的购物车ID存储
Session- 对安全性要求高的场景(如支付系统) - 需要服务端完全控制用户状态的系统银行系统登录后的会话管理
Token- 前后端分离架构(如SPA应用) - 跨域/分布式系统(如微服务API鉴权) - 无状态身份验证(如移动端APP)JWT用于用户登录后访问API资源

4. 核心区别总结

维度CookieSessionToken
存储位置客户端服务端客户端
通信方式自动随请求发送依赖Cookie中的Session ID手动添加到请求头/参数
跨域支持受同源策略限制(需CORS)同Cookie无限制(可手动传递)
服务端压力低(数据在客户端)高(需存储所有Session数据)低(无状态)
扩展性受限(大小和安全性)依赖服务端扩展高(适合分布式系统)
典型应用会话管理、跟踪用户行为敏感操作的身份验证API鉴权、移动端身份验证

5. 面试回答技巧

  • 简明回答
    “Cookie由服务端设置,存储在浏览器,自动随请求发送;Session数据在服务端,通过Session ID关联;Token(如JWT)由服务端生成,客户端存储并手动发送,无状态且适合分布式系统。”
  • 结合场景
    “在单页面应用(SPA)中,常用Token实现无状态鉴权,避免Cookie的跨域限制;而传统Web应用可能用Session管理敏感会话。”
  • 安全补充
    “Cookie需防范CSRF(如设置SameSite),Token需防范XSS(避免LocalStorage存储敏感数据)。”