JWT令牌
一、JWT(Json Web Token)能干什么
1、安全认证(权限认证)
比如登录系统的时候,服务器会检查前端请求数据中携带的token信息,符合标准则允许访问,不符合则拒绝你的访问请求。
2、信息传递
比如两个系统之间传递信息,a服务器向B服务器发送token信息,b服务器对token进行解签名,发现签名对的上就接收数据,对不上就拒绝a服务器发来的数据(访问)。
二、JWT组成
头(header).负载(payload).签名(signature)
头、负载、签名三个部分组成,并用点符号衔接。
头:放签名用的加密算法
负载:一些不敏感的用户信息,通过base64编码放在负载中
签名:头+负载+加密后的签名(也称密钥)
三、为什么要用Session或JWT认证机制?
因为HTTP是无状态的网络协议,比如,一套系统势必会存在很多次请求,而你的每一次请求服务器都不知道一个个请求是你发送的还是别人发送的,就会造成你已经登录成功进入页面搜索某个东西点击确认发送了一个搜索数据的请求,然而服务器已经不记得你是谁、是否登录成功,然后听都不听你的请求就被服务器关在门外了,因此你的每一次亲求都要进行一次身份验证,但总不能每发送一次请求都要输入一遍账户密码来验证你是具备请求权限的吧?所以你再一次登录请求成功的时候就给你发一张“通行证”,后面同一个系统内部的请求都带上这张“通行证”表示你在这个系统中有相应的权限,人后尽管说出你的请求,服务器看到你的“通行证”“心领神会”“理所当然”接受你的请求,然后根据你的请求在“能力范围内”响应你的请求。
三、Session和JWT认证机制的区别、优缺点
1、Session流程
客户端第一次向服务器发送请求验证身份,身份验证通过,服务器生成JSESSIONID,放在cookie身上响应给客户端浏览器,浏览器吧cookie保存在浏览器中,下次请求时,找到对应的cookie,放在请求头一并发送到服务器,服务器根据cookie信息验证身份,验证成功查看你的请求作出响应。
2、Session缺点
[1]每当一个用户第一次发送请求生成sessionid,sessionid就会被存储在服务器内存中,当请求用户增多,服务器开销随之变大;
[2]某一用户第一次发送请求,生成的sessionid存储后,该用户以后发送的每一次请求都只能到特定服务器中申请访问资源,不利于分布式负载均衡
[3]sessionid是通过cookie传送哎浏览器和服务器之间来回传送的,容易被跨站请求伪造攻击
[4]前后端分离项目,不易部署;同一个系统需要发送很多个请求,而session、cookie认证技术并没有减少每次都要进行搜索用户信息进行身份认证的动作
3、JWT认证流程
浏览器第一次向服务器发送请求的时候,服务器生成一个令牌,之后这个令牌不再保存在服务器中,而是在保存在客户的浏览器中,释放服务器的内存。往后客户只需要携带令牌请求数据就可以了,而且服务器只用判断令牌是否有效就行了。也就是说JWT中有客户信息,解码后获取用户信息直接验证权限,不用额外再去数据库查用户信息、比对来验证用户权限。另外token会被存在浏览器的sessionStorage或者local Storage中,当系统退出登录的时候token就会被删除释放浏览器内存。
另一番理解:header
cookie:将用户信息(如账号、角色信息,不包括密码等敏感信息)以明文 方式存储在浏览器中,服务器直接根据header携带的信息验证用户身份。相对于session缺乏安全性。
session:给一个id给cookie,服务器根据这个id查询数据库验证用户身份。相对安全。
JWT:将用户信息以base64编码(字符串)给cookie存储在用户浏览器,服务器获取header中的Authorization或URL或cookie中携带的token中的解码+解签名之后的用户信息,进行用户验证。相对于session缺乏安全性。
4、JWT优势
[1]token本身就有用户信息。只需要解密就可以直接获得用户信息数据,而不用再取数据库查询数据了,简单的查询还好就怕复杂数据地查询。
[2]保存在用户浏览器中,释放服务器的部分内存压力
5、JWT缺点
[1]token在传输的过程中有被截获,被人拿去冒充用户请求内部数据的风险:
1、不安全的存储方式:一些开发人员可能会把token存储在local storage、cookie、URL参数等不安全的位置,容易被攻击者获取到。
2、使用http协议传输token:http协议是明文传输,攻击者可以通过中间人攻击截获token。
3、token窃取过程中的漏洞:部分应用程序没有对用户输入做充足的过滤和检查,攻击者可以通过在输入框中注入特定代码来盗取token
[2]一旦签发一个jwt,在到期之前就会始终有效,无法中途废弃。例如你在payload中存储了一些信息,当信息需要更新时,则重新签发一个jwt,但是由于旧的jwt还没过期,拿着这个旧的jwt依旧可以登录,那登录后服务端从jwt中拿到的信息就是过时的。为了解决这个问题,我们就需要在服务端部署额外的逻辑,例如设置一个黑名单,一旦签发了新的jwt,那么旧的就加入黑名单(比如存到redis里面),避免被再次使用。
相关文章:
JWT令牌
一、JWT(Json Web Token)能干什么 1、安全认证(权限认证) 比如登录系统的时候,服务器会检查前端请求数据中携带的token信息,符合标准则允许访问,不符合则拒绝你的访问请求。 2、信息传递 比…...
uni-app使用CSS实现无限旋转动画
本来想用uni.createAnimation创建一个旋转动画,发现转完一圈后就不动了,没法循环旋转, 后来又用setInterval每隔一个周期就把旋转角度加180度,发现运行一段时间后动画逐渐崩坏,应该是动画的周期和定时器的周期时间没有…...

java面向对象(八)
文章目录 一、abstract关键字的使用1.概念2. abstract修饰类:抽象类3.abstract修饰方法,抽象方法4.abstract使用上的注意点:5.抽象类的匿名子类 二、计算一段代码执行所花费的时间三、接口的使用1.接口的使用2.定义接口中的成员3.代码demo4.Java类可以实…...

【proverif】proverif的下载安装和初使用
文章目录 一、proverif下载1. 下载proverif安装包2. 解压proverif安装包3. 点开其中的README,安装graphciz和gtk4. 查看安装是否成功5. 测试 一、proverif下载 1. 下载proverif安装包 官网:proverif 首先下载全过程无需开外网,而且安装包下…...

浙江大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许
浙江大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许...

Centos7.9 一键脚本部署 LibreNMS 网络监控系统
前言: LibreNMS 是个以 PHP/MySQL 为基底的自动探索网络监控系统 LibreNMS 官网 版本23.8.2-52-g7bbe0a2 - Thu Sep 14 2023 22:33:23 GMT0700数据库纲要2023_09_01_084057_application_new_defaults (259)Web 服务器nginx/1.20.1PHP8.1.23Python3.6.8DatabaseMa…...

【大数据之Kafka】十六、Kafka集成外部系统之集成Flume
Flume 是一个在大数据开发中非常常用的组件。可以用于 Kafka 的生产者,也可以用于 Kafka 的消费者。 Flume安装和部署:https://blog.csdn.net/qq_18625571/article/details/131678589?spm1001.2014.3001.5501 1 Flume生产者 (1)…...
java学习--day3 (运算符、if循环、switch-case结构)
文章目录 今天的内容1.运算符1.1关系运算符1.2逻辑运算符1.3逻辑运算符的短路原则 2.分支结构【重点】2.1if分支2.2if-else分支2.3if-else的嵌套写法2.4if-else if 分支结构2.5swicth-case结构 扩展知识点 1.八大基本数据类型整型: byte short int long浮点: float double字…...

ActiveMQ、RabbitMQ、RocketMQ、Kafka区别
一、消息中间件的使用场景 消息中间件的使用场景总结就是六个字:解耦、异步、削峰 1.解耦 如果我方系统A要与三方B系统进行数据对接,推送系统人员信息,通常我们会使用接口开发来进行。但是如果运维期间B系统进行了调整,或者推送…...
csp初赛总结 那些年编程走过的坑 初高中信竞常考语法算法点
😘个人主页:曲终酣兴晚的小书屋💖 😕作者介绍:一个莽莽撞撞的🐻 💖专栏介绍:日常生活&往事回忆 😶🌫️每日金句:祝大家心有山水不造作&…...
DollarTree(美元树)验厂需要注意哪些方面?
【DollarTree(美元树)验厂需要注意哪些方面?】 美元树(Dollar tree),是美国的一元店。每件商品都只卖一美元,吃的、用的和玩的应有尽有。美元树在美国共拥有4900家门店,其中一半的连…...

vector使用和模拟实现
💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 C👀 刷题专栏👀 C语言👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是笨小孩👀 🌹欢迎大…...

token登录的实现
token登录的实现 我这种token只是简单的实现token,就是后端利用UUID 生成简单随机码,利用随机码作为在Redis中的键,然后存储的用户信息作为值,在每次合理请求的时候对token的有效时间进行刷新(利用拦截器)&…...
GO语言从入门到实战-Go语言课程介绍
为什么选择 Go 语言来完成这么大一个项目呢?我们不妨回到 Go 语言的源头看一看。 Go 语言的初步设想始于 2007 年,当时 Go 语言的三位创始人是想通过开发一种新型的语言来解决 Google 在软件开发中面临的问题: 多核硬件架构;超大…...

七天学会C语言-第六天(指针)
1.指针变量与普通变量 指针变量与普通变量是C语言中的两种不同类型的变量,它们有一些重要的区别和联系。 普通变量是一种存储数据的容器,可以直接存储和访问数据的值。: int num 10; // 定义一个整数型普通变量num,赋值为10在例…...

2023年腾讯云轻量服务器测评:16核 32G 28M 配置CPU测试
腾讯云轻量应用服务器16核32G28M配置优惠价3468元15个月(支持免费续3个月/送同配置3个月),轻量应用服务器具有100%CPU性能,系统盘为380GB SSD盘,28M带宽下载速度3584KB/秒,月流量6000GB,折合每天…...

macos (M2芯片)搭建flutter环境
安装的版本3.13.4、电脑上没有安装过android studio、安装过brew 1.在终端运行sudo softwareupdate --install-rosetta --agree-to-license,下图展示安装成功的效果 2.下载以下安装包来获取最新的 stable Flutter SDK 3.解压,⚠️注意下载安装sdk的包名…...

Xilinx FPGA未使用管脚上下拉状态配置(ISE和Vivado环境)
文章目录 ISE开发环境Vivado开发环境方式1:XDC文件约束方式2:生成选项配置 ISE开发环境 ISE开发环境,可在如下Bit流文件生成选项中配置。 右键点击Generate Programming File,选择Process Properties, 在弹出的窗口选…...

数据结构---链表(java)
目录 1. 链表 2. 创建Node 3. 增加 4. 获取元素 5. 删除 6. 遍历链表 7. 查找元素是否存在 8. 链栈的实现 9. 链队的实现 1. 链表 数据存放在"Node"结点中 优点:不用考虑扩容和缩容的问题,实现了动态存储数据 缺点:没有…...

Qt --- Day02
实现效果: 点击登录,检验用户密码是否正确,正确则弹出消息框,点击ok转到另一个页面 不正确跳出错误消息框,默认选线为Cancel,点击Yes继续登录 点击Cancel跳出问题消息框,默认选项No,…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
基于Uniapp的HarmonyOS 5.0体育应用开发攻略
一、技术架构设计 1.混合开发框架选型 (1)使用Uniapp 3.8版本支持ArkTS编译 (2)通过uni-harmony插件调用原生能力 (3)分层架构设计: graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...