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同名,主要口述面试经历,会比面经讲的详细很多,以真实面试录音为主!

相关推荐
风流 少年13 分钟前
Cursor创建Spring Boot项目
java·spring boot·后端
毕设源码_钟学姐35 分钟前
计算机毕业设计springboot宿舍管理信息系统 基于Spring Boot的高校宿舍管理平台设计与实现 Spring Boot框架下的宿舍管理系统开发
spring boot·后端·课程设计
方圆想当图灵1 小时前
ScheduledFutureTask 踩坑实录
后端
全栈凯哥1 小时前
16.Spring Boot 国际化完全指南
java·spring boot·后端
M1A12 小时前
Java集合框架深度解析:LinkedList vs ArrayList 的对决
java·后端
没有bug.的程序员3 小时前
JAVA面试宝典 -《安全攻防:从 SQL 注入到 JWT 鉴权》
java·安全·面试
31535669133 小时前
Springboot实现一个接口加密
后端
Linn5 小时前
Spring WebSocket 服务实现的主流方案与最佳实践
spring boot·后端·spring
M1A15 小时前
企业信息化管理(EIM):数字化转型的核心引擎
后端
熬了夜的程序员5 小时前
【华为机试】HJ61 放苹果
算法·华为·面试·golang