一文了解什么是JWT 与sessions

2023-10-30 16:01
文章标签 了解 jwt 一文 sessions

本文主要是介绍一文了解什么是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提供了更强有力的保证,即每个单独的请求都得到授权并且更容易安全地实现,但它们在服务器端数据库验证上的瓶颈带来了延迟开销,这可能会破坏高响应应用程序的用户体验。

这篇关于一文了解什么是JWT 与sessions的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/309043

相关文章

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运

Weex入门教程之1,了解Weex

【资料合集】Weex Conf回顾集锦:讲义PDF+活动视频! PDF分享:链接:http://pan.baidu.com/s/1hr8RniG 密码:fa3j 官方教程:https://weex-project.io/cn/v-0.10/guide/index.html 用意 主要是介绍Weex,并未涉及开发方面,好让我们开始开发之前充分地了解Weex到底是个什么。 以下描述主要摘取于

Java了解相对较多!

我是对Java了解相对较多,而对C#则是因工作需要才去看了一下,C#跟Java在语法上非常相似,而最初让我比较困惑的就是委托、事件部分,相信大多数初学者也有类似的困惑。经过跟Java的对比学习,发现这其实跟Java的监听、事件是等同的,只是表述上不同罢了。   委托+事件是观察者模式的一个典型例子,所谓的委托其实就是观察者,它会关心某种事件,一旦这种事件被触发,这个观察者就会行动。   下

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那

初步了解VTK装配体

VTK还不太了解,根据资料, vtk.vtkAssembly 是 VTK库中的一个重要类,允许通过将多个vtkActor对象组合在一起来创建复杂的3D模型。 import vtkimport mathfrom vtk.util.colors import *filenames = ["cylinder.stl","sphere.stl","torus.stl"]dt = 1.0renW

Post-Training有多重要?一文带你了解全部细节

1. 简介 随着LLM学界和工业界日新月异的发展,不仅预训练所用的算力和数据正在疯狂内卷,后训练(post-training)的对齐和微调方法也在不断更新。InstructGPT、WebGPT等较早发布的模型使用标准RLHF方法,其中的数据管理风格和规模似乎已经过时。近来,Meta、谷歌和英伟达等AI巨头纷纷发布开源模型,附带发布详尽的论文或报告,包括Llama 3.1、Nemotron 340

了解elementUI的底层源码, 进行二次开发

Element UI 是一个基于 Vue.js 的桌面端组件库,广泛用于构建美观、交互友好的用户界面。要深入理解 Element UI 的底层源码并进行二次开发,你需要掌握以下几个关键点: Vue.js 原理 Element UI 是基于 Vue.js 构建的,因此首先需要熟悉 Vue.js 的核心概念和机制,包括: ● 组件系统:Vue.js 的组件化思想,如何定义组件、使用组件、传递属性和事

【JavaScript】在循环体中了解定时器工作机制

for (var i = 0; i < 5; i++) {setTimeout(function() {console.log(i);}, 1000);}console.log(i);   如果我们约定,用箭头表示其前后的两次输出之间有 1 秒的时间间隔,而逗号表示其前后的两次输出之间的时间间隔可以忽略,代码实际运行的结果该如何描述?会有下面两种答案: A. :5 -> 5 -> 5 ->