共计 3417 个字符,预计需要花费 9 分钟才能阅读完成。
JSON Web Token(JWT),又称为 JSON
令牌,是一种用于在网络应用之间平安地传输信息的凋谢规范(RFC 7519)。它采纳了一种紧凑的、自蕴含的形式来示意信息,通常用于身份验证和受权。JWT 的设计指标是确保信息的完整性和安全性,同时具备易于应用和传输的特点。
JWT 的构造
JWT 由三个局部组成,它们之间以 .
分隔,别离是:
- Header(头部):蕴含了对于令牌的元数据和形容,通常包含令牌的类型(
typ
)和签名算法(alg
)等信息。这一部分是一个JSON
对象,通常会被base64url
编码。 -
Payload(载荷):蕴含了须要传输的数据,也是一个
JSON
对象,通常包含一些申明(claim
)和用户定义的数据。常见的申明有:iss
(Issuer):令牌的发行者。sub
(Subject):令牌的主题,通常是用户的惟一标识符。aud
(Audience):令牌的受众,示意该令牌针对哪些接收者。exp
(Expiration Time):令牌的过期工夫。iat
(Issued At):令牌的颁发工夫。nbf
(Not Before):令牌的失效工夫。jti
(JWT ID):令牌的惟一标识符。
除了规范申明,你还能够在 Payload 中增加自定义的数据。
- Signature(签名):用于验证 JWT 的真实性和完整性。签名的生成形式通常是将 Header 和 Payload 局部组合起来,应用一个密钥(secret key)进行哈希运算,而后再与令牌中的签名局部比对。这个局部确保了令牌在传输过程中没有被篡改。
上面是一个 JWT 的示例:
Header:
{
"alg": "HS256",
"typ": "JWT"
}
Payload:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Signature:
HMACSHA256(base64UrlEncode(Header) + "." +
base64UrlEncode(Payload),
secret_key
)
上述示例中,Header 指定了应用 HS256(HMAC SHA-256)算法进行签名,Payload 蕴含了主题(sub)、姓名(name)以及颁发工夫(iat)等信息,Signature 应用了一个秘钥(secret_key)来生成。
JWT 的工作流程
JWT 的工作流程通常波及三个次要角色:颁发者(Issuer)、用户(User)、验证者(Verifier)。
- 颁发者(Issuer):颁发者是负责创立 JWT 的实体。颁发者将用户的信息和一些申明以及一个签名加工在一起,生成一个 JWT,并将其发送给用户。
- 用户(User):用户是 JWT 的持有者,通常是一个须要在不同利用之间传递信息的实体。用户能够在须要的时候将 JWT 发送给不同的利用来进行身份验证或受权。
- 验证者(Verifier):验证者是负责验证 JWT 的实体。它们接管到 JWT 后,首先会解析 JWT 的 Header 和 Payload,而后应用当时共享的密钥来验证 Signature 的有效性。如果验证胜利,验证者能够信赖 JWT 中蕴含的信息。
JWT 的工作流程如下:
- 用户通过某种形式(例如用户名明码登录)向颁发者申请令牌。
- 颁发者验证用户的身份后,创立一个 JWT,蕴含用户的信息和一些申明,而后应用本人的私钥来签名 JWT。
- 颁发者将 JWT 发送给用户。
- 用户在与不同的利用通信时,能够将 JWT 发送给利用作为身份验证或受权凭证。
- 利用接管到 JWT 后,应用之前与颁发者共享的公钥来验证 JWT 的签名,确保 JWT 没有被篡改。
- 如果 JWT 验证通过,利用能够信赖其中的信息,并依据须要执行相应的操作。
JWT 的长处
JWT 在古代应用程序中宽泛应用,因为它具备多个长处:
- 轻量级和自蕴含性:JWT 是紧凑的文本格式,易于传输和解析。所有必要的信息都蕴含在 JWT 自身中,无需在服务器上保留会话状态。
- 分布式身份验证:JWT 使得分布式系统中的身份验证变得更加简略,因为不同的利用能够共享雷同的 JWT 颁发者,而无需在各自的数据库中存储用户凭据。
- 无状态:因为 JWT 自身蕴含了所有必要的信息,服务器不须要保护会话状态,这对于负载平衡和容错性很有帮忙。
- 可扩展性:JWT 的 Payload 能够蕴含自定义申明,能够依据利用的需要增加额定的信息。
- 安全性:JWT 应用签名来爱护其完整性,避免篡改。应用适当的算法和密钥能够确保 JWT 的安全性。
应用场景
JWT 通常用于以下场景:
- 身份验证:用户登录后,颁发者能够生成一个蕴含用户信息的 JWT,用户能够在申请中携带该 JWT,以证实其身份。
- 受权:利用能够应用 JWT 来受权用户拜访某些资源或执行特定操作。JWT 的 Payload 能够包
含用户的角色和权限信息。
- 单点登录(SSO):JWT 能够用于实现单点登录,用户只需登录一次,就能够拜访多个关联的利用。
- 明码重置:JWT 能够用于生成蕴含明码重置信息的令牌,用户能够应用该令牌来重置其明码。
- 信息替换:JWT 能够用于不同利用之间平安地替换信息,例如在微服务架构中。
平安思考
尽管 JWT 在许多场景下十分有用,但也须要审慎应用以确保安全性:
- 密钥治理:密钥的平安治理是要害。透露密钥会导致令牌被伪造,因而须要采纳适当的密钥治理措施,如定期轮换密钥。
- 过期工夫:JWT 通常蕴含了过期工夫(exp)申明,利用须要定期检查令牌的有效性,并确保不应用已过期的令牌。
- 非对称加密:对于高度敏感的信息,能够思考应用非对称加密算法,以进步安全性。在这种状况下,验证者应用颁发者的公钥来验证签名。
- 防止在令牌中存储敏感信息:尽量避免在 JWT 的 Payload 中存储敏感信息,因为 Payload 局部是 Base64 编码的,可能会被解码。
- 应用 HTTPS:JWT 在传输过程中可能会被截获,因而倡议在应用 JWT 时始终应用 HTTPS 来确保通信的安全性。
示例利用:应用 Node.js 和 Express 验证 JWT
上面是一个应用 Node.js 和 Express 验证 JWT 的简略示例:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const secretKey = 'your-secret-key';
// 中间件:验证 JWT
const verifyToken = (req, res, next) => {
const token = req.headers.authorization;
if (!token) {return res.status(401).json({message: '无奈验证身份'});
}
jwt.verify(token, secretKey, (err, decoded) => {if (err) {return res.status(401).json({message: '身份验证失败'});
}
req.user = decoded;
next();});
};
// 路由:受爱护的资源
app.get('/protected', verifyToken, (req, res) => {res.json({ message: '欢送拜访受爱护的资源', user: req.user});
});
// 路由:生成 JWT
app.post('/login', (req, res) => {const user = { id: 1, username: 'user123'};
const token = jwt.sign(user, secretKey, { expiresIn: '1h'});
res.json({token});
});
app.listen(3000, () => {console.log('服务器运行在端口 3000');
});
在上述示例中,服务器应用 Express 框架创立,蕴含了两个路由。/login
路由用于生成 JWT,/protected
路由受爱护,只有携带无效 JWT 的申请能力拜访。
论断
JSON Web Token(JWT)是一种宽泛用于身份验证和受权的规范,它具备轻量级、自蕴含、分布式、无状态、可扩大等长处,实用于多种利用场景。然而,应用 JWT 时须要留神密钥治理、安全性和适合的过期工夫等方面,以确保利用的安全性。
JWT 在古代应用程序中扮演着重要的角色,为开发人员提供了一种灵便且平安的形式来传输信息和验证用户身份。它已成为许多 Web 利用、挪动利用和 API 的规范身份验证办法之一,能够帮忙开发人员构建更平安、更灵便的应用程序。