cookie、session、token详解

一、先想一个最本质的问题:

服务器是怎么认出 "你是你" 的?

我们打开浏览器,输入账号密码登录。服务器去数据库查一遍,确认:嗯,是本人

可问题来了:之后的每一次请求,难道还要再发一遍账号密码吗?

当然不行。

  • 每次都带密码,极其不安全
  • 客户端要存密码,泄露风险极大
  • 体验差,性能差

所以,正确的思路是:

登录成功后,服务器给客户端一个身份标记。以后请求只带这个标记,服务器就知道你是谁。

这个 "标记",就是 Cookie、Session、Token 要解决的事情。


1. 什么是 Cookie(专业版)

Cookie 是 HTTP 协议规范 下,服务器通过 Set-Cookie 响应头下发,由 客户端(浏览器)自动存储、自动携带 的小型文本数据,用于客户端与服务端之间的状态传递。

2. 通俗流程

  1. 你输入账号密码登录
  2. 服务器验证通过
  3. 服务器生成一段身份标识,放到响应头里返回
  4. 浏览器自动保存这段标识
  5. 以后每次请求,浏览器自动把 Cookie 带给服务器

整个过程:代码不用管,浏览器全自动。

  • 数据存在客户端,可被查看、修改、冒用
  • 大小有限(4KB),不能存太多内容
  • 纯文本,不安全

三、第二步:把数据存在服务器 ------ Session

为了解决 Cookie 不安全、不能存大量信息的问题,我们引入 Session

1. 什么是 Session(专业版)

Session 是 服务端会话机制 :服务端为每个客户端创建独立的会话数据存储空间,生成唯一的 SessionID,并通过 Cookie 将 SessionID 下发给客户端。客户端后续请求携带 SessionID,服务端根据这个 ID 索引对应的会话数据。

2. 通俗流程

  1. 登录成功
  2. 服务器把你的用户信息存在自己这里(内存 / 数据库)
  3. 生成一个很长、随机、无法猜到 的字符串,叫 SessionID
  4. SessionID 放进 Cookie 发给浏览器
  5. 以后请求,浏览器自动带 SessionID
  6. 服务器通过 SessionID 找到你的会话信息

一句话:Cookie 只带一把钥匙,真正的房间在服务器里。

3. Session 的优点

  • 敏感数据存在服务端,更安全
  • 客户端只存一个 ID,体积小
  • 适合传统 Web 网站、后端管理系统

4. Session 的缺点

  • 强依赖 Cookie,APP、小程序不友好
  • 服务器集群时,需要做 Session 共享
  • 有状态,不利于分布式扩展

现在的客户端不只有浏览器:APP、小程序、桌面软件、跨域前端......它们没有 Cookie 自动机制

于是,Token 登场了。

1. 什么是 Token(专业版)

Token 是 服务端签发的加密签名凭证 ,通常包含用户身份信息与防篡改签名。它 无状态、不依赖 Cookie,由客户端自行存储,请求时手动携带,服务端只需要验签就能完成身份认证,不需要查表。

2. 通俗流程

  1. 账号密码登录
  2. 服务器验证通过
  3. 用密钥生成一段加密字符串 ------ Token(如 JWT)
  4. 直接返回给客户端
  5. 客户端自己手动保存(本地存储、文件等)
  6. 以后请求,手动把 Token 放到请求头
  7. 服务器验证签名,解析身份,不需要存会话

3. Token 的核心优势

  • 不依赖 Cookie,全平台通用
  • 无状态,服务端不用存会话,天然支持分布式
  • 加密签名,防篡改、防伪造
  • 适合前后端分离、APP、小程序、微服务

五、一张图看懂三者关系

plaintext

复制代码
浏览器登录 → 账号密码验证通过
       ↓
服务器要给你一个"身份标记"
       ↓
1. 浏览器自动存、自动发 → Cookie
2. 数据放服务器,只给钥匙 → Session(钥匙=SessionID,存在Cookie)
3. 全平台、手动存、加密凭证 → Token

六、极简总结(面试直接背)

  • 浏览器自动存储、自动发送
  • HTTP 协议原生支持
  • 存客户端,不安全、容量小

🔐 Session

  • 服务端存储会话信息
  • 客户端只存 SessionID(放在 Cookie 里)
  • 安全,但依赖 Cookie,有状态

🔑 Token

  • 加密签名凭证,自包含身份信息
  • 不依赖 Cookie,全平台可用
  • 无状态,易扩展,适合现代架构

七、一句话串起整个逻辑

浏览器登录,账号密码验证后,服务器不再让你每次带密码,而是返回一个标记:浏览器自动保存并发送,这就是 Cookie ;为了安全,把数据存在服务端,只给你一个钥匙(SessionID),这就是 Session ;APP、小程序没有 Cookie 机制,于是客户端手动保存加密凭证,这就是 Token

相关推荐
汪海游龙4 小时前
03.18 AI 精选:Java 26 正式发布,带来新特性与平台演进
github·hacker news
x-cmd4 小时前
RTK - CLI 代理工具,减少 LLM 80% token 消耗 | X-CMD 推荐
人工智能·ai·github·agent·token·rtk·x-cmd
badhope4 小时前
Python、C、Java 终极对决!谁主沉浮?谁将消亡?
java·c语言·开发语言·javascript·人工智能·python·github
lauo5 小时前
从“安全孤岛”到“信任基石”:ibbot智体机灵如何重新定义AI智能体的安全范式
人工智能·安全·智能手机·架构·开源·github
2301_816374335 小时前
AutoBackupGuard 多服务器自动化备份与完整性校验系统
linux·运维·服务器·centos·自动化·github
无限进步_5 小时前
【C++】字符串中的字母反转算法详解
开发语言·c++·ide·git·算法·github·visual studio
一点一木14 小时前
🚀 2026 年 2 月 GitHub 十大热门项目排行榜 🔥
人工智能·github
Yupureki15 小时前
《MySQL数据库基础》1. 数据库基础
c语言·开发语言·数据库·c++·mysql·oracle·github
逛逛GitHub20 小时前
清华团队开源!1 键生成多 Agent 智能体 AI 课堂。
github