JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于在网络应用环境间以 JSON 对象安全地传递信息。JWT 可以用于身份验证、信息交换等场景。接下来,我们将详细解析 JWT 的基本结构、工作原理以及代码示例。
JWT 的基本结构
JWT 通常由三部分组成,每一部分之间用点(.
)连接,格式如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
Header(头部): 头部通常由两部分组成:类型(即 JWT)和所使用的签名算法(例如 HMAC SHA256 或 RSA)。例如:
json { "alg": "HS256", "typ": "JWT" }
-
Payload(负载): 负载部分包含了声明(claims),用于存储用户信息和其他数据。声明分为三类:
- 注册声明:如
iss
(发行者)、exp
(过期时间)、sub
(主题)等。 - 公共声明:可以自定义的声明,需避免冲突。
- 私有声明:特定于双方的声明。
例如:
json
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
- Signature(签名):
为了确保 JWT 的安全性,需要对头部和负载进行签名。签名的方式取决于头部所指定的算法。例如,使用 HMAC SHA256 签名:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret)
JWT 的工作原理
JWT 工作的基本过程可以分为几个步骤: 1. 客户端向服务器发送登录请求,包含用户名和密码。 2. 服务器验证用户身份,如果成功,则生成 JWT 令牌。 3. 服务器将 JWT 返回给客户端。 4. 客户端存储 JWT(如 localStorage)。 5. 每次请求时,客户端将 JWT 添加到 HTTP 请求的 Authorization 头中。 6. 服务器接收到请求时,解析 JWT,验证签名和有效性。 7. 如果验证通过,服务器处理请求;否则,返回未授权错误。
代码示例
下面是一个使用 Node.js 和 jsonwebtoken
库生成和验证 JWT 的简单示例。
- 安装依赖
npm install jsonwebtoken
- 生成 JWT
const jwt = require('jsonwebtoken');
// 密钥
const secretKey = 'your-256-bit-secret';
// 用户信息
const user = {
id: 1,
username: 'johndoe',
email: 'johndoe@example.com'
};
// 生成 JWT
const token = jwt.sign(user, secretKey, { expiresIn: '1h' });
console.log("Generated JWT:", token);
- 验证 JWT
// 验证 JWT
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
console.error("Token verification failed:", err);
} else {
console.log("Decoded JWT:", decoded);
}
});
总结
JWT 提供了一种简单且安全的方式来进行身份验证和信息交换。通过合理地使用 JWT,开发者可以构建出更安全的应用程序。然而,使用 JWT 也需要注意防止一些安全漏洞,例如令牌的泄露和重放攻击。因此,在设计和实现 JWT 时,务必要考虑到安全性和最佳实践。