首页 / 资讯中心 / 文章详情

Cookie、Session、Token、JWT 区别与使用场景:Web 身份认证全面解析

Cookie、Session、Token、JWT 区别与使用场景:Web 身份认证全面解析 ★ FEATURED ARTICLE
HTTP 本身是无状态协议服务端无法自动识别客户端身份。Cookie、Session、Token、JWT 是 Web 开发最常用的四种身份认证方案。本文从原理入手逐个拆解工作流程横向对比优缺点区分 Token 与 JWT 的关系分析选型方案、安全风险附带开发踩坑清单与面试题适合后端开发学习与复习。前言前面我们学习 HTTP 协议时提到HTTP 无状态每一次请求都是独立的服务端不会记住上一次是谁访问的。 登录态保持、身份认证本质就是解决 HTTP 无状态问题。很多人容易混淆这几个概念Cookie 是浏览器存储载体Session 是服务端会话Token 是通用令牌JWT 是 Token 的一种标准化实现。Cookie 是浏览器端存储机制Session 是服务端会话方案Token 是身份令牌统称JWT 是自包含的 Token。一、原理详解1. CookieCookie 是浏览器原生存储机制由服务端通过响应头Set-Cookie下发浏览器自动保存访问同源网站时自动携带在请求头 Cookie 字段。存储位置浏览器本地容量限制单个 Cookie 最多 4KB一个域名最多几十个 Cookie特点自动携带浏览器原生支持可设置HttpOnly、Secure、SameSite 属性提升安全工作流程登录成功服务端响应头添加Set-Cookie: SESSIONIDabc123浏览器保存 Cookie后续访问同域名接口请求头自动带上 Cookie注意Cookie 不是登录认证方案只是数据存储载体常配合 Session 一起使用。安全风险普通 Cookie 容易遭受 XSS 读取不设置 SameSite 会引发 CSRF 攻击。2. Session服务端会话Session 是有状态登录方案登录后用户信息保存在服务端内存 / Redis只把唯一标识 SessionId 下发给客户端一般放在 Cookie 中存储。存储位置用户信息存在服务端客户端只存 SessionId工作流程用户提交账号密码登录服务端校验账号在服务端创建 Session生成唯一 SessionId用户信息存入 Session通过Set-Cookie把 SessionId 写入浏览器 Cookie后续请求浏览器自动携带 Cookie 里的 SessionId服务端拿到 SessionId查询 Session识别用户身份优点用户数据保存在服务端客户端看不到敏感信息注销登录简单服务端直接删除 Session 即可立刻失效开发简单Java Web 原生支持 HttpSession。缺点有状态单机部署没问题集群 / 微服务场景需要 Session 共享增加维护成本大量在线用户时服务端 / Redis 存储压力变大。扩展分布式 Session一般把 Session 存入 Redis实现多实例共享会话。3. Token通用令牌Token 是身份令牌的统称本质是一串随机字符串属于自定义令牌方案。很多人混淆JWT 属于 Token但 Token 不一定是 JWT。我们日常项目 Redis 存储的随机字符串 Access Token就是普通 Token。工作流程Redis 版 Token用户登录校验成功服务端生成随机字符串 Token在 Redis 中存入Token - 用户信息设置过期时间返回 Token 给前端前端存到 localStorage /sessionStorage后续请求前端手动在请求头Authorization: Bearer xxxToken带上令牌服务端接收 Token查询 Redis校验身份优点跨域、跨端友好H5、小程序、APP 都能用不受 Cookie 同源限制服务端集群部署简单统一访问 Redis 即可灵活可控删除 Redis 记录就能让 Token 立即失效。缺点每次鉴权都要查询 Redis有一次 IO 开销需要前端手动管理 Token请求头手动携带不像 Cookie 自动发送。4. JWTJSON Web TokenJWT 是标准化、自包含的 TokenRFC7519 规范本身携带用户信息不需要服务端存储会话数据无状态。 格式Header.Payload.Signature三段使用.分隔全部 Base64Url 编码Header头部加密算法、类型例如 HS256Payload载荷存放自定义声明userId、role、exp 过期时间可以被解码不能放密码等敏感数据Signature签名使用密钥对 HeaderPayload 签名防止内容被篡改校验逻辑服务端拿到 JWT使用密钥重新计算签名对比原签名。签名一致代表数据没有被篡改直接读取 Payload 里面用户信息不需要查询 Redis / 数据库。优点无状态不需要服务端存储会话微服务、跨服务调用友好自带用户信息减少数据库 / Redis 查询跨语言、跨平台通用。缺点一旦签发在有效期内无法直接作废很难实现立即下线Payload 可以解码不能存放敏感信息Token 字符串较长每次请求增加报文体积。生产解决方案JWT 黑名单Redis 存放已注销 JWT、短期 Access JWT 长周期 Refresh Token 双令牌方案。二、横向对比总表方案存储位置有 / 无状态失效控制跨端 / 跨域安全风险Cookie浏览器仅存储载体配合服务端控制同源限制CSRF、XSSSessionCookie用户数据在服务端客户端存 SessionId有状态可立即删除快速失效仅 Web 浏览器CSRFRedis TokenToken 存在前端用户信息 Redis有状态删除 Redis 即可失效Web/APP/ 小程序均可XSS前端本地存储泄露JWT全部信息编码在 Token 字符串无状态默认无法立刻失效需黑名单Web/APP/ 小程序均可Payload 明文可解码三、适用场景Session Cookie 适合传统单体 Web 网站、后台管理系统浏览器端访问为主。优点开发简单登录可以立即踢人下线缺点集群需要做 Session 共享不适合 APP、小程序。Redis Token随机字符串 Token适合中小型前后端分离项目、小程序、APP、H5需要支持用户强制下线。国内绝大多数前后端分离项目生产首选这套方案兼顾扩展性与可控性。JWT 适合微服务、第三方 API 开放接口、服务之间调用不需要频繁强制下线场景。不推荐单纯 JWT 做登录系统因为注销很难立刻失效一般搭配 Refresh Token Redis 黑名单使用。四、常见误区1、误区JWT 就是 TokenToken 就是 JWTToken 是令牌统称JWT 只是 Token 其中一种实现。Redis 随机字符串 Access Token 也是 Token。2、误区JWT 加密Payload 里面可以放手机号、密码JWT 只是签名防篡改Payload 是 Base64 编码可以直接解码查看不是加密严禁存放敏感信息。3、误区Session 只能放在内存不能集群部署Session 可以存入 Redis实现分布式 Session解决多实例共享问题。4、误区Cookie 不能用于前后端分离Cookie 受同源策略限制跨域场景很难使用前后端分离跨域项目一般优先 Token 方案。五、踩坑汇总Cookie 如果不设置HttpOnly前端 JS 可以读取容易 XSS 窃取 CookieCookie 跨域场景无法自动携带前后端分离项目尽量不用 Cookie 存储登录凭证JWT 有效期不要设置过长Access Token 建议短有效期15~30 分钟搭配 Refresh Token 刷新前端 Token 存 localStorage 会受 XSS 攻击HttpOnly Cookie 可以防止 JS 读取JWT 黑名单方案会丧失 “无状态” 优势项目要权衡取舍签名密钥必须妥善保管密钥泄露攻击者可以伪造任意 JWT。六、问答Q1Cookie 和 Session 的关系ACookie 是浏览器存储载体Session 是服务端会话。传统方案将 SessionId 存入 Cookie浏览器每次请求自动携带 Cookie服务端拿到 SessionId 查询会话。Cookie 存在客户端Session 数据存在服务端。Q2Token 和 JWT 区别AToken 是身份令牌的统称JWT 是自包含、带签名的标准化 Token。普通 Redis Token 只是一串随机字符串用户信息存在 RedisJWT 把用户信息放在 Token 内部校验签名后直接解析不需要查询存储。Q3JWT 无状态是什么意思有什么缺点A无状态指服务端不需要保存会话信息校验只需要验证签名。缺点签发后到期前无法直接作废想要强制下线需要额外维护黑名单。Q4Session 方案和 Redis Token 方案怎么选择A传统单体 Web 后台浏览器访问优先 SessionCookie前后端分离、小程序、APP、分布式集群优先 Redis 随机 Token 方案方便跨端。结语Cookie、Session、Token、JWT 本质都是为了解决 HTTP 无状态实现身份认证。 选型不要盲目追捧 JWT优先看业务是否需要强制下线、是否跨端、是否分布式。绝大多数国内前后端分离项目Redis 存储随机 Token 是生产最稳妥方案。 理解这套认证体系也能更好理解接口鉴权、跨域、安全攻防相关知识点。
阅读完成 · 觉得有帮助?
咨询建站