JWT(JSON Web Token)是一种用于在各方之间安全传递信息的紧凑型、URL安全的令牌。它在现代 Web 应用中非常常见,尤其是在分布式系统和微服务架构中,主要用于身份验证和授权机制。本文将介绍 JWT 的基本概念、结构,并结合 Spring Boot 和 Node.js 等框架的实际应用场景,通过代码示例深入解析其原理与用法。同时,还会推荐一些常用的 JWT 工具,帮助你更好地理解和调试 JWT。
JWT 是由三个部分组成的,使用点号(.)分隔:
一个 JWT 示例:
- eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
Header 通常包括两部分信息:声明类型(JWT)和签名算法(如 HMAC SHA-256)。
- {
- "alg": "HS256",
- "typ": "JWT"
- }
-
Payload 部分存储声明(Claims),可以包括标准声明(如 sub, iat, exp),也可以是自定义声明。
- {
- "sub": "1234567890",
- "name": "John Doe",
- "admin": true
- }
-
Signature 是通过对 Header 和 Payload 进行编码后,结合一个密钥和指定的算法生成的。对于 HMAC SHA256 的签名生成过程如下:
- HMACSHA256(
- base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
-
Signature 的作用是确保 JWT 的内容未被篡改。
JWT 最常见的使用场景是身份验证。用户登录成功后,服务器生成一个 JWT 并返回给客户端。客户端随后每次请求时都携带该 JWT,服务器通过验证 JWT 来确认用户身份。
JWT 还可用于授权。用户在访问某些受限资源时,服务器通过解析 JWT 确认用户是否具备权限。常见的 RESTful API 授权就是通过 JWT 来完成的。
在 Spring Boot 中,常用 jjwt 库来生成和验证 JWT。
在 pom.xml 中引入以下依赖:
- <dependency>
- <groupId>io.jsonwebtoken</groupId>
- <artifactId>jjwt</artifactId>
- <version>0.9.1</version>
- </dependency>
-
- import io.jsonwebtoken.Jwts;
- import io.jsonwebtoken.SignatureAlgorithm;
-
- public class JwtUtil {
- private static final String SECRET_KEY = "mySecretKey";
-
- public static String generateToken(String username) {
- return Jwts.builder()
- .setSubject(username)
- .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
- .compact();
- }
- }
-
- import io.jsonwebtoken.Claims;
- import io.jsonwebtoken.Jwts;
-
- public class JwtUtil {
- public static Claims verifyToken(String token) {
- return Jwts.parser()
- .setSigningKey(SECRET_KEY)
- .parseClaimsJws(token)
- .getBody();
- }
- }
-
- @RestController
- public class AuthController {
-
- @PostMapping("/login")
- public ResponseEntity<?> login(@RequestBody LoginRequest request) {
- // 验证用户登录
- if (isValidUser(request)) {
- String token = JwtUtil.generateToken(request.getUsername());
- return ResponseEntity.ok(new JwtResponse(token));
- }
- return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
- }
-
- @GetMapping("/protected")
- public ResponseEntity<?> getProtectedResource(@RequestHeader("Authorization") String token) {
- if (JwtUtil.verifyToken(token) != null) {
- return ResponseEntity.ok("Protected data");
- }
- return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
- }
- }
-
在 Node.js 中,可以使用 jsonwebtoken 库来处理 JWT。
- npm install jsonwebtoken
-
- const jwt = require('jsonwebtoken');
- const secretKey = 'mySecretKey';
-
- function generateToken(username) {
- return jwt.sign({ username: username }, secretKey, { expiresIn: '1h' });
- }
-
- function verifyToken(token) {
- try {
- return jwt.verify(token, secretKey);
- } catch (e) {
- return null;
- }
- }
-
- 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 编解码工具:
cdsy.xyz:jwt-decode 是一个在线的 JWT 编解码工具。它可以帮助你解码、验证和生成 JWT,方便调试和查看 JWT 的 Header、Payload 和 Signature。
jwt-decode 是一个轻量级的 JavaScript 库,用于解码 JWT,而无需验证签名。它非常适合在客户端快速调试或查看 JWT 数据。
- npm install jwt-decode
-
- const jwtDecode = require('jwt-decode');
-
- const token = 'your.jwt.token';
- const decoded = jwtDecode(token);
-
- console.log(decoded);
-
Postman 是常用的 API 调试工具。它可以自动解析和附加 JWT,帮助你测试带有 JWT 的 API 请求。
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。