JWT(JSON Web Token)
2022-02-14 22:42:54 20 举报
AI智能生成
JWT的一些基础知识
作者其他创作
大纲/内容
是什么
是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。
该信息可以被验证和信任,因为它是数字签名的。
其本质上就是由服务器生成的用于鉴权的字符串。
该信息可以被验证和信任,因为它是数字签名的。
其本质上就是由服务器生成的用于鉴权的字符串。
目的
替代Cookie与Session
前后端分离后的鉴权
分布式服务中的鉴权
前后端分离后的鉴权
分布式服务中的鉴权
优点
简洁:其数据量小,传输速度也很快
跨语言:因为JWT Token是以JSON加密形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持
不依赖于cookie和session
适合移动端应用
单点登录友好
缺点
JWT最大的问题就是Token的撤销问题。从创建Token到Token过期,服务器都没有简单的方法可以失效它。
构成
JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。
在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串
在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串
标头(Header)
JWT头是一个描述JWT元数据的JSON对象。
alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);
typ属性表示令牌的类型,JWT令牌统一写为JWT。
alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);
typ属性表示令牌的类型,JWT令牌统一写为JWT。
{
"alg": "HS256",
"typ": "JWT"
}
"alg": "HS256",
"typ": "JWT"
}
有效载荷(Payload)
JWT的主体内容部分,存放有效信息的地方,包含三个部分
Registered claims 注册的声明
一组官方预定义的声明,建议但是非强制
iss(issuer): 签发者
sub(subject): 主题
aud(audience): 接收jwt的一方
exp(expiration time): 过期时间
nbf(Not Before): 生效时间
iat(Issued At): 签发时间
jti(JWT ID): jwt的唯一身份标识,主要用来作为一次性token
sub(subject): 主题
aud(audience): 接收jwt的一方
exp(expiration time): 过期时间
nbf(Not Before): 生效时间
iat(Issued At): 签发时间
jti(JWT ID): jwt的唯一身份标识,主要用来作为一次性token
Public claims 公共的声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息。
但不建议添加敏感信息,因为该部分在客户端可解密(base64算法)。
但不建议添加敏感信息,因为该部分在客户端可解密(base64算法)。
Private claims 私有的声明
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息
注意:都不建议添加敏感信息,因为信息只是使用base64算法进行转换,而base64算法是对称解密的,意味着该部分信息可以归类为明文信息。
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
签名(Signature)
是对上面两部分数据签名,由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改。
生成办法:
首先,使用base64编码后的header和payload数据。
然后,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。
最后,使用header中指定的签名算法(默认情况下为HMAC SHA256)根据公式生成签名。
签名公式:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
首先,使用base64编码后的header和payload数据。
然后,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。
最后,使用header中指定的签名算法(默认情况下为HMAC SHA256)根据公式生成签名。
签名公式:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
到目前为止,jwt的签名算法有三种:
HMAC【哈希消息验证码(对称)】:HS256/HS384/HS512
RSASSA【RSA签名算法(非对称)】:RS256/RS384/RS512
ECDSA【椭圆曲线数据签名算法(非对称)】:ES256/ES384/ES512
HMAC【哈希消息验证码(对称)】:HS256/HS384/HS512
RSASSA【RSA签名算法(非对称)】:RS256/RS384/RS512
ECDSA【椭圆曲线数据签名算法(非对称)】:ES256/ES384/ES512
流程图
0 条评论
下一页
为你推荐
查看更多