Jwt

本文深入解析JWT(JSON Web Token)的概念,探讨其工作原理与组成结构,包括头部、载荷和签名。阐述JWT在身份验证中的优势,如去中心化特性,以及在实际应用中的验证流程和令牌刷新策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.JWT是什么

JSON Web Token (JWT),它是目前最流行的跨域身份验证解决方案

2. 为什么使用JWT

JWT的精髓在于:“去中心化”,数据是保存在客户端的。

3.JWT组成

 一个JWT实际上就是一个字符串,它由三部分组成:头部(Header)、载荷(Payload)与签名(signature)
   JWT结构原理图:见“JWT的数据结构.jpg”
   
它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。
   写成一行,就是下面的样子:Header.Payload.Signature

在这里插入图片描述

  4.2 Payload(负荷)
      {"sub":"123","name":"Tom","admin":true}
      payload用来承载要传递的数据,它的json结构实际上是对JWT要传递的数据的一组声明,这些声明被JWT标准称为claims,
      它的一个“属性值对”其实就是一个claim(要求),
      每一个claim的都代表特定的含义和作用。
注:
    iss(Issuser):代表这个JWT的签发主体;
              sub(Subject):代表这个JWT的主体,即它的所有人;
              aud(Audience):代表这个JWT的接收对象;
              exp(Expiration time):是一个时间戳,代表这个JWT的过期时间;
              nbf(Not Before):是一个时间戳,代表这个JWT生效的开始时间,意味着在这个时间之前验证JWT是会失败的;
              iat(Issued at):是一个时间戳,代表这个JWT的签发时间;
              jti(JWT ID):是JWT的唯一标识。

4.JWT的工作原理

  1. 是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户,示例如下:
      {"UserName": "Chongchong","Role": "Admin","Expire": "2018-08-08 20:15:56"}

   2. 之后,当用户与服务器通信时,客户在请求中发回JSON对象
    
   3. 为了防止用户篡改数据,服务器将在生成对象时添加签名,并对发回的数据进行验证

5.Jwt图解

在这里插入图片描述
1、传统开发对资源的访问限制利用session完成图解

在这里插入图片描述
2、jwt所解决的问题及机制

6.JWT的验证过程

 它验证的方法其实很简单,只要把header做base64url解码,就能知道JWT用的什么算法做的签名,然后用这个算法,再次用同样的逻辑对header和payload做一次签名,
   并比较这个签名是否与JWT本身包含的第三个部分的串是否完全相同,只要不同,就可以认为这个JWT是一个被篡改过的串,自然就属于验证失败了。
   接收方生成签名的时候必须使用跟JWT发送方相同的密钥
在验证一个JWT的时候,签名认证是每个实现库都会自动做的,但是payload的认证是由使用者来决定的。因为JWT里面可能会包含一个自定义claim,
        所以它不会自动去验证这些claim,以jjwt-0.7.0.jar为例:
        A 如果签名认证失败会抛出如下的异常:
          io.jsonwebtoken.SignatureException: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.
 	  即签名错误,JWT的签名与本地计算机的签名不匹配 
        B JWT过期异常
          io.jsonwebtoken.ExpiredJwtException: JWT expired at 2017-06-13T11:55:56Z. Current time: 2017-06-13T11:55:57Z, a difference of 1608 milliseconds.  Allowed

   注2:认证失败,返回401 Unauthorized响应

   注3:认证服务作为一个Middlewar

生成令牌
在这里插入图片描述
过期令牌
在这里插入图片描述
延时
在这里插入图片描述

7.JWT令牌刷新思路

7.1 登陆成功后,将生成的JWT令牌通过响应头返回给客户端

7.2 WEB APP项目每次请求后台数据时(将JWT令牌从请求头中带过来),
      验证通过,刷新JWT,并保存在响应头返回给客户端,有效时间30分钟
      JwtFilter

http.js

// 请求拦截器
//将jwt令牌赛道request Headers里面
axios.interceptors.request.use(function(config) {
	var jwt = window.vm.$store.getters.getJwt;
	config.headers['jwt'] = jwt;
	return config;
}, function(error) {
	return Promise.reject(error);
});

// 响应拦截器
//将jwt令牌赛道response Headers里面
axios.interceptors.response.use(function(response) {
	//debugger;
	var jwt = response.headers['jwt'];
	if(jwt){
		window.vm.$store.commit('setJwt',{jwt:jwt});
	}
	return response;
}, function(error) {
	return Promise.reject(error);
});

mutations.js

export default {
  setResturantName: (state, payload) => {
    state.resturantName = payload.resturantName;
  },
  {
    setJwt: (state, payload) => {
      state.jwt = payload.jwt;
    },
  }

8.总结:

1、服务端如何利用jwt生成token令牌
2、客户端如何接收jwt生成的令牌
3、与传统的session机制差异在哪

本次的分享就到此结束,感谢您的观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值