JWT(JSON Web Token)是一种用于在各方之间安全传递信息的紧凑型、URL安全的令牌。它在现代 Web 应用中非常常见,尤其是在分布式系统和微服务架构中,主要用于身份验证和授权机制。本文将介绍 JWT 的基本概念、结构,并结合 Spring Boot 和 Node.js 等框架的实际应用场景,通过代码示例深入解析其原理与用法。同时,还会推荐一些常用的 JWT 工具,帮助你更好地理解和调试 JWT。
一、JWT 的结构
JWT 是由三个部分组成的,使用点号(
.
)分隔:
- Header:头部,通常包含令牌的类型(JWT)和签名算法。
- Payload:负载,包含用户信息或声明(Claims),比如用户 ID、用户名等。
- Signature:签名,确保令牌未被篡改。
一个 JWT 示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1. Header
Header 通常包括两部分信息:声明类型(JWT)和签名算法(如 HMAC SHA-256)。
{"alg":"HS256","typ":"JWT"}
2. Payload
Payload 部分存储声明(Claims),可以包括标准声明(如
sub
,
iat
,
exp
),也可以是自定义声明。
{"sub":"1234567890","name":"John Doe","admin":true}
3. Signature
Signature 是通过对 Header 和 Payload 进行编码后,结合一个密钥和指定的算法生成的。对于 HMAC SHA256 的签名生成过程如下:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
Signature 的作用是确保 JWT 的内容未被篡改。
二、JWT 的应用场景
1. 身份验证
JWT 最常见的使用场景是身份验证。用户登录成功后,服务器生成一个 JWT 并返回给客户端。客户端随后每次请求时都携带该 JWT,服务器通过验证 JWT 来确认用户身份。
2. 授权
JWT 还可用于授权。用户在访问某些受限资源时,服务器通过解析 JWT 确认用户是否具备权限。常见的 RESTful API 授权就是通过 JWT 来完成的。
三、JWT 的优缺点
优点
- 跨平台支持:JWT 是基于 JSON 的格式,几乎所有编程语言都可以解析和生成它。
- 轻量级:JWT 可以存储在客户端,无需服务器维护会话状态。
- 安全性:通过签名机制确保 JWT 未被篡改,并结合 HTTPS 提供额外的传输层安全性。
缺点
- 无法撤销:JWT 一旦签发,除非过期或刷新,否则无法主动注销或撤销。
- 体积较大:如果 Payload 中包含大量信息,可能会影响网络性能。
四、结合 Spring Boot 实现 JWT
在 Spring Boot 中,常用 jjwt 库来生成和验证 JWT。
1. 引入依赖
在
pom.xml
中引入以下依赖:
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>
2. 生成 JWT
importio.jsonwebtoken.Jwts;importio.jsonwebtoken.SignatureAlgorithm;publicclassJwtUtil{privatestaticfinalStringSECRET_KEY="mySecretKey";publicstaticStringgenerateToken(String username){returnJwts.builder().setSubject(username).signWith(SignatureAlgorithm.HS256,SECRET_KEY).compact();}}
3. 验证 JWT
importio.jsonwebtoken.Claims;importio.jsonwebtoken.Jwts;publicclassJwtUtil{publicstaticClaimsverifyToken(String token){returnJwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();}}
4. 应用 JWT 的 Controller
@RestControllerpublicclassAuthController{@PostMapping("/login")publicResponseEntity<?>login(@RequestBodyLoginRequest request){// 验证用户登录if(isValidUser(request)){String token =JwtUtil.generateToken(request.getUsername());returnResponseEntity.ok(newJwtResponse(token));}returnResponseEntity.status(HttpStatus.UNAUTHORIZED).build();}@GetMapping("/protected")publicResponseEntity<?>getProtectedResource(@RequestHeader("Authorization")String token){if(JwtUtil.verifyToken(token)!=null){returnResponseEntity.ok("Protected data");}returnResponseEntity.status(HttpStatus.UNAUTHORIZED).build();}}
五、结合 Node.js 实现 JWT
在 Node.js 中,可以使用 jsonwebtoken 库来处理 JWT。
1. 安装依赖
npminstall jsonwebtoken
2. 生成 JWT
const jwt =require('jsonwebtoken');const secretKey ='mySecretKey';functiongenerateToken(username){return jwt.sign({username: username }, secretKey,{expiresIn:'1h'});}
3. 验证 JWT
functionverifyToken(token){try{return jwt.verify(token, secretKey);}catch(e){returnnull;}}
4. 应用 JWT 的路由
const express =require('express');const app =express();
app.post('/login',(req, res)=>{const username = req.body.username;const token =generateToken(username);
res.json({token: token });});
app.get('/protected',(req, res)=>{const token = req.headers['authorization'];if(verifyToken(token)){
res.json({data:'Protected data'});}else{
res.status(401).send('Unauthorized');}});
app.listen(3000,()=>{
console.log('Server running on port 3000');});
六、JWT 的查看和编解码工具
为了方便开发者调试 JWT,以下是几个常用的 JWT 编解码工具:
1. JWT.io
JWT.io 是一个在线的 JWT 编解码工具。它可以帮助你解码、验证和生成 JWT,方便调试和查看 JWT 的 Header、Payload 和 Signature。
使用方法:
- 打开 JWT.io 网站。
- 将 JWT 粘贴到左侧的输入框中,右侧会显示解码结果,并提供验证签名的选项。
2. jwt-decode
jwt-decode
是一个轻量级的 JavaScript 库,用于解码 JWT,而无需验证签名。它非常适合在客户端快速调试或查看 JWT 数据。
安装:
npminstall jwt-decode
使用:
const jwtDecode =require('jwt-decode');const token ='your.jwt.token';const decoded =jwtDecode(token);
console.log(decoded);
3. Postman
Postman 是常用的 API 调试工具。它可以自动解析和附加 JWT,帮助你测试带有 JWT 的 API 请求。
使用方法:
- 在请求头的 Authorization 选项中选择 Bearer Token,并将 JWT 粘贴其中,即可自动完成授权。
4. Python PyJWT
PyJWT 是 Python 中用于处理 JWT 的库,适合开发和调试 Python 项目中的 JWT。
安装:
pip install pyjwt
使用:
import jwt
token ='your.jwt.token'# 解码 JWT
decoded = jwt.decode(token, options={"verify_signature":False})print(decoded)
七、总结
JWT 是一种灵活、轻量且跨平台的身份验证和授权方式。在现代 Web 应用中,尤其是分布式架构和微服务中,JWT 广泛用于处理用户身份验证和权限管理。通过本文的介绍,你不仅可以了解 JWT 的基本原理,还可以结合 Spring Boot 和 Node.js 实现 JWT 认证系统,并利用常用的调试工具提升开发效率。希望本文能帮助你更好地理解并运用 JWT。
版权归原作者 @井九 所有, 如有侵权,请联系我们删除。