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 返回给前端(通常存到 localStorage
或 Cookie
)。
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同名,主要口述面试经历,会比面经讲的详细很多,以真实面试录音为主!