JWT令牌
JWT(JSON Web Token)整体是三段由
. 分隔的 Base64URL 字符串,结构:Header.Payload.Signature
示例完整 token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c一、三段分别作用
1. Header 头部(第一段)
作用:声明加密算法、令牌类型,JSON → Base64URL 编码
标准字段:
标准字段:
alg:签名算法(常用 HS256、RS256)typ:固定 JWT,表示这是 JWT 令牌
原始 JSON 示例:
1 { 2 "alg": "HS256", 3 "typ": "JWT" 4 }
2. Payload 载荷(第二段,核心业务数据)
存放业务信息、过期规则,同样 Base64URL 编码,分两类字段:
1)官方标准声明(推荐使用)
| 字段 | 含义 |
|---|---|
| iss | 签发者(服务端地址) |
| sub | 主题,一般存用户 ID |
| aud | 接收方 / 客户端 |
| exp | 过期时间戳(秒,必填) |
| nbf | 生效时间,在此之前不可用 |
| iat | 签发时间戳 |
| jti | JWT 唯一 ID,防重放 |
2)自定义私有声明(业务自定义)
比如
username、role、userId、tenantId 等业务字段。原始 Payload 示例:
1 { 2 "sub": "10001", 3 "username": "admin", 4 "role": "admin", 5 "iat": 1789000000, 6 "exp": 1789086400 7 }
⚠️ 重点提醒:Payload 只是 Base64 编码,不是加密!不能存密码、银行卡等敏感数据,任何人拿到 token 都能解码查看内容。
3. Signature 签名(第三段,防篡改核心)
生成规则:
- 把
Header.Base64字符串 + "." + Payload.Base64字符串拼接 - 使用 Header 指定的算法 + 密钥 / 私钥 进行加密哈希
- 输出 Base64URL 字符串
以 HS256(对称加密)为例公式:
1 HMACSHA256( 2 base64UrlEncode(header) + "." + base64UrlEncode(payload), 3 密钥secret 4 )
作用:校验 token 是否被篡改,只要 header/payload 任意字符被修改,签名校验直接失败。
二、两种加密方案区别
- HS256(HMAC-SHA256 对称加密)
- 只用一个密钥 secret,签发、校验都用同一个密钥
- 适合单体项目,简单易用
- RS256(RSA 非对称加密)
- 私钥:服务端签发 token
- 公钥:网关 / 客户端校验签名
- 适合微服务、第三方登录,密钥不会泄露
三、传输使用规范
- HTTP 请求头携带(标准方式)Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
- 禁止放 URL 参数(日志会泄露 token)
- HTTPS 环境使用,防止抓包窃取
四、补充:Base64URL 和普通 Base64 区别
JWT 使用 Base64URL 做编码,替换 3 个特殊字符适配 URL 传输:
+→-/→_- 末尾填充
=直接删除
五、最简 Java 生成示例(HS256)
1 // 依赖 jjwt 2 JwtBuilder builder = Jwts.builder() 3 .setSubject("10001") // 用户id 4 .claim("username", "admin") 5 .setIssuedAt(new Date()) 6 .setExpiration(new Date(System.currentTimeMillis() + 30 * 60 * 1000)) //30分钟过期 7 .signWith(SignatureAlgorithm.HS256, "自定义密钥secret") 8 .compact();

浙公网安备 33010602011771号