JWT是什么?
JWT(JSON Web Token)就像一张"加密的电子通行证",用来证明你是谁、能干什么。它由三段字符串拼接而成(比如xxx.yyy.zzz),每段对应不同的信息:
头(Header):说明加密算法类型,比如"用HS256算法签名" 。
身体(Payload):存用户身份信息(如用户ID、角色)、有效期等,类似快递单上的收件人和地址。
签名(Signature):用密钥对前两段内容加密生成的"防伪码",防止信息被篡改。
你去游乐园玩,入口处发给你一张门票(JWT),上面写着"张三,VIP,有效期1天",并盖了章(签名)。之后进每个项目,工作人员扫一下票就能确认你的身份,不用每次都查身份证(数据库)。
JWT有什么用?
- 身份验证(登录)
场景:用户登录后,服务器生成JWT返回给客户端(比如浏览器或APP),后续请求带着JWT就能直接访问资源,无需反复输入账号密码 。
优势:比传统的Session更轻量,服务器不用存用户状态,适合分布式系统(如微服务)。 - 权限控制(你能干啥)
场景:JWT里可以存用户角色(如普通用户、管理员),服务器根据角色决定能否访问某个功能(比如删除数据)。 - 跨系统通信(单点登录)
场景:用同一个JWT登录多个关联系统(比如阿里旗下淘宝、支付宝),避免反复登录。 - 信息交换(安全传数据)
场景:A系统生成JWT,B系统验证签名后直接读取数据,无需双方共享数据库 。
JWT怎么用?三步走:生成→传递→验证
- 生成JWT
依赖:Java项目引入jjwt库(其他语言类似)。
代码示例(Java):
java
String jwt = Jwts.builder()
.setSubject("用户ID") // 用户唯一标识
.claim("role", "admin") // 自定义权限
.setExpiration(有效期) // 设置过期时间
.signWith(密钥, 加密算法) // 生成签名
.compact();
注意:密钥必须保密,别写在代码里!
- 传递JWT
方式:通常放在HTTP请求头的Authorization字段里:
java
Authorization: Bearer xxx.yyy.zzz
安全建议:用HTTPS传输,防止被截获。
- 验证JWT
服务器代码(Java):
java
Jws<Claims> claims = Jwts.parserBuilder()
.setSigningKey(密钥)
.build()
.parseClaimsJws(jwt);
String userId = claims.getBody().getSubject(); // 提取用户ID
若签名无效或已过期,直接拒绝请求。
注意事项
1.别存敏感信息:JWT的Payload是Base64编码,可以被解码,别放密码、手机号 。
2.控制有效期:设置合理过期时间(如1小时),减少被盗用风险。
3.密钥保管好:密钥泄露等于所有JWT失效,建议用环境变量或密钥管理服务。
4.无法中途废止:JWT一旦签发,在过期前无法强制失效,重要操作可结合二次验证。
总结
JWT是"无状态通行证",解决登录、权限、跨系统通信问题。
核心优势:轻量、跨平台、适合分布式系统。
适用场景:APP、网站、微服务、单点登录等。