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

相关推荐
阿里嘎多学长1 小时前
2026-08-04 GitHub 热点项目精选
开发语言·程序员·github·代码托管
MicrosoftReactor3 小时前
技术速递|GitHub Copilot App 入门指南:快速上手
ai·github·copilot·copilot app
大眼、不聚光4 小时前
9.linux系统管理-ssh免密配置
linux·ssh·github
NutShell Wang5 小时前
拆解 GitHub gh-stack:堆叠 PR 工作流的设计取舍与工程实现
前端·git·开源·github·代码复审·开发者工具·vibe coding
午安~婉18 小时前
GitHub Token/ GitHub Stats统计显示图异常
前端·github·vercel·github token
dong_junshuai19 小时前
每天一个开源项目#59 AirLLM:27.6K星,3.72GB显存跑2.8T模型
人工智能·程序员·github
lpfasd12319 小时前
2026年第31周GitHub趋势周报
github
Jul1en_21 小时前
【Claude Code Compact】源码级别的学习上下文压缩
java·前端·学习·github·ai编程
逛逛GitHub1 天前
Karpathy 刚发了一个帖子,怎么判断一个新模型到底行不行?
github
m4Rk_1 天前
【论文阅读】Agent 记忆机制(28):MEM1——将记忆压缩融入推理,实现近似恒定上下文的长程智能体
论文阅读·人工智能·学习·开源·github