一文了解什么是JWT 与sessions

news/2025/2/13 6:04:35/

​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.ppmy.cn/news/1185994.html

相关文章

R语言在生态环境领域中的实践技术应用

R语言作为新兴的统计软件,以开源、自由、免费等特点风靡全球。生态环境领域研究内容广泛,数据常多样而复杂。利用R语言进行多元统计分析,从复杂的现象中发现规律、探索机制正是R的优势。为此,以鱼类、昆虫、水文、地形等多样化的生…

IPv6+ 3.0关键技术解析与应用实践探索

IPv6作为面向5G和云计算的智能IP技术,其核心是以IPv6技术架构为底座,并基于用户的新兴业务进行创新发展而来的。任何一项技术创新的背后都有一只看不见的推手-用户的需求,也就是用户的业务发展所需,进一步来说是用户的应用系统在驱…

数据分析在程序员职业中的重要性及实践应用

一、引言 在当今信息化社会的快速发展中,数据分析已经成为一项重要的职业技能。不论是从事哪个行业,都需要具备一定的数据分析能力。对于程序员而言,掌握数据分析技能不仅能够提升自身在职场中的竞争力,更能够在职业生涯中获得更…

windows dialogbox例子

引自: https://www.coder.work/article/2771502

ClickHouse Java多个参数的UDF编写

一、环境版本 环境版本docker clickhouse22.3.10.22 docker pull clickhouse/clickhouse-server:22.3.10.22二、XML配置 2.1 配置文件 # 创建udf配置文件 vim /etc/clickhouse-server/demo_function.xml<functions><function><type>executable</type&…

Maven第四章:配置文件详解

Maven第四章:配置文件详解 前言 本章重点知识:掌握setting.xml配置文件以及pom.xml配置文件 setting.xml配置文件 setting.xml文件用于配置Maven的运行环境,包括本地仓库的位置、镜像仓库的配置、认证信息等。以下是setting.xml文件的详细说明: 文件位置: 全局配置文件:…

yum安装node,npm

node官网 yum -y install nodejs npm 查看版本 npm -v node -v卸载 yum -y remove nodejs npm修改镜像源 4.1. 修改淘宝镜像源 set registry https://registry.npm.taobao.org npm config get registr4.2. 修改华为云镜像源 npm config set registry https://mirrors.huaweicl…

免费提取视频号视频工具有哪些,这个4种方法亲测可用!

很多朋友对视频号都是比较依赖的&#xff0c;另外关于视频号视频下载&#xff0c;一直想找一个关于免费提取视频的方法&#xff0c;今天我就来聊聊该如何使用。 方法一&#xff1a;录屏 在选择需要的设备&#xff0c;并在应用商店搜索录屏工具&#xff0c;或者直接采用手机自…