当前位置: 首页 > news >正文

Cookie、Session、Token 有什么区别?

Cookie、Session、Token 有什么区别?

本文作者:程序员小白条

本站地址:https://xbt.xiaobaitiao.top

大家伙,我是程序员小白条,今天来聊一聊,经典面试问题,一般我开发项目就是 Token,JWT,第三方 Oauth2。

在 Web 开发中,Cookie、Session 和 Token 都是用来管理用户状态的机制,但它们的工作原理和应用场景有很大不同。今天我们就来聊聊它们的区别,以及各自适合什么场景。

1. Cookie(小饼干)

Cookie 是服务器发给浏览器的一小块数据(通常只有几 KB),浏览器会把它存起来,并在每次请求时自动带上。

怎么工作?

1)服务器 在 HTTP 响应头里加一个 Set-Cookie,比如:

Set-Cookie: user_id=123; Path=/; Expires=Wed, 21 Oct 2025 07:28:00 GMT

2)浏览器 收到后存起来,下次访问相同域名时自动带上:

Cookie: user_id=123

3)服务器 读取 Cookie 识别用户。

优点

简单:浏览器自动管理,前端基本不用管。

  • 兼容性好:所有浏览器都支持。
缺点
  • 不安全:容易被篡改(XSS 攻击)或偷走(CSRF 攻击)。
  • 大小受限:一般不超过 4KB。
  • 每次请求都带:浪费带宽。
适用场景
  • 记住登录状态(比如“7 天内免登录”)。
  • 存储简单的用户偏好(比如主题颜色)。

2. Session(会话)

是什么?

Session 是服务器存储的用户数据,通常用 Session ID 来关联用户。

怎么工作?

1)用户登录,服务器生成一个 Session ID(比如 sess_abc123),存到数据库或内存(如 Redis)。

2)服务器 通过 Set-Cookie 把 Session ID 发给浏览器:

Set-Cookie: session_id=sess_abc123; HttpOnly; Secure

3)浏览器 下次请求时带上这个 Cookie,服务器查 Session ID 找到用户数据。

优点
  • 比 Cookie 安全:敏感数据存在服务器,浏览器只存 ID。
  • 可存更多数据:不像 Cookie 有大小限制。
缺点
  • 服务器压力大:每个用户都要存 Session,高并发时可能拖慢服务器。
  • 依赖 Cookie:如果浏览器禁用了 Cookie,Session 就失效了。
适用场景
  • 传统的 Web 应用(如电商、后台管理系统)。
  • 需要存储较多用户数据的场景。

3. Token(令牌)

是什么?

Token 是一种无状态的认证方式,最常见的是 JWT(JSON Web Token)

怎么工作?

1)用户登录,服务器生成一个 Token(如 JWT),里面包含用户信息:

{"user_id": 123,"exp": 1735689600  // 过期时间
}

2)服务器 把 Token 返回给前端(通常存到 localStorageCookie)。

3)前端 每次请求在 Authorization 头里带上 Token:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

4)服务器 验证 Token 是否有效,无需查数据库。

优点
  • 无状态:服务器不用存 Token,适合分布式系统。
  • 跨域友好:适合前后端分离、移动端、API 调用。
  • 可自定义数据:Token 里可以直接存用户信息。
缺点
  • Token 一旦发出无法撤销(除非用黑名单机制)。
  • 比 Session 占用更多带宽(Token 通常比 Session ID 长)。
适用场景
  • 前后端分离项目(如 Vue/React + API)。
  • 移动端 App 认证。
  • 微服务架构下的身份验证。

面试官问你的话,直接背下面这个表格,用图形记忆会比较熟练。

特性CookieSessionToken(如 JWT)
存储位置浏览器服务器客户端(localStorage/Cookie)
安全性较低(易被窃取)较高(数据在服务端)较高(可加密)
状态管理无状态有状态(依赖服务器存储)无状态
适用场景简单状态管理传统 Web 应用前后端分离/API

我的一些建议:把重点放在 Token 上,另外要注意 Token 的三部分构成,以及加密算法,和后端需要配置的一些 yml 参数,这些说出来,可以加深面试官对你的印象,面试要在某一个部分上进入深入处理,这样的话就会大大加分,尽管你有一些问题完全没碰到过,但面试是找亮点的过程,而不是一个找缺点的过程!

程序员小白条的编程日记:https://xbt.xiaobaitiao.top/ (分享如何拿到腾讯实习 Offer 和多个中大厂的面试机会,大学经历、求职经历、职场工作、创作经历、生活日常、面经、技术分享)定期更新内容,成长打怪系列,分享从大一到大四的完整面经,看完可冲中大厂!dy同名,主要口述面试经历,会比面经讲的详细很多,以真实面试录音为主!

http://www.dtcms.com/a/275950.html

相关文章:

  • Spring Boot 中使用 Lombok 进行依赖注入的示例
  • 【离线数仓项目】——电商域DWD层开发实战
  • 【C++ STL 库】解析stack、queue、priority_queue类
  • 中文多智能体金融交易决策框架-TradingAgents-CN
  • 本地安装ClaudeCode全攻略
  • 【Python】多线程详解:从基础概念到实战应用
  • 免费尝试claude code的安利,截至今天可用(7/12)
  • openGauss数据库管理实战指南——基本常用操作总结
  • AI:机器人未来的形态是什么?
  • Cisco ACI 生成Postman CSV 脚本场景
  • 死锁的避免
  • Spring Boot 应用中,配置的加载优先级
  • 锁相环初探
  • CTFHub————Web{信息泄露[Git泄露(Stash、Index)]}
  • Java 接口详解:从基础到高级,掌握面向对象设计的核心契约
  • 使用FastAdmin框架开发二
  • ollama - sqlcoder模型:面向提示词编程(根据用户信息生成sql语句并执行返回结果)
  • SQL新手入门详细教程和应用实例
  • 微信小程序121~130
  • [Vroom] 时间窗口 | 载重与货量管控 | 内部路由表示机制 | 增量式更新算法O(1)
  • 【Redis-05】高可用方案-主从哨兵
  • 【PTA数据结构 | C语言版】用两个栈实现队列
  • 监控28181连接到云服务器/推流分发/客户端网页端手机端拉流/实时性好极低延迟
  • 初等行变换会改变矩阵的什么?不变改变矩阵的什么?求什么时需要初等行变换?求什么时不能初等行变换?
  • GRPO PPO
  • Python 是动态类型的语言,它和静态类型语言(如 C++/Java)有什么优缺点?
  • CSS动画下划线
  • hot100链表(1)
  • 通过自制Flash算法文件,成功实现H7-TOOL脱机烧录nRF54L15,且支持自动解除SWD接口保护(2025-07-12)
  • Google MUVERA: 让多向量检索与单向量检索一样快