白话JWT原理,JSON Web Token
有啥用?
- 客户端的请求都是带身份证的,JWT验证不通过的服务器拒绝处理
- 发送服务器的数据进行加密,你拦截了也看不到里面是啥。
比以前存Cookie好的地方
- 防CSRF (主要是伪造请求,带上Cookie )
- 适合移动应用,不用将Cookie存在浏览器上造成兼容问题
- 服务器端无状态,不需要存储Session在服务器端
- 跨域资源共享(CORS)不会成为问题,因为它不使用cookie
组成部分
JSON Web Token三部分组成,这些部分由点(.)分隔,分别是:
- 标头
- 有效载荷
- 签名
你加密完的数据长下面这个样子。
xxxxx.yyyyy.zzzzz
标头(header)
标头通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA。
{
"alg": "HS256",
"typ": "JWT"
}
然后,此JSON被Base64Url编码以形成JWT的第一部分。
参数
一般是用户ID、Token过期的时间等等,自己定义。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
然后,对有参数进行Base64Url编码,以形成JSON Web Token的第二部分。
签名
最后签名部分,通过前面两部分内容及标头中指定的算法,并对其进行签名。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
完成后会看到下面的样子
eyJhbGci0iJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIi0iIxMjMONTY30DkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaXNTb2NpYWwi0nRydWV9.4pcPyMD09o1PSyXnrXCjTwXyr4BsezdI1AVTmud2fU4