
jwt学习笔记
发布日期:2021-05-07 07:36:07
浏览次数:29
分类:精选文章
本文共 3093 字,大约阅读时间需要 10 分钟。
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第一步的导入这个Jar io.jsonwebtoken jjwt 0.9.1
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非对称加密 rsajwt此时也会有这个加密算法 的选型,比方说你此时选择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
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年03月23日 14时56分30秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
根据轨迹分析出用户家在哪
2019-03-06
PostgreSQL查询表名称及表结构
2019-03-06
是什么?评估分类器的常用概念----准确率,精确率,召回率
2019-03-06
linux中使用awk命令
2019-03-06
LAB2 内核的内存管理
2019-03-06
如何使用google搜索?
2019-03-06
Redis分布式锁的正确实现方式
2019-03-06
设计模式-抽象工厂模式
2019-03-06
MySQL Explain查看执行计划详解
2019-03-06
IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
2019-03-06
Spring 动态绑定多实现类实例综述
2019-03-06
IDEA 调试Java代码的两个技巧
2019-03-06
MyBatis常见面试题:#{}和${}的区别是什么?
2019-03-06
Vue 数组和对象更新,但视图未更新,背后的故事
2019-03-06
剑指Offer面试题:9.二进制中1的个数
2019-03-06
《你是在做牛做马还是在做主管》- 读书笔记
2019-03-06
ASP.NET Core on K8S学习之旅(12)Ingress
2019-03-06
重新温习软件设计之路(4)
2019-03-06