session、cookie、token的区别

Cookie (客户端的“身份证”)
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据。它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
存储位置客户端(浏览器)。
工作原理
客户端第一次请求服务器。
服务器在响应头里设置 Set-Cookie,把数据(如 sessionId=A123)发给浏览器。
浏览器自动保存这个 Cookie。
之后每次向该服务器发起请求,浏览器都会自动在请求头里带上这个 Cookie。
服务器读取 Cookie,识别用户身份。
特点
大小限制:通常为 4KB 左右。
安全性:存储在客户端,容易被篡改和窃取(如 XSS 攻击),敏感信息不应直接放在 Cookie 里。
生命周期:可以设置过期时间,关闭浏览器后可以失效(会话Cookie),也可以持久化存储(持久Cookie)。
跨域问题:默认有跨域限制,不能被其他域的网站访问。
2. Session (服务器端的“档案柜”)
Session 是一种在服务器端保存用户状态信息的机制。它为每个用户创建一个唯一的会话ID(Session ID),并将用户的具体信息与这个ID关联起来存储在服务器上。
存储位置
服务器端(内存、数据库或缓存如 Redis)。
工作原理
用户首次登录,服务器验证通过后,创建一个 Session 对象,存储用户信息,并生成一个唯一的 sessionId。
服务器通过 Set-Cookie 响应头,将 sessionId 发送给客户端浏览器。
浏览器将这个 sessionId 存在 Cookie 里。
后续请求时,浏览器自动带上包含 sessionId 的 Cookie。
服务器根据 sessionId 找到对应的 Session 数据,从而识别用户。
特点
存储位置:在服务器,相对安全,可以存储敏感信息。
服务器压力:用户量大时,会占用大量服务器资源,需要考虑 Session 的存储和管理(如用 Redis 集群)。
依赖性:通常需要依赖 Cookie 来传递 sessionId。如果浏览器禁用 Cookie,Session 机制会失效(除非通过 URL 重写等方式)。
分布式问题:在分布式服务器集群中,需要解决 Session 共享问题(如 Session 粘滞、集中式存储)。
3. Token (服务器签发的“通行证”)
Token 是一串按照特定规则生成的字符串,它包含了用户信息、权限、过期时间等,并且经过了服务器的数字签名,以确保其完整性和不可伪造性。最流行的实现是 JWT (JSON Web Token)。
存储位置
客户端(通常存在 Local Storage、Session Storage 或 Cookie 中)。
工作原理
用户登录,服务器验证成功。
服务器将用户信息、权限等打包成一个 JSON 对象,然后用一个只有服务器知道的密钥 对其进行签名,生成一个 Token 字符串。
服务器将这个 Token 返回给客户端。
客户端保存 Token(如放在 Local Storage)。
后续请求时,客户端在请求头(通常是 Authorization: Bearer )中携带这个 Token。
服务器收到请求后,用同样的密钥验证 Token 的签名是否有效、是否过期。
验证通过后,服务器直接从 Token 中解析出用户信息,无需查询数据库或缓存。
特点
无状态:服务器不保存任何会话信息,这大大减轻了服务器的存储压力,易于扩展。
自包含:Token 本身包含了所有需要的信息,减少了数据库查询。
跨域友好:非常适合用于前后端分离、微服务架构和跨域请求。
安全性:Token 如果泄露,别人可以冒用。因此必须使用 HTTPS,并且 Token 的有效期不宜过长。存储在 Local Storage 中有 XSS 风险。
一次性:一旦签发,在过期前无法主动使其失效(除非引入黑名单机制,但这会破坏“无状态”特性)。

posted @ 2025-10-27 16:38  P5310  阅读(0)  评论(0)    收藏  举报