一文了解什么是JWT 与sessions

​session 和 JSON Web 令牌 (JWT) 是在调用之间维护此身份验证状态的两种最流行的方法。两者各有利弊,在它们之间进行选择需要了解这些权衡以及它们与应用程序的特定需求之间的关系。

一、基于session的身份验证

在基于session的身份验证(也称为基于 cookie 的身份验证)中,服务器负责创建和维护用户身份验证的记录,并为客户端提供一种在每个后续请求中引用该记录的方法。

此流程首先由用户进行身份验证并向服务器提供一些凭据以进行验证。如果凭据被接受,服务器将创建表示此经过身份验证的浏览session的持久记录。除了用户标识符、session开始时间、session到期时间以及可能还有 IP 等上下文信息之外,该记录还将具有某种主要标识符(通常是至少 128 位长的随机字符串)地址和用户代理。该信息将存储在数据库中,session标识符将发送回客户端,以 cookie 的形式存储在用户的 Web 浏览器中。

来自浏览器的每个后续请求都将在 HTTP 标头中包含session cookie,然后服务器可以使用该session来查找session记录,确认其有效,然后根据确认的身份对返回哪些信息做出授权决策。

二、session 的优缺点

优点:

这种方法的吸引力在于其简单性和可靠性。

session的数据库记录充当session状态的清晰、集中的事实来源,这使得人们高度确信session信息是最新的并且可用于做出授权决策。使用session撤销用户对系统的访问权限既快速又可靠,因为您可以简单地从数据库中删除session记录或将其标记为无效。对于撤销后的任何后续请求,服务器将无法找到与标头中的标识符匹配的有效session,并将返回 401 未经身份验证的错误以提示用户重新进行身份验证。

通过将状态管理卸载到服务器,我们能够将数据传输开销减少到单个不透明字符串,该字符串是轻量级的,并且不会泄漏有关关联用户或session上下文的任何信息。

缺点:

虽然基于session的身份验证非常可靠,但大规模时它可能会开始引入延迟和性能问题。

由于您需要高度可靠且可从任何主机访问的session记录,这意味着每次身份验证都会向数据库插入写入请求,更重要的是,对于包含session标头的每个后续请求,都会向数据库插入读取请求。由于session过期时间通常会随着持续使用而延长,因此这也可能意味着每个请求都会进行额外更新。随着时间的推移,所有这些数据库交互都会累积起来,并在您的应用程序中引入显着的延迟。

对于具有高度动态客户端的应用程序,这种延迟开销可能抵不上基于session的身份验证所提供的好处。

三、JWT认证

JSON Web 令牌 (JWT)实现了在后续请求期间识别和授权登录用户的类似目标,但解决了如何以非常不同的方式管理该信息的问题。

此流程还从用户提供某种形式的凭据开始,服务器使用该凭据来验证该特定请求。然而,虽然基于session的流程依赖于将所有必要的状态存储在数据库中并在每个请求时查找它,但在 JSON Web 令牌流程中,所有上下文都独立包含在发送回客户端的字符串中。

从较高层面来看,JWT 是 JSON 对象,遵循特定协议来通信“声明”或授权上下文,然后由发布服务器进行签名或加密,以确保这些声明是可信的。

四、JWT 用于身份验证的优缺点

优点:

JWT 包含验证声明真实性所需的所有信息,以及做出授权决策所需的用户信息。JWT 的这种独立质量意味着不再依赖服务器和数据库来验证令牌并自信地为已识别的用户做出授权决策。

这样做有几个优点,最明显的是,可以减少应用程序的延迟,因为可以进行客户端授权,并且服务器端授权可以更快地进行,而无需调用数据库。

另一个优点是它开辟了更广泛的可能应用程序,这些应用程序可以签名、验证和利用通过 JWT 授予的身份信息和授权。签名和独立数据使开发服务器到服务器应用程序成为可能,这些应用程序以编程方式对令牌进行自签名并刷新它们,而无需手动输入凭据。此外,声明的灵活性允许您在令牌本身内向这些外部应用程序传达其他重要信息。当向外部应用程序公开 API 时,这非常有用。

缺点:

然而,JWT 的独立、无状态特性有一个显着的缺点——一旦 JWT 被签名,就无法使 JWT 失效或更新其中包含的信息。如果签名有效并且过期时间戳尚未过去,则任何利用 JWT 进行授权决策的流程都将认为 JWT 有效。

如果用户请求注销所有设备,则在所有当前颁发的 JWT 自然到期之前,没有实际的方法可以通过本地验证来满足此请求。理论上,JWT 也可以通过撤销用于签署 JWT 的密钥来使 JWT 失效,但这将使所有使用该密钥的 JWT 失效,并且需要进行处理以逐出任何缓存的验证密钥,从而使得密钥撤销对于简单的事情来说是不可持续的选择作为用户注销。

同样,在 JWT 包含基于角色的授权信息(例如“admin”与“member”)的情况下,如果用户降级到较低的角色,从而减少了允许访问的范围,则此更改在现有 JWT 过期之前,授权权限不会得到反映。

五、JWT 与session

正如我们所看到的,JWT 和session cookie 都是解决无状态 HTTP 世界中持久身份验证和授权上下文问题的可行方法,但它们采用的方法截然不同,各有优缺点。

JWT 可实现更快的授权和与外部应用程序的更多互操作性,但它们需要更多的开发人员投资来解决其安全复杂性,并且可能不是最适合能够访问敏感数据或操作的应用程序。

另一方面,虽然session提供了更强有力的保证,即每个单独的请求都得到授权并且更容易安全地实现,但它们在服务器端数据库验证上的瓶颈带来了延迟开销,这可能会破坏高响应应用程序的用户体验。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DbVisualizer和DBeaver启动不来,启动报错

启动报错 大多数启动报错都是因为你没有用管理员身份运行程序,提示的错误都是八竿子打不着的什么jdk、jvm问题。 比如DbVisualizer提示什么jvm配置参数,实际dbvis.exe 用管理员身份打开即可(右键 dbvis.exe->属性->兼容性->勾上 “…

vue2+antd——实现动态菜单路由功能——基础积累

vue2antd——实现动态菜单路由功能——基础积累 实现的需求:效果图:登录接口处添加以下代码loadRoutes方法内容如下: 最近在写后台管理系统,遇到一个需求就是要将之前的静态路由改为动态路由,使用的后台框架是&#xf…

QMI8658A_QMC5883L(9轴)-EVB 评估板

1. 描述 QMI8658A_QMC5883L(9轴)-EVB 评估板是一款功能强大的9轴IMU传感器,它利用了QMA8658A 内置的3轴加速度计和3轴陀螺仪,同时结合QMC5883L的3轴地磁数据,来测量物体在三维空间中的角速度和加速度(严格意义上的IMU只为用户提供…

linux驱动开发-点亮第一个led灯

linux驱动开发-点亮第一个led灯 一.背景知识二.如何写驱动程序三.实战演练3.1 查询原理图3.2 配置引脚为gpio模式3.3 配置引脚为输出模式3.4 DR寄存器 四.代码实例4.1 驱动层4.2 应用层 一.背景知识 我们这里使用的是百问网的imx_6ullpro的开发板。这里和裸机不同的是&#xf…

【Java】电子病历编辑器源码(云端SaaS服务)

电子病历编辑器极具灵活性,它既可嵌入到医院HIS系统中,作为内置编辑工具供多个模块使用,也可以独立拿出来,与第三方业务厂商展开合作,为他们提供病历书写功能,充分发挥编辑器的功能。 电子病历基于云端SaaS…

1300*C. Social Distance(贪心构造)

Problem - 1367C - Codeforces 解析&#xff1a; 统计出所有连续0序列&#xff0c;并且记录其左右两侧有没有1&#xff0c;然后对于四种情况分别判断即可。 #include<bits/stdc.h> using namespace std; int t,n,k; signed main(){scanf("%d",&t);while(…

论坛搭建.

目录 一.配置软件仓库 二.安装http php miriadb 三.配置数据库 四.源码拖拽并解压 五.防火墙通过 六.浏览器安装测试 七.界面参数设置 一.配置软件仓库 1.进入仓库目录 cd /etc/yum.repos.d 2.创建仓库文件 vim local.repo 3.在 local.repo中写入:(粘贴的时候注意位…

栈队列OJ练习题(C语言版)

目录 一、括号匹配问题 思路&#xff1a; 完整版C语言代码&#xff1a; 讲解&#xff1a; 二、用队列实现栈 思路&#xff1a; 完整版C语言代码&#xff1a; 讲解&#xff1a; 三、用栈实现队列 思路&#xff1a; 完整版C语言代码&#xff1a; 讲解&#xff1a…

任正非说:扩张必须踩在坚实的基础上,擅自扩张只能是自杀。

嗨&#xff0c;你好&#xff01;这是华研荟【任正非说】系列的第23篇文章&#xff0c;让我们继续聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 一、要想赢&#xff0c;要么在剑法上高于人&#xff0c;要么在盾牌上坚于人。若果剑不如人&#xff0c;就要…

虚拟机上的linux centos7无法连接ssh

1、排查有没有安装 openssh-server&#xff0c;在终端中输入 yum list installed | grep openssh-server此处显示已经安装了 openssh-server&#xff0c;如果又没任何输出显示表示没有安装 openssh-server&#xff0c;通过输入 yum install openssh-server进行安装 2、找到了…

Selenium3-当元素通过@FindBy获取时,返回元素为null

报错: 在获取元素的js属性时一直获取不到&#xff0c;报空指针&#xff0c;定位到元素时&#xff0c;发现是FindBy的元素没有找到 解决方法: 在page类的构造函数中加上了 界面初始化&#xff0c;让元素先隐式加载&#xff0c;这样就不会出现返回元素为空的情况辣 PageFactory…

15. 机器学习 - 支持向量机

Hi, 你好。我是茶桁。 逻辑回归预测心脏病 在本节课开始呢&#xff0c;我给大家一份逻辑回归的练习&#xff0c;利用下面这个数据集做了一次逻辑回归预测心脏病的练习。 本次练习的代码在「茶桁的AI秘籍」在Github上的代码库内&#xff0c;数据集的获取在文末。这样做是因为我…

pytorch深度学习实践(一):线性模型y=w*x和y=w*x+b的代码和绘图实现

目录 题目描述1. yw*x2. yw*xb 代码第一题: y w*x第二题:y wxb 绘图工具 学习视频&#xff1a; 刘二大人pytorch1-线性模型 题目描述 1. yw*x 使用线性模型y w*x计算模型的损失值并且使用matplotlib给出cost function图像。 2. yw*xb 使用线性模型y w*xb给出cost funct…

计算机网络基础三

课程目标 理解路由表的作用 能够读懂路由表信息 能够使用图形抓包工具 wireshark 进行数据包的抓取 &#xff0c;如&#xff08; TCP/IP 的三次握手四次断开&#xff09; 一、路由表 思考&#xff1a; 什么是交换,什么是路由,什么是路由表&#xff1f;1. 交换是指同网络访…

外卖跑腿小程序开发如何满足不断变化的用户需求?

外卖跑腿小程序市场竞争激烈&#xff0c;用户需求不断演变。为了保持竞争力&#xff0c;开发团队需要不断适应变化&#xff0c;提供新功能和改进用户体验。本文将讨论如何通过技术手段来满足不断变化的用户需求。 1. 灵活的后端服务 后端服务是外卖跑腿小程序的核心&#xf…

如何优雅地单元测试 Kotlin/Java 中的 private 方法?

翻译自 https://medium.com/mindorks/how-to-unit-test-private-methods-in-java-and-kotlin-d3cae49dccd ❓如何单元测试 Kotlin/Java 中的 private 方法❓ 首先&#xff0c;开发者应该测试代码里的 private 私有方法吗&#xff1f; 直接信任这些私有方法&#xff0c;测试到…

css画一条虚线,用到background-image:linear-gradient线性渐变的属性

CSS实现虚线的方法_css 虚线_saltlike的博客-CSDN博客 渐变属性(background-image)全解析_background-image linear_大聪明码农徐的博客-CSDN博客 Background:linear-gradient()详解_background: linear-gradient_小白白中之白的博客-CSDN博客 注意&#xff1a; 必须要写高…

最短路径:迪杰斯特拉算法

简介 英文名Dijkstra 作用&#xff1a;找到路中指定起点到指定终点的带权最短路径 核心步骤 1&#xff09;确定起点&#xff0c;终点 2&#xff09;从未走过的点中选取从起点到权值最小点作为中心点 3&#xff09;如果满足 起点到中心点权值 中心点到指定其他点的权值 < 起…

C++进阶语法——智能指针【学习笔记(五)】

文章目录 1、智能指针简介1.1 原始指针&#xff08;raw pointer&#xff09;的⼀些问题1.2 智能指针&#xff08;smart pointers&#xff09; 2、智能指针&#xff08;smart pointers&#xff09;——unique_ptr2.1 unique_ptr 的声明2.2 unique_ptr 的函数2.3 ⾃定义类型使⽤ …

基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类 计算机竞赛

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层&#xff1a;2.4 池化层&#xff1a;2.5 全连接softmax层&#xff1a;2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…
最新文章