1. 什么是JWT
JWT全称为JSON Web Token,是一种用于在网络上传递声明的基于JSON格式的开放标准(RFC 7519)。JWT提供了一种简单的方法,用于在不同的系统之间安全地传递信息,其主要优点包括:
跨语言、跨平台
不需要在服务端存储会话信息
自包含(Payload包含所有必要的用户信息)
JWT由三个部分组成:Header、Payload以及Signature。其中,Header用于存储关于生成的Token的元数据信息,如算法类型;Payload用于存储需要传递的信息,以及相关约束条件,如过期时间等;Signature则是通过Header、Payload以及密钥计算出来的一串Hash值,主要用于验证Token是否在传输过程中被篡改。
2. JWT的认证流程
JWT的认证流程一般分为两个过程:用户登录以及后续的请求认证。
2.1 用户登录
用户登录成功之后,需要将JWT返回给客户端,在客户端进行存储,在每次向服务端发送请求时,将JWT放入请求头中,以供服务端进行认证。
# JWT生成函数实现代码
import jwt
import datetime
secret_key = 'mysecret' # 用于生成Signature的密钥
def create_jwt(user_id):
# 构造Header
headers = {
'alg': 'HS256'
}
# 构造Payload
payload = {
'user_id': user_id,
'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1) # 设置Token过期时间
}
# 生成JWT
token = jwt.encode(payload=payload, key=secret_key, algorithm='HS256', headers=headers)
return token
2.2 请求认证
服务端在接受到请求后,需要对请求中的JWT进行验证。验证流程如下:
解码JWT获取Header和Payload
验证Signature是否正确
验证Payload是否过期、Token是否被篡改
根据Payload中的信息,进行后续验证或授权操作
# JWT验证函数实现代码
import jwt
def verify_jwt(token):
try:
payload = jwt.decode(token, key=secret_key, algorithms=['HS256'])
# 检验Token是否过期、是否被篡改等
# ...
return True, payload
except jwt.exceptions.InvalidSignatureError:
return False, None
3. JWT的优缺点
JWT作为一种轻量级的身份验证和授权方案,具有以下一些显著的优点:
跨语言、跨平台,方便传递用户身份
自包含,避免了服务端存储Session信息的繁琐操作
具有较好的扩展性,可以通过Header和Payload传递自定义数据
当然,JWT也存在一些需要注意的缺点:
由于信息是通过Base64编码进行传递的,如果使用HTTP协议传递信息,则通信过程中信息相对不太安全
由于将用户信息编码在Token中,当用户信息发生变化(如修改密码)时,服务端需要重新生成Token,以避免旧Token被盗用
由于信息全部存在于Token中,当Payload过大时,会导致网络传输变得较慢。因此在使用JWT时需要注意Payload的大小。
4. 总结
JWT是一种轻量级的身份验证和授权方案,具有跨语言、跨平台等特点,并且在实现过程中不需要服务端存储会话信息。同时,由于其具有较好的扩展性,可以通过Header和Payload传递自定义数据,在实际应用中具有广泛的适用性。