Cookie、Session、Token 有什么区别?

Cookie、Session、Token 有什么区别?

本文作者:程序员小白条

本站地址:xbt.xiaobaitiao.top

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

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

1. Cookie(小饼干)

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

怎么工作?

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

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

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

ini 复制代码
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 发给浏览器:

ini 复制代码
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),里面包含用户信息:

json 复制代码
{
  "user_id": 123,
  "exp": 1735689600  // 过期时间
}

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

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

makefile 复制代码
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

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

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

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

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

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

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

相关推荐
Bs_MoneyMagnet2 小时前
基于springboot+vue的滑雪场票务与装备租赁系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
AlienZHOU6 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
野生技术架构师7 小时前
2026 Java 面试全套总结,八股 + 场景 + AI 相关面试考点
java·人工智能·面试
狗头大军之江苏分军8 小时前
《潮水漫过十七岁》开学了
后端
苏三说技术9 小时前
如何看待GPT-6在UP主众测中碾压夺冠?它是现在最强大模型吗?
后端
mldong9 小时前
一份 JSON,一条能跑的审批流:把报销流程送上工作流引擎
后端·架构
wno7049 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
Captaincc9 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
aramae10 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
kyriewen11 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程