jwt学习笔记

1.什么是token 
先抛个场景 比访问现在在外地,我朋友想要进我家 给我要我家的密码, 我用手机生成一个2小时的密码给他,也就是说此时他用这个密码就可以进入我家 并且只是在2个小时有效
token就相当于这个密码,临时且具有唯一性,具有有效期,保证不重复
2.后台java代码怎么生成token,并且具备这些条件
可以采用uuid 生成token 通过redis实现
比如如说现在生成这个token
[uuid生成]作为RedisKey 放入redis中  redis为key作为有效期
只要redis查不到 说明过期了
3.token 和session 有什么区别
 传统项目中使用的是session,session要放在服务器的
session就类似于redis是一个缓存 
session中的sessionid就类似于token
现在的项目基本上都是token替代大致是这么做的
  用户登录  前后端分离项目 登录如何去做
  1.验证账号密码 ,验证成功情况下
  2,生成对应的token [采用uuid]
  3.将该token缓存redis  token ==key  value ==userId
  4.最后返回token 给客户端 ,客户端将token 保存
  这样的话客户端在每次请求的时候,在请求头中传递该token,服务器接受到token,在redis中找到对应该token所对应的userId,再根据userId查询到对应的用户信息返回给客户端
  =============================>
4.token 有什么优缺点
使用token的情况必须依赖于redis。
token 的优点 1.保证安全性。前后端分离项目每次传userID或者说用户的信息是不好的,一般用token代替userId,也就是说,用户一旦登录成功,我后台服务器生成一个token ,然后我吧token放到redis中将token 返给前端,此时token 作为key ,userId作为value  然后再设置个过期时间
  客户端每次调用接口的时候传token,我服务器通过token从redis中查询到用户UserId。再通过userId查询到用户饿其他信息,这样做可以隐藏参数的真实性,
 5.token 的缺点就是每次请求都会依赖于redis,在高并发情况下频发查我redis 对redis的压力很大
 所以才有Jwt这么一说,jwt实际上是和token基本设置思想是一致的,jwt json web token 
 json数据交互格式 轻量级语言 不管是c语言,python 格式都是通用的
使用jwt第一步的导入
    <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
这个Jar
  private static String sign_key="myitsignkey";

    public static void main(String[] args) {
    
    
        JwtBuilder phone = Jwts.builder().
                // key  value  json数据
                claim("phone", "11")
                // 设置签名值
                .signWith(SignatureAlgorithm.HS256, sign_key);

        System.out.println(phone.compact());
代码也很简单  这个sign_key签名key 看你用什么算法,首先这个jwt也分很多加密算法	
单项加密 md5
双向(对称加密) aes,des
非对称加密 rsa
jwt此时也会有这个加密算法 的选型,比方说你此时选择md5加密,此时智能暴力破解,但是 此时不能解密,为了防止暴力破解,一般会加大密码的复杂度 加个盐值
   claim("phone", "11") 表示存放的数据
    sigwith 表示jwt得加密算法HS246 表示md5单项加密 也就是说此时选择hs256  就表示这个数据我用的md5加密
	    所以此时 防止暴力破解 我就需要传个盐SIGN_KEY 表示是个盐值
	    此时这个sign_key 不是密匙 [密钥表示我可以加密 解密]

Hs256此时表示对我的数据进单项加密  所以此时就表示盐值来加大密码的复杂度

在这里插入图片描述

	这个字符串就是此时的jwt,说下Jwt的原理
	jwt主要分成3部分 
			header头部 标记采用什么算法 比方说hs256,rsa246
			第二部分 payload // 表示jwt存放的数据,也就是我们的数据此时都是放在这里满的 并且使json 格式存储的
			第三部分payload采用Md5加密之后的签名值
	jwt是怎么生成的呢 其实是base64.encode(header).base.encode(payload).md5签名值
	也就是说此时jwt通过base64帮我们做了一个加密,但是base64不属于加密算法,他是一种编码方式,我们可以百度找一个base64解密工具

在这里插入图片描述
在这里插入图片描述

第三部分是payload采用md5加密之后的签名值,不能解密
所以说第一部分是header
	第二部分装载我们的jwt数据
	第三部分是我们加密之后的签名值[相当于把我的payload数据做了一个md5加密]
jwt的三部分 第一部分 是header 
第二部分是存在我们的Payload数据
第三部分是我们的payload通过MD5加密之后的数据
 Payload应该存哪些数据,不能存放敏感数据 可以存手机号脱敏 userId

抛个问题 如何纯手写jwt 因为都是json数据 header是json,payload是json

在这里插入图片描述

这样就可以纯手写jwt了
呢么jwt如何解密  切割字符串拿到头 看是什么加密算法,如果是md5加密
再拿到payload数据,看此时的payload+盐 进行md5加密 能否和第三部分匹配
如果为true 代表此时的jwt是有效的,我可以使用你这个payload数据
如果为false 代表此时的jwt 是无效的, 我就不可以使用你这个payload数据
 

在这里插入图片描述

jwt和token有什么区别
1。jwt对应的数据存放在客户端,吧jwt返回给前端
 token 数据存在redis中
 使用Jwt的时候此时我服务器只是做一个验证,此时的jwt是否有效,如果有效,我就会用到你Payload的数据,如果无效 我就不会用你payload的数据
呢么jwt很明显啊
1.减少了服务器的压力,因为此时我不用从redis服务器中查数据了
2,查询效率高,因为此时不用查redis,服务器判断有效无效[时间]
3.不容易被客户端篡改数据 因为盐在后台
---------------------------------------》
缺点 如果一旦生成好一个jwt,后期是不可以手动销毁的
jwt装载payload数据过多的话,会占用服务器宽带资源
3.在参数中设置有效期,在jwt的payload数据中添加时间戳,也就是说此时jwt一定要设置有效期比如说有效期60分钟
登录生成jwt  在有效时间范围内可以使用
我再次调用接口的时候我就会传jwt


猜你喜欢

转载自blog.csdn.net/weixin_43689953/article/details/111401954