1. 什么是JWT
JWT,全称是 JSON Web Token,是一种用于身份认证的开放标准(RFC 7519)。它是基于 JSON 格式的轻量级安全认证方式,通常用于跨域应用间的认证。
简单来说,JWT 通过在用户和服务器之间传输 JSON 对象来实现用户的认证,该 JSON 对象经过加密,以保证安全性。这些 JWT 可用于鉴定身份和传递声明,而且它们可以使用 HMAC 算法或对称(双方都使用私有密钥)或者RSA/ECDSA的公私钥对来签名。
2. 如何使用JWT
2.1. JWT 的组成
JWT 由三部分组成,分别是 Header、Payload 和 Signature。其中 Header 部分和 Payload 部分都是 Base64Url 编码的字符串,它们之间以 . 符号分隔;而 Signature 部分则由 Header、Payload 和一个 Secret_key(签名密钥)共同组成,其中 Secret_key 也是一个字符串。
2.2. JWT 的生成流程
JWT 的生成流程可以分为三步:
将 Header 和 Payload 分别编码
将 Header 和 Payload 的编码结果用 . 连接起来,得到 JWT 的前两部分
使用 Secret_key 将前两部分哈希,然后对哈希结果再进行签名,得到 Signature 部分
将前两部分和最终的 Signature 部分用 . 连接起来,即可得到最终的 JWT。
2.3. JWT 的验证流程
前端可以将生成的 JWT 保存在 localStorage 或者 cookie 中,每次发送请求时,将 JWT 添加到请求头中,例如:
Authorization: Bearer <JWT>
后端在接收到请求时,会从请求头中提取出 JWT,进行验证。验证流程如下:
从 JWT 中提取出 Header 和 Payload 部分
使用相同的算法和 Secret_key 对 Header 和 Payload 进行哈希和签名,得到一个新的 Signature
将新的 Signature 和原来 JWT 中的 Signature 进行比较,如果相同,则验证通过
3. JWT 的优缺点
3.1. JWT 的优点
JWT 可以跨域传输,适用于各种环境
JWT 不需要在服务器存储会话信息,可以大幅度降低服务器的负担
JWT 可以被用于身份认证和授权,可以增强系统的安全性
3.2. JWT 的缺点
JWT 在加密过程中,其实现中使用了非对称加密算法,在产生短期的 JWT 时,由于需要使用同样具有浪费资源的算法,因此在一定程度上,会对后端性能造成影响。
JWT 可以被拦截、解析和篡改,如果 JWT 的过期时间设置过长,那么会增加令牌被盗用的风险
4. JWT 的实例
下面是一个使用 JWT 进行身份验证的示例:
app.use('/api', function(req, res, next) {
//校验 token
var token = req.body.token || req.query.token || req.headers['x-access-token'];
if (token) {
jwt.verify(token, 'secretKey', function(err, decoded) {
if (err) {
return res.json({ success: false, message: 'Failed to authenticate token.' });
} else {
req.decoded = decoded;
next();
}
});
} else {
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
});
以上代码会在每个请求开始前,校验用户的 JWT 是否有效,如果无效,则会返回错误信息。
结论
JWT 是一种轻量级的认证方式,以 JSON 对象的形式传输用户认证信息。其本质是在客户端和服务器之间交换 JSON 对象,然后用 Secret_key 哈希,并使用 RSA/ECDSA算法签名,以确定这些信息是真实可信的。总的来说,JWT 具有较高的安全性和可用性,适用于广泛的应用场景。