1.JWT(JSON Web Token)是什么?
经过加密的用户信息,请求中作为授权头携带,用于用户身份的校验。jwt是token生成的一种方式。
2.JWT(JSON Web Token)由三部分组成:
- Header(头部)
- Payload(负载)
- Signature(签名)
可以使用window.btoa进行编码成base64,并使用window.atob进行解码成json对象。这两个函数也是浏览器提供的全局函数。
3.JWT的签名和验证过程:
签名过程:
- 创建JWT的Header和Payload:Header部分通常包含类型(例如JWT)和签名算法(如HS256)的信息。Payload部分则包含需要传递的数据,如用户ID、角色、过期时间等。
- 拼接Header和Payload:将Header和Payload使用点号(.)进行拼接。
- 签名:使用服务器端的私钥(或称为签名密钥)对拼接后的字符串进行签名。签名的算法在Header中指定,可以是HS256、RSA等。签名的目的是为了验证数据的完整性和发送者的身份。
- 组成完整的JWT:将签名附加到拼接后的字符串末尾,再次使用点号(.)分隔,形成完整的JWT。
验证过程:
- 接收JWT:客户端在请求时携带JWT,服务器接收并解析JWT。
- 分离Header、Payload和Signature:服务器根据点号(.)将JWT拆分为Header、Payload和Signature三部分。
- 验证签名:服务器使用自己的私钥(与签名时使用的私钥相对应)对Header和Payload拼接后的字符串进行签名,并将结果与JWT中的Signature进行对比。如果两者一致,则说明JWT是有效的,数据未被篡改。
- 检查Payload中的数据:服务器可以进一步验证Payload中的数据,如检查用户ID、角色等是否与预期一致,以及检查JWT是否过期。
需要注意的是,JWT的验证过程依赖于私钥的安全性。如果私钥泄露,攻击者可能会伪造有效的JWT。因此,保护私钥的安全至关重要。此外,JWT的Payload部分通常不存储敏感信息,因为这部分信息是base64编码,可以被解码和查看。如果Payload报错了敏感信息,应该对base64进行加密处理。对于敏感信息,应使用其他加密方式进行保护。
代码示例:
python
import jwt
from datetime import datetime, timedelta
//定义密钥
SECRET_KEY = 'your-secret-key'
//定义JWT的有效期(例如:1小时)
EXPIRATION_DELTA = timedelta(hours=1)
//生成JWT
def create_token(user_id):
payload = {
'user_id': user_id,
'exp': datetime.utcnow() + EXPIRATION_DELTA
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
return token
//验证JWT
def verify_token(token):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
user_id = payload['user_id']
return user_id
except jwt.ExpiredSignatureError:
return None # Token已过期
except jwt.InvalidTokenError:
return None # Token无效或已篡改
//使用示例
token = create_token(123)
print("Generated Token:", token)
user_id = verify_token(token)
if user_id:
print("Verified User ID:", user_id)
else:
print("Token is invalid or expired.")
4.JWT的使用场景有哪些:
- 用户身份验证与授权:JWT最常见的使用场景是用户身份验证。一旦用户登录成功,服务器会生成一个包含用户信息的JWT,并将其返回给客户端。在后续的请求中,客户端只需携带这个JWT,服务器就可以通过验证JWT的有效性来确认用户的身份,并授权其访问相应的资源。这种方式避免了频繁查询数据库,提高了应用的性能。
- 单点登录(SSO) :JWT在单点登录场景中也非常有用。单点登录允许用户在一个应用系统中登录后,无需再次登录即可访问其他相关应用。通过使用JWT,可以将用户的登录状态信息编码在token中,并在多个应用之间共享。这样,用户只需在一次登录后,就可以无缝地切换到其他应用,提高了用户体验。
- 信息交换:由于JWT中包含签名,因此它可以在传输信息中进行安全控制。JWT可以在不同服务之间安全地传递信息,确保信息的完整性和真实性。这在进行敏感数据交换或API通信时特别有用。
- 无状态认证:对于RESTful API来说,JWT是实现无状态认证的一种理想方式。无状态认证意味着服务器不保存任何会话信息,每次请求都需要携带足够的认证信息。通过使用JWT,客户端可以在每个请求中附带token,服务器通过验证token的有效性来确认客户端的身份,从而实现了无状态认证。
此外,JWT还可以用于一次性验证场景,如用户注册后的账户激活链接。JWT的payload中包含的固定参数(如签发者和过期时间)使得这种场景得以实现。
总之,JWT的应用场景非常丰富,涵盖了用户身份验证、授权、信息交换、无状态认证等多个方面。通过使用JWT,可以简化身份验证流程,提高应用的安全性和性能。