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';// 中间件:验证JWTconst 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 });});// 路由:生成JWTapp.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的规范身份验证办法之一,能够帮忙开发人员构建更平安、更灵便的应用程序。