什么是JWT
---JSON Web Token(JSON Web 令牌)是一种跨域验证身份的方案。JWT 不加密传输的数据,但能够通过数字签名来验证数据未被篡改(但是做完下面的 WebGoat 练习后我对这一点表示怀疑)。
---JWT 分为三部分,头部(Header),声明(Claims),签名(Signature),三个部分以英文句号.隔开。
---JWT 的内容以 Base64URL 进行了编码。
头部(Header):
{
"alg":"HS256",
"typ":"JWT"
}
---alg是说明这个JWT 的签名使用的算法的参数,常见值用HS256(默认),HS512 等,也可以为None。HS256表示 HMAC SHA256。
---typ说明这个 token 的类型为 JWT
声明(Claims):
{
"exp": 1416471934,//到期时间
"user_name": "user",
"scope": ["read","write"],
"authorities": ["ROLE_ADMIN","ROLE_USER"],
"jti": "9bc92a44-0b1a-4c5e-be70-da52075b9a84",//JWT标识
"client_id": "my-client-with-secret"
}
JWT 固定参数有:
---iss:发行人
---exp:到期时间
---sub:主题
---aud:用户
---nbf:在此之前不可用
---iat:发布时间
---jti:JWT ID 用于标识该 JWT
签名(Signature)
---服务器有一个不会发送给客户端的密码(secret),用头部(header)中指定的算法对头部和声明的内容用此密码进行加密,生成的字符串就是 JWT 的签名。
下面是一个用 HS256 生成 JWT 的代码例子
https://i0.hdslb.com/bfs/article/8037fa42ec60484fab7fbcceb9d3e14b09bb4289.png@!web-article-pic.avif
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)