面试官: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 认证。
  • 微服务架构下的身份验证。

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

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

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

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

#面试#
全部评论

相关推荐

07-10 14:08
已编辑
江西农业大学 Java
点赞 评论 收藏
分享
评论
5
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务