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

 

posted @ 2023-01-25 13:15  塞纳纽斯  阅读(375)  评论(0)    收藏  举报