JWT身份验证

在实际项目中一般会使用jwt鉴权方式。

JWT知识点

jwt,全称json web token ,JSON Web令牌是一种开放的行业标准RFC 7519方法,用于·在两方安全地表示声明。具体网上有许多文章介绍,这里做简单的使用。

1.数据结构

JSON Web Token 由三部曲组成,他们之间用圆点  .进行分割,一个标准的JWT形如xxx.yyy.zzz

  • Header
  • Payload
  • Signature
1.1 header

头部,由两部分组成;token的类型( JWT)和算法名称(HMAC 、SHA256、RSA......)。

实例:

{
"alg": "HS256"
"typ": "JWT"
}

然后通过Base64对这个JSON编码就得到JWT得第一部分

1.2Payload

第二部分具体得实体,可以写入自定义的数据信息,有三种类型

  • Registered claims :这里有一组预定义的声明,他们不是强制的,但是推荐。如;iss(issuer签发者)exp(expiration time 有效期),sub(subject),aud(audience)等。
  • public claims:可以随意定义。
  • private claims :用于在同意使用它们的各方之间共享信息,并且不是注册的或者公开的声明

实例:

{
"iss": "加油",
"exp": 182309645,
"uname": "妮甲"
}

对payload进行Base64编码就得到JWT的第二部分

1.3 Signature

为了得到签名部分,你必须有编过码的header、编过码的payload、一个密钥,签名算法是header中指定的那个,然后对他们签名即可

签名是用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方式是否为它所称的发送方式。

1.4具体实例

下面给出一个基于java-jwt生成的具体实例

public static void main(String[] args){String token = JWT.create().withIssuer("加油").withExpiresAt(new Date(System.currentTimeMillis() + 86400_000)).withPayload(MapUtils.create("uname" , "妮甲" ))  .sign(Alogorithm.HMAC256("helloWorld"));System.out.println(token);  }

技术派的应用

1.通过jwt鉴权方案

JWT鉴权流程

一个简单的基于jwt的身份验证方案如下图

基本流程分三步:

  • 1. 用户登录成功后,后端将生成的jwt返回给前端,然后前端将其保存在本地缓存;
  • 2. 之后前端与后端的交互时,都将jwt放在请求头中,比如可以将其放在Http的身份认证的请求头AUthorization ,也可以通过自定义的请求头来传递
  • 3. 后端接收到用户的请求,从请求头中获取jwt,然后进行校验,通过后,才相应相关的接口;否则表示未登录。

说明:项目采用session的方案,将jwt写入到coolik中

2. jwt的使用

接下来看在技术派中的实际使用场景,核心逻辑在

我们直接在之前session的基础上进行优化,这里主要借助开源项目java-jwt来实现JWT的生成管理

生成JWT的实现

我们定义了签发者、有效期,指定了签名算法,然后实体类中,携带两个信息

  • s:即之前生成的sesionId ,我们借助自定义的traceId生成工具来生成唯一的会话id
  • u:用户userId

上面的实现中,有几个通用的成员属性,我们通过自定义的配置,再启动项目时进行初始化,避免后续的重复创建

自定义的jwt三个配置属性

paicoding:jwt:issuer: pai_coding #签发者secret:hello_world #签名密钥expire: 2592000000 #jwt有效期 ,默认30天
jwt校验

用户每次请求时,依然是沿用之前的session方式的校验逻辑,在Filter层,从请求头中,获取Cookie,找到对应的jwt,然后尝试根据jwt获取对应的用户信息。

注意上面的实现,即便是jwt校验通过了,我们也依然从redis中查了一下,判断是否有效

为啥这样设计?

因为jwt本身无状态,后端完全可以将redis这一层的存储都直接干掉,纯依赖jwt的特性来完成身份鉴权,但由于它的无状态,后端减少存储压力是一个好处,同样也是一个弊端,后端失去了token的管控权,如果我们希望提前失效某些用户身份,则无法持续,鉴于此,这里依然保留了redis中存储jwt的方案。

3.实例体验

接下来我们实际体验一下,线上运行技术派的jwt,登录之后,找到一个请求,找到cookie中的f-session

我们解析一下这个是啥?

站在用户的角度,说实话你用session还是jwt,没啥实质的感受差异,那为啥还有两种不同的技术方案?

session与jwt的对比
jwtsession
前端存储,通用的校验规则,后端再获取jwt时校验是否有效前端存索引,后端判断session是否有效
验签,不可篡改无签保障,安全性有后端保障
可存储非敏感信息,如头像,用户名

一般不存储业务信息

jwt生成时,指定了有效期,本身不支持续期以及提前失效后端控制有效期,可提前失效或者自动续期
通常以请求头方式传递通常以cookie方式传递
可预防csrf攻击session-cookie方式存在csrf风险

注:csrf攻击

如在网站页面上,添加如下内容

然后当你访问此网站时,结果发现你在技术派上登录的用户被注销啦

使用jwt预防csrf攻击的主要原理就是jwt通过请求头,由js主动塞进去传递给后端,而非cookie的方式,从而避免csrf漏洞攻击,技术派的jwt也是采用cookie进行携带jwt,并不能解决上面这个个问题;同样,session方案,也可以将sessionId通过请求头的方式传递,按照这个说法也能避免csrf。

通常的方案由;

session-cookie方案

jwt-requestHeader方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/721376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 动态加载音频和音效

想要加载音效和音频需要两个组件: 听: 播: 一收一发 在层级中,右键创建 音频源 ,放入物体的子物体中。 播放 方式一 拖动需要播放的音频文件到,音频源组件中。 using System.Collections; using Syst…

Guitar Pro 8.1中文版永久许可证激活2024最新24位注册激活码生成器

Guitar Pro是一款非常受欢迎的音乐制作软件,它可以帮助用户创建和编辑各种音乐曲谱。从其诞生以来就送专门为了编写吉他谱而研发迭代的。 尽管这款产品可能已经成为全球最受欢迎的吉他打谱软件,在编写吉他六线谱和乐队总谱中始终处于行业领先地位&#…

Java求职技能清单(2024版)

一、Java基础扎实(反射、集合、IO、NIO、多线程、设计模式、通信协议等基础技术) (一)Java (二)网络IO (三)NIO模型 (…

释放数据湖潜力:小红书如何实现数仓效率与成本的双重优化

在当今以数据为核心的商业环境中,企业正面临着海量数据的处理和分析挑战。为克服传统数据仓库在处理速度、灵活性和成本效率方面的局限,小红书数据仓库团队引入如 Apache Iceberg 等数据湖技术,将其与数仓架构相结合,以释放数据湖…

2024全网最全Excel函数与公式应用

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 引言 Excel是一款广泛应用于商业、教育和个人…

VUE3项目学习系列--项目配置(二)

在项目团队开发过程中,多人协同开发为保证项目格式书写格式统一标准化,因此需要进行代码格式化校验,包括在代码编写过程中以及代码提交前进行自动格式化,因此需要进行在项目中进行相关的配置使之代码格式一致。 一、eslint配置 …

【世界首富宝座易主】贝佐斯超越马斯克,再登世界首富宝座

贝佐斯超越马斯克,再登世界首富宝座 杰佛瑞普雷斯顿「杰夫」贝佐斯(英语:Jeffrey Preston1964年1月12日),生于美国新墨西哥州,美国网际网路巨头亚马逊公司创始人及现任董事长,《华盛顿邮报》大股…

哈希的简单介绍

unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 l o g 2 N log_2 N log2​N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的…

一本书讲透ChatGPT——理论与实践的完美结合,大模型技术工程师的必备指南

写在前面 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景,在多项专业和学术基准测试中表现出的智力水平,不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎,被科技界誉…

Vue3学习记录(三)--- 组合式API之生命周期和模板引用

一、生命周期 1、简介 ​ 生命周期,指的是一个 Vue 实例从创建到销毁的完整阶段,强调的是一个时间段。 ​ 生命周期钩子函数,指的是 Vue 实例提供的内置函数,函数的参数为一个回调函数。这些钩子函数会在实例生命周期的某些固定…

win系统如何同时安装MySQL5和MySQL8

win系统如何同时安装MySQL5和MySQL8 文章目录 win系统如何同时安装MySQL5和MySQL81、准备好两种版本的数据库2、下载后解压到你指定的目录3、手动配置安装MySQL5和8安装MySQL53.1创建my.ini文件3.2生成data文件夹 安装MySQL83.1创建my.ini文件3.2生成data文件夹 4、配置环境变量…

汽车车灯照明灯具维修的常见误区有哪些呢?

汽车车灯照明灯具维修的常见误区有哪些呢? 汽车灯具维修的常见误区包括以下几个方面: 忽视车灯的日常保养:许多车主在日常使用中忽视了车灯的保养,只有当车灯出现故障时才进行维修。然而,定期检查和保养车灯是预防故障发生的重要…

蓝牙耳机什么牌子好?五款优质蓝牙耳机无广推荐!

​许多人向我询问关于蓝牙耳机的推荐,以及如何选购蓝牙耳机,有哪些性价比高的蓝牙耳机等问题。我已经从网络上搜集并比较了几十款耳机,现在我将分享一些我认为不错的蓝牙耳机。无论是在音质还是配置方面,这些耳机都是非常不错的。…

关于vue创建项目以及关于eslint报错的问题

vue创建完项目以后如果报parsing error no babel config file。。。这样的错误的话,关闭项目,用vscode进入项目中打开项目就可以解决了。 1 代码保存的时候会自动将单引号报错为双引号 导致eslint报错的问题, 解决思路: 在项目根…

启英泰伦「离线自然说」:让照明语音交互更自然、更便捷

随着科技的不断发展,智能家居已经成为现代生活的一部分。其中,智能照明作为智能家居的重要组成部分,为人们带来了更加便捷、舒适的照明体验。然而,传统的离线语音交互技术在智能照明领域的应用一直受到词条存储量的限制&#xff0…

有个朋友被骗了,大家要擦亮眼睛

1.引言 大家好,我是Leo哥🫣🫣🫣,昨天凌晨有个粉丝朋友找到Leo哥,咨询一些问题,现在的朋友们真卷呐,大半夜还在挑灯夜战。可无奈Leo哥12点之前已经睡了,身体为重&#xf…

智慧公厕:改变城市公共卫生管理的未来

现代城市发展快速,人口不断增加,公共卫生管理面临着严峻的挑战。传统公厕的建设、管理和使用模式已经无法满足日益提高的卫生与环保需求。然而,随着科技的进步与智能化的发展,智慧公厕正成为一种全新的解决方案,为城市…

数据库设计革命:逻辑模型的演变与面向对象的突破

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua,在这里我会分享我的知识和经验。&#x…

demo破坏升级

如果我们刚才所解释的dom破坏形式不再是单纯的x一层结构,而是x,y这种形式,两层结构,我们该怎么办 举个例子吧 我们的想法是先取x再取y,想法很简单,现实很苦感,看看结果吧 取出来的是undefined…

怎么采集GBK或GB2312等特殊字符编码的网站数据

如果要采集的网站是GBK或GB2312等特殊字符编码,采集结果可能是一堆看不懂的文字或乱码,无法使用。 通常网页文章采集工具有字符编码选项,默认是UTF-8(现在大部分网站都是),改选为GBK或GB2312字符编码即可&…