一、为什么需要 JWT?(Session vs Token)
在前后端分离、微服务架构大行其道的今天,JWT(JSON Web Token)几乎成为了身份认证的代名词。
很多开发者只知道它是一个'长长的字符串',用来做登录校验,但并不清楚它内部的运作机制,以及它在安全性上的潜在风险。本文将从原理、结构、流程、以及最核心的生产陷阱四个维度进行详细拆解。
1.传统 Session 的认证痛点
- 服务端有状态:服务端需要保存 Session 数据(内存或 Redis)。
- 扩展性差:集群环境下,必须做 Session 共享(如存入 Redis),否则用户请求落到不同服务器会掉线。
- 移动端支持差:原生 App 对 Cookie 的支持不如浏览器友好。
- CSRF 风险:基于 Cookie 自动发送的特性,容易遭受跨站请求伪造攻击。
2.JWT(JSON Web Token)认证优势
- 服务端无状态:服务器不保存任何会话数据,Token 本身包含了用户信息和有效期。
- 扩展性强:服务器拿到 Token 只要'解密/验签'即可,天然支持分布式、微服务。
- 跨语言/跨端:JSON 是通用的,且不依赖 Cookie,适合 App、小程序、IoT 设备
一句话总结:
Session 是把'通行证'存在服务器,给你个号码;JWT 是把'通行证'直接印发给你,服务器只负责查验真伪。
二、JWT 的结构解剖
一个标准的 JWT 字符串看起来是这样的:
xxxxx.yyyyy.zzzzz
它由 3 部分 组成,中间用 . 分隔:
1.Header(头部)
描述 Token 的元数据,通常包含两部分:
{ "alg": "HS256", // 签名算法,如 HMAC SHA256 或 RSA
"typ": "JWT" // 令牌类型 }
Base64Url 编码后,构成第一部分。
2.Payload(负载)
这是最核心的部分,存放有效信息(Claims)。包含标准字段和自定义字段:
{ "sub": "1234567890", // 用户 ID
"name": "John Doe", // 自定义字段
"admin"

