一文搞懂 Cookie、Session 和 Token 的区别

张开发
2026/4/9 22:26:16 15 分钟阅读

分享文章

一文搞懂 Cookie、Session 和 Token 的区别
背景在 Web 应用中HTTP 是无状态协议服务器无法自动识别用户身份。为了实现用户登录状态的保持与身份认证需要引入 Cookie、Session 和 Token 等机制来在多次请求之间维持用户状态CookieCookie 是存储在客户端浏览器的一小段数据会在每次请求时自动携带到服务器。特点有如下自动发送容量小4KB可以被 JS 读取除非 HttpOnlyCookie 的结构长什么样子一个典型的 CookieSet-Cookie:sessionIdabc123;Path/;Domainexample.com;HttpOnly;Secure;SameSiteStrict存储的核心数据是用键值对的形式name value 比如sessionId abc123。其次Domain作用域 Domainexample.com 哪些域名可以使用这个 Cookie。.example.com 子域名也能用a.example.com 仅该子域。Path/ 表示哪些路径能够携带这些cookieExpires / Max-Age过期时间HttpOnly安全设置这个JS 不能访问,document.cookie ❌读不到能够防止 XSS 偷 CookieSecure安全只在HTTPS下发送SameSite, 防止CSRFCookie的工作流程第一次请求浏览器 - 服务器发送get/post请求服务器返回 Set-Cookie: sessionIdabc123后续请求浏览器自动带上 Cookie: sessionIdabc123Cookie的常见用途cookie可以用来存储如下登录状态sessionId用户偏好语言/主题购物车追踪用户行为埋点/广告Cookie 存在的问题Cookie 存在以下几个主要问题首先是容量和数量限制单个 Cookie 大约 4KB且每个域名数量有限其次是作用域受 Domain 和 Path 限制无法跨域使用第三是浏览器会自动携带 Cookie容易导致 CSRF 攻击另外 Cookie 存储在客户端存在被篡改的风险同时如果未设置 HttpOnly可能被 XSS 攻击窃取最后在非 HTTPS 场景下Cookie 还可能被窃听。因此在实际开发中需要结合 HttpOnly、Secure、SameSite 等属性来增强安全性。Cookie总结Cookie 是由服务器设置并存储在客户端浏览器的一小段键值对数据会在后续请求中自动携带到服务器。它常用于维持会话状态例如存储 sessionId。Cookie 具有 Domain、Path、Expires、HttpOnly、Secure 和 SameSite 等属性用于控制作用范围和安全性。Cookie 的主要问题包括容量和数量限制、受同域策略限制、浏览器自动发送容易导致 CSRF 攻击以及可能被 XSS 窃取或被用户篡改。因此在实际开发中通常会结合 HttpOnly、Secure 和 SameSite 等属性来提升安全性。SessionSession 是服务器用来记录用户状态的数据服务器用来记录用户状态的数据通过 Cookie 中的 sessionId 来识别用户。Session 里面通常存储什么首先就是用户身份信息{userId:1001,username:zhangsan}登录状态{isLogin:true}权限信息{role:admin,permissions:[read,write]}Session存储在哪里内存直接存储在服务器的内存中但是这样重启就消失了数据库Mysql等这样能够持久化但是相对性能会差一些Redis(最常用), 高性能支持过期时间分布式支持Session流程 登录时用户登录, 服务器创建 Session{sessionId:abc123,userId:1001}返回 CookieSet-Cookie: sessionIdabc123 后续请求浏览器带 CookieCookie:sessionIdabc123服务器查 Session获取用户信息 ✔Session 存在的问题占用服务器资源每个用户都需要存储不利于分布式在多台服务器的时候用户请求 → 服务器A有Session 下一次 → 服务器B没有Session ❌依赖cookie仍然有CSRF的风险Session总结Session 是服务器端用于存储用户状态的数据结构通常以键值对形式存在通过 Cookie 中的 sessionId 来进行关联。Session 中一般会存储用户身份信息、登录状态、权限信息以及一些临时业务数据。为了提高性能和支持分布式系统Session 通常会存储在内存或 Redis 中。TokenToken 是一种用于身份认证的凭证由服务器生成并返回给客户端客户端在后续请求中携带该凭证来证明自己的身份。Token的工作流程 登录阶段用户登录服务器验证账号密码 ✔生成 Token例如 JWT返回给客户端 后续请求客户端每次请求带上Authorization: Bearer token 服务器验证 Token ✔ 通过 → 返回数据JWT(最常见的token)Json web token是目前最常见的方式Jwt由三部分组成Header.Payload.SignatureHeader头部用来描述加密算法{alg:HS256,typ:JWT}Payload存用户信息{userId:1001,username:zhangsan,exp:1710000000}Signature用密钥生成防止被篡改HMACSHA256(base64(header).base64(payload),secret)Token的特点优点❌ 无需服务器存储无状态✔ 支持分布式天然适合微服务✔ 跨域友好前后端分离必备✔ 性能好不用查数据库缺点❗一旦泄露 → 无法立即失效❗Payload 可被解码不能放敏感信息❗需要手动管理不像 Cookie 自动发送Token的安全问题XSS → 偷 Token如果存localStorage ❌ JS 可以拿到Token 泄露 被截获就能用防御措施使用 HTTPS ✔设置过期时间exp✔使用 Refresh Token ✔不在 Payload 放敏感信息 ✔Token总结Token 是一种用于身份认证的凭证通常由服务器生成并返回给客户端客户端在后续请求中通过 Authorization 头携带 Token 来完成身份验证。常见实现是 JWT它由 Header、Payload 和 Signature 三部分组成。相比 SessionToken 具有无状态、易扩展的特点适用于前后端分离和分布式系统但需要注意 Token 泄露和过期管理等安全问题。

更多文章