JWT技术文档
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzQ2MTkzNjcsInVzZXJJbmZvIjoie1wiYWRkclwiOlwiaHR0cDovL3d3dy5iYWlk dS5jb21cIixcImlkXCI6XCIxMjNcIixcIm5hbWVcIjpcImppbnJcIn0ifQ.YpHrMjeqQvt0D4Azq55TjkX34zfN9bEtcfRKOPV97c0
一、JWT简介
JWT是json web token的缩写,它将用户信息加密到token里,服务器不保存任务用户信息,服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
优点是在分布式系统中,很好的解决了单点登录问题,以及session共享的问题,
缺点是无法作废已颁布的里令牌/不易应对数据过期。
单体:cookie+session
集群:JWT或令牌
二、JWT的结构
1、JWT长什么样?
JWT是由三段信息构成的,将这三段信息文本用"."链接一起就构成了JWT字符串,就像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzQ2MTkzNjcsInVzZXJJbmZvIjoie1wiYWRkclwiOlwiaHR0cDovL3d3dy5iYWlk
dS5jb21cIixcImlkXCI6XCIxMjNcIixcIm5hbWVcIjpcImppbnJcIn0ifQ.YpHrMjeqQvt0D4Azq55TjkX34zfN9bEtcfRKOPV97c0
2、JWT的构成
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload,类似于飞机上承载的物品),第三部分是签证(signature)。
header
JWT的头部承载两部分信息:
声明类型,这里是jwt。
声明加密的算法,通常直接使用HMACSHA256。
完整的头部就像下面的JSON:
{
'typ':'JWT',
'alg':'HS26'
}
然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload
载荷就是存放有效信息的地方。这个名字像是指飞机上承载的货品,这些有效信息包含3个部分。
- 标准中注册的声明
- 公共的声明
- 私有的声明
标准中注册的声明(建议但不强制使用);
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间.
nbff: 定义在什么时间之前,该jwt都是不可用的。
iat:jwt的签发时间
jtl: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
公共声明:
公共声明可以添加任何的信息,一般天价用户的相关西悉尼或其他业务需要的必要信息,但不建议添加敏感信息,因为该部分在客户端可解密。
私有的声明:
私有声明是提供者和消费者共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
定义一个payload:
{
"sub":"123467890",
"name":"John Doe",
"admin":true
}
然后将其进行base64加密,得到jwt的第二部分。
eyJleHAiOjE2NzQ2MTkzNjcsInVzZXJJbmZvIjoie1wiYWRkclwiOlwiaHR0cDovL3d3dy5iYWlk
dS5jb21cIixcImlkXCI6XCIxMjNcIixcIm5hbWVcIjpcImppbnJcIn0ifQ
signature
jwt的第三部分是一个签证信息,这个签证信息由3部分组成:
- header(base64后的)
- payload(base64后的)
- secret
这个部分需要base64加密后的header和base64加密后的payload使用,连接组成的字符串,然后通过header中声明的加密方式和进行加盐secret组成加密,
然后就构成了jwt的第三部分。
var encodedstring = base64UrlEncode(header) + '.' + base64UrlEncode(payload); var signatrue = HMACSHA256(encodedString,'secret'); //YpHrMjeqQvt0D4Azq55TjkX34zfN9bEtcfRKOPV97c0
将这三部分用“.”连接程一个完整的字符串,构成了最终的jwt:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzQ2MTkzNjcsInVzZXJJbmZvIjoie1wiYWRkclwiOlwiaHR0cDovL3d3dy5iYWlk dS5jb21cIixcImlkXCI6XCIxMjNcIixcIm5hbWVcIjpcImppbnJcIn0ifQ.YpHrMjeqQvt0D4Azq55TjkX34zfN9bEtcfRKOPV97c0
三、JWT的应用
一般是在请求头里加入Authorization或xx_token,并加上xx标注;
//使用请求参数传递
var param = {
'token':localStorage.getItem("token")
}
$.ajax({
url:'http://localhost:8080/Servlet3_1/MainServlet?type=list',
type:'post',
header:{
//Accept:"application/json,charset=utf-8",
token:localStorage.getItem("token") //1、这里获取的token
},
data:param, //2、使用请求参数传递
//3、使用请求头传递
beforeSend:function(xhr){
xhr.setRequestHeader("Authorization",localStorage.getItem("token"));
},
success:function(result){
console.log(result);
}
})
服务端会验证token,如果验证通过就会返回相应的资源,整个流程就是这样的:

开发依赖包:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.5</version>
</dependency>
<!– https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api –>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.5</version>
</dependency>
<!– https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api –>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.5</version>
</dependency>
坑1
https://www.likecs.com/show-203588045.html#sc=300


浙公网安备 33010602011771号