首先,Cookie是存储在客户端的小型数据片段,用来记录用户的状态。比如,用户登录完成后,下次请求时浏览器会自动发送这个Cookie给服务器,服务器就能识别用户。但Cookie容易被CSRF或XSS攻击,安全性需要注意。
然后是Session,Session的数据是存在服务器端的,比如内存、数据库或文件系统里。用户登录后,服务器生成一个唯一的Session ID,通过Cookie发给客户端。之后客户端每次请求带上这个ID,服务器就能找到对应的Session数据。Session比Cookie安全,因为数据在服务器,但服务器需要存储和管理这些Session,可能影响扩展性,尤其是在分布式系统中需要共享Session状态。
接下来是Token,常见的是JWT(JSON Web Token)。Token也是由服务器生成,但是在客户端保存,客户端每次请求在Authorization头中带上Token,服务器验证签名有效性即可,不需要存储会话状态。Token适合分布式或跨域场景,因为服务器无状态。不过一旦Token被盗,可能会被滥用,所以需要设置较短的过期时间或用HTTPS增强安全
- Cookie
定义
Cookie 是由服务器生成并发送到客户端(浏览器)的一小段文本数据,存储在客户端本地(如浏览器内存或硬盘)。
每次请求时,浏览器会自动将 Cookie 附加到 HTTP 请求头中(如 Cookie: name=value)。
特点
客户端存储:数据保存在客户端,可能被篡改或窃取(需防范 XSS/CSRF 攻击)。
自动传输:浏览器自动在请求中携带 Cookie(包括域名、路径、过期时间等限制)。
容量限制:单个 Cookie 通常不超过 4KB,每个域名下的 Cookie 数量有限。
常见用途
会话管理(如 Session ID 通过 Cookie 传递)。
用户偏好设置(如语言、主题)。
- Session
定义
Session 是服务器端存储的用户会话数据(如用户登录状态、临时数据)。
服务器为每个用户创建一个唯一的 Session ID(通常通过 Cookie 传递到客户端),后续请求通过该 ID 关联对应的 Session 数据。
特点
服务端存储:Session 数据存储在服务器内存、数据库或缓存(如 Redis)中。
依赖 Cookie:Session ID 通常通过 Cookie 传递(也可通过 URL 参数,但不安全)。
安全性较高:敏感数据不直接暴露给客户端。
扩展性问题:服务器需要维护 Session 状态,分布式系统中需共享 Session 存储(如用 Redis 集群)。
常见用途
用户登录状态管理。
临时存储多步骤表单数据(如购物车)。
- Token(如 JWT)
定义
Token 是一种自包含的凭证(如 JWT),由服务器生成并签名,包含用户身份、权限和有效时间等信息。
客户端保存 Token(如 LocalStorage 或 Cookie),并在请求时通过 HTTP 头(如 Authorization: Bearer)发送到服务器。
特点
无状态:服务器无需存储 Token,仅需验证签名和有效性。
可跨域:适合分布式系统或跨域场景(如微服务、第三方登录)。
安全性依赖实现:需防范 XSS(LocalStorage 存储)或 CSRF(Cookie 存储)。
灵活过期机制:支持短期 Token + Refresh Token 续签。
常见用途
无状态 API 认证(如 RESTful API)。
单点登录(SSO)。
关键区别总结
特性 Cookie Session Token(如 JWT)
存储位置 客户端(浏览器) 服务端 客户端(LocalStorage/Cookie)
数据传输方式 自动通过 Cookie 头 依赖 Session ID(通常通过 Cookie) 手动添加到请求头(如 Authorization)
安全性 低(易受 XSS/CSRF 攻击) 较高(数据在服务端) 较高(需签名和 HTTPS)
扩展性 无状态 需共享存储(分布式场景) 无状态,天然支持分布式
跨域支持 受限(同源策略) 受限 支持
典型应用场景 会话管理、用户偏好 服务端状态管理 无状态 API、跨域认证
如何选择?
Cookie + Session:适合传统服务端渲染应用(如 PHP、JSP),需维护用户状态且对安全性要求较高。
Token:适合前后端分离、API 优先架构(如 SPA、移动端),或需要跨域/分布式的场景。
混合方案:如将 JWT 存储在 HttpOnly Cookie 中,兼顾安全性与无状态性。