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

相关文章

一文详解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

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

一文彻底搞懂Java 中的 SPI 是什么

《一文彻底搞懂Java中的SPI是什么》:本文主要介绍Java中的SPI是什么,本篇文章将通过经典题目、实战解析和面试官视角,帮助你从容应对“SPI”相关问题,赢得技术面试的加分项,需要的朋... 目录一、面试主题概述二、高频面试题汇总三、重点题目详解✅ 面试题1:Java 的 SPI 是什么?如何实现一个

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

Python FastAPI实现JWT校验的完整指南

《PythonFastAPI实现JWT校验的完整指南》在现代Web开发中,构建安全的API接口是开发者必须面对的核心挑战之一,本文将深入探讨如何基于FastAPI实现JWT(JSONWebToken... 目录一、JWT认证的核心原理二、项目初始化与环境配置三、安全密码处理机制四、JWT令牌的生成与验证五、