js jwt认证的工作原理
什么是JWT
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间传输信息的可靠、自包含的方式。它由三部分组成,分别是 Header(头部)、Payload(负载)和 Signature(签名)。
JWT的结构
Header(头部)
头部通常由两部分组成:令牌的类型(即 JWT)和所使用的签名算法。通常,头部会使用 Base64 编码。
{
"alg": "HS256",
"typ": "JWT"
}
Payload(负载)
负载是 JWT 的第二部分,包含一些声明(claim)的注册信息和其他需要传递的数据。声明可以是标准声明(如iss(签发者),exp(过期时间)等),也可以是自定义的声明。负载也是以 Base64 编码的形式出现。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Signature(签名)
签名部分使用了Header
、Payload
和一个秘钥进行加密,防止数据篡改。签名值的生成需要使用指定的算法。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
最终的 JWT 是将编码后的 Header、Payload 和 Signature 三部分用点号连接起来的字符串。
JWT的工作流程
- 用户使用用户名和密码进行身份验证,服务端验证用户名和密码的正确性。
-
服务端生成 JWT,并将 JWT 返回给用户。
-
用户将 JWT 存储在客户端,一般存储在 Local Storage 或者 Session Storage 中。
-
用户在每次请求时将 JWT 添加到请求头的 Authorization 字段中。
Authorization: Bearer <token>
- 服务端解析 JWT 中的数据,并进行有效性验证,返回相应的数据。
JWT的优点和缺点
优点
-
无状态:JWT 实现了无状态的认证和授权机制,服务端不需要记录任何会话信息。
-
跨域支持:由于 JWT 是由服务端生成的,可以在跨域的情况下安全地使用。
-
可拓展性:负载中可以加入自定义的声明,方便进行用户认证和其他业务扩展。
缺点
-
无法废止:当 JWT 发行后,无法废止,只能依靠 token 过期时间和刷新机制来保证安全性。
-
数据量较大:由于 JWT 包含了很多信息,所以相对于其他认证方式(如 Session),数据量较大。
-
无法废止:当 JWT 发行后,无法废止,只能依靠 token 过期时间和刷新机制来保证安全性。
使用Node.js实现JWT
以下是使用 Node.js 实现 JWT 认证的示例代码:
const jwt = require('jsonwebtoken');
const secretKey = 'mySecretKey';
// 生成JWT
const generateJWT = () => {
const payload = {
sub: '1234567890',
name: 'John Doe',
admin: true
};
const options = {
expiresIn: '1h'
};
return jwt.sign(payload, secretKey, options);
};
// 解析JWT
const verifyJWT = (token) => {
return jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
console.log('JWT verification failed.');
return false;
}
console.log('JWT verified successfully.');
console.log(decoded);
return true;
});
};
// 测试生成和验证JWT
const token = generateJWT();
verifyJWT(token);
下面是代码的运行结果:
JWT verified successfully.
{
sub: '1234567890',
name: 'John Doe',
admin: true,
iat: 1625126321,
exp: 1625130121
}
总结
JWT 是一种在网络应用间传输信息的可靠、自包含的方式。它由 Header、Payload 和 Signature 三个部分组成,通过使用密钥对其进行加密和验证。JWT具有无状态、跨域支持和可拓展性等优点,但也存在无法废止和数据量较大等缺点。在 Node.js 中,可以使用jsonwebtoken库来方便地生成和验证JWT。