一文了解什么是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

相关文章

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

一文带你迅速搞懂路由器/交换机/光猫三者概念区别

《一文带你迅速搞懂路由器/交换机/光猫三者概念区别》讨论网络设备时,常提及路由器、交换机及光猫等词汇,日常生活、工作中,这些设备至关重要,居家上网、企业内部沟通乃至互联网冲浪皆无法脱离其影响力,本文将... 当谈论网络设备时,我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

SpringBoot集成Shiro+JWT(Hutool)完整代码示例

《SpringBoot集成Shiro+JWT(Hutool)完整代码示例》ApacheShiro是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,在现代应用开发中,Shiro因... 目录一、背景介绍1.1 为什么使用Shiro?1.2 为什么需要双Token?二、技术栈组成三、环境

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam