概述
JWT是一种开放标准RFC7519, 用于双方之间传递安全信息的表述性声明规范。
特点
-
简洁: 通过URL,POST参数或者HTTP的header发送
-
自包含: 负载中包含了所有用户所需要的信息,避免多次查询数据库。
应用场景
-
身份认证 用户一旦完成了登录,在接下来的每个请求中包含JWT,用来验证用户身份和资源访问权限。在sso中比较广泛的使用。
-
信息交换 在通信的双方之间使用JWT对数据进行编码,签名。可以确保信息没有伪造。
JWT的结构
包含三个部分
-
Header头部
-
Payload负载
-
Signature签名
格式输出是一个以.
分隔的三段BASE64编码,如同:
xxxx.yyyyy.zzz
Header
通常包含两个部分: token的类型,和采用的加密算法 如:
{
"alg": "HS256",
"typ": "JWT"
}
接着使用Base64URL编码组成JWT结构的第一部分
Payload
包含了claim。 Claim是一些实体的状态和额外的元数据,有三种类型的claim: resserved, public, private.
-
Reserved: JWT预定义字段, 不强制使用,但是推荐使用,常用的有: iss(签发者) , exp(过期时间戳) , sub(面向的用户) , aud(接收方) , iat(签发时间)。
-
Public: 根据需要定义自己的字段 ,应该避免冲突。
-
Private: 自定义字段,用来在双方之间交换信息。
如:
{
"sub": "12312",
"name": "Peter",
"admin": true
}
经过 Base64Url 编码后作为JWT结构的第二部分。
Signature
创建签名使用编码后的header, payload以及一个密钥。使用header中指定的签名算法进行签名。 如果header中指定的算法为HMAC SHA256:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload) + "." +
secret
)