什么是Token,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:需设置 HttpOnlySecure 属性防范 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
相关推荐
Emily156853598701 分钟前
Emerson 1C31129G03 Analog Input Module
java·开发语言·前端·plc·emerson·1c31129g03·input module
就叫_这个吧5 小时前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡5 小时前
AI 应用系统设计
java·开发语言·人工智能
城管不管5 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅5 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
AI绘画哇哒哒5 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰6 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
吠品8 小时前
Wine 在 Linux 上运行 Windows 软件完整指南
java·linux·服务器
亚历克斯神9 小时前
智能搜索系统的升级复盘——从 Elasticsearch 到混合检索的检索质量提升
java·spring·微服务
金銀銅鐵10 小时前
[Java] 一个方法最多可以有多少个入参?
java·jvm