JWT(JSON Web Token)是一种开放标准(RFC 7519),用于安全地在各方之间传递信息。JWT 是经过编码的 JSON 对象,包含三部分:头部(Header)、载荷(Payload)和签名(Signature)。由于信息是以 JSON 格式传递,JWT 在Web应用程序中尤其常用,常用于身份验证和信息交换。
JWT的基本结构
一个完整的JWT由三部分组成,分别用“.”分隔:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
Header:头部通常包含两个部分:令牌的类型(即JWT)以及所使用的签名算法(例如HMAC SHA256或RSA)。
json { "alg": "HS256", "typ": "JWT" }
-
Payload:载荷部分包含所要传递的声明(claims)。声明可以分为三类:
- 注册声明(Registered claims):一组预定义的声明,如
iss
(发行者)、exp
(过期时间)、sub
(主题)等。 - 公共声明(Public claims):自定义的声明,必须避免碰撞。
-
私有声明(Private claims):双方同意使用的声明。
示例:
json { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
-
Signature:签名部分由头部和载荷生成,需要一个密钥。用于验证发送者的身份,以及确保消息在传输过程中未被篡改。
shell HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret)
JWT的使用场景
JWT最常见的用途是身份验证。在用户登录后,服务器生成一个JWT并将其返回给用户,用户在后续的请求中携带该JWT,服务器通过验证JWT来识别用户身份。
代码示例(Node.js)
以下是一个简单的Node.js示例,演示了如何生成和验证JWT:
const jwt = require('jsonwebtoken');
// 定义密钥
const secretKey = 'my_secret_key';
// 生成JWT
function generateToken(user) {
const token = jwt.sign({ id: user.id, name: user.name }, secretKey, { expiresIn: '1h' });
return token;
}
// 验证JWT
function verifyToken(token) {
try {
const decoded = jwt.verify(token, secretKey);
return decoded;
} catch (error) {
return null; // 验证失败
}
}
// 示例用户
const user = { id: 1, name: 'John Doe' };
// 生成token
const token = generateToken(user);
console.log('Generated JWT:', token);
// 验证token
const decoded = verifyToken(token);
if (decoded) {
console.log('Decoded JWT:', decoded);
} else {
console.log('Token is invalid');
}
总结
JWT 是一种高效、安全的信息交换方式。它的自包含特性使得在多种环境(如移动应用和微服务架构)中都可以使用。通过加密和签名,JWT 可以有效地防止数据篡改和伪造。在实际应用中,开发者需要仔细设计用于敏感数据的JWT,并确保使用安全的密钥和算法,以最大程度地保护用户信息和应用的安全。