Token、Session 和 Cookie 的基本概念
Token
Token 是一种无状态的认证机制,通常由服务器生成并返回给客户端。客户端在后续请求中携带 Token(如放在 HTTP 头部),服务器通过验证 Token 的合法性来判断用户身份。常见的 Token 类型包括 JWT(JSON Web Token)。
Session
Session 是一种有状态的服务器端存储机制。服务器为每个用户创建一个唯一的 Session ID,存储在服务器内存或数据库中,并将 Session ID 通过 Cookie 或 URL 传递给客户端。客户端在后续请求中携带 Session ID,服务器通过 ID 查找对应的用户数据。
Cookie
Cookie 是存储在客户端(浏览器)的小型文本数据,由服务器通过 HTTP 响应头(Set-Cookie)设置。客户端在后续请求中自动携带 Cookie,用于维持用户状态或存储偏好设置。
三者的主要区别
存储位置
- Token:通常存储在客户端(如 localStorage 或 HTTP 头部)。
- Session:Session 数据存储在服务器端,仅 Session ID 通过 Cookie 或 URL 传递。
- Cookie:数据完全存储在客户端。
状态管理
- Token:无状态,服务器无需存储 Token,仅需验证其有效性。
- Session:有状态,服务器需维护 Session 存储。
- Cookie:无状态,但依赖客户端存储。
安全性
- Token:可通过加密(如 JWT 签名)确保安全性,但需防范 XSS 攻击。
- Session:Session ID 易受 CSRF 攻击,需配合防护措施。
- Cookie:需设置
HttpOnly和Secure属性防范 XSS 和中间人攻击。
扩展性与性能
- Token:适合分布式系统,无需服务器存储状态。
- Session:服务器需维护 Session 存储,扩展性较差。
- Cookie:适合简单状态管理,但数据大小受限(通常 ≤4KB)。
典型应用场景
Token
- RESTful API 认证(如 JWT)。
- 移动端或无 Cookie 环境(如跨域请求)。
Session
- 传统 Web 应用(如电商购物车)。
- 需服务器端控制用户状态的场景。
Cookie
- 记住登录状态(如
remember_me功能)。 - 存储用户偏好(如语言、主题)。
技术实现示例
Token(JWT)
客户端在登录后获取 Token,后续请求通过 Authorization 头部携带:
http
Authorization: Bearer <JWT_TOKEN>
Session
服务器生成 Session ID 并通过 Cookie 返回:
http
Set-Cookie: sessionid=abc123; Path=/; HttpOnly
Cookie
服务器设置 Cookie:
http
Set-Cookie: username=john; Expires=Wed, 21 Oct 2025 07:28:00 GMT; Secure