当前位置: 首页 > news >正文

Session 与 JWT 的对决:谁是身份验证的王者? (下)

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 四、Session 与 JWT 的比较
    • 对比 Session 与 JWT 在身份验证和授权方面的区别
    • 分析 Session 与 JWT 在性能、安全性和扩展性方面的差异
    • 讨论在不同场景下选择 Session 或 JWT 的考虑因素
  • 五、使用 Session 与 JWT 的实践
    • 提供使用 Session 与 JWT 的实际案例
  • 六、结论
    • 总结 Session 与 JWT 的特点和适用场景

四、Session 与 JWT 的比较

对比 Session 与 JWT 在身份验证和授权方面的区别

Session 和 JWT(JSON Web Token)是常用于身份验证和授权的两种不同的机制。

Session:

  • 在服务器端存储用户的会话信息,该会话信息由服务器生成一个唯一的会话标识符(Session ID)来标识。
  • 当用户登录后,服务器会创建一个会话对象,并将会话 ID 返回给客户端(通常存储在 Cookie 中)。
  • 客户端发送请求时,会将会话 ID 随请求一起发送到服务器。
  • 服务器根据接收到的会话 ID 从存储中找到对应的会话对象,并验证用户的身份。
  • 服务器可以在会话对象中存储用户的身份信息和其他相关数据。
  • 会话对象通常存储在服务器的内存中或持久化存储中(如数据库)。

在这里插入图片描述

JWT (JSON Web Token):

  • 在服务器端生成一个 JSON 格式的令牌以表示用户的身份和其他相关数据。
  • 令牌包含了用户的身份信息和其他声明(声明可以包含用户角色、权限等)。
  • 服务器将令牌签名后发送给客户端。
  • 客户端在后续请求中将令牌携带在请求头中或其他可靠的方式发送给服务器。
  • 服务器接收到令牌后,可以验证令牌的签名,并解析其中的数据以获取用户的身份信息。
  • 由于令牌包含了用户的身份信息和声明,服务器可以避免频繁访问存储(如数据库)来验证用户身份和权限。

在这里插入图片描述

区别:

  1. 存储状态:Session 会话信息存储在服务器端,JWT 令牌存储在客户端。
  2. 扩展性:Session 需要服务器在内存或数据库中保存会话信息,当用户数量增多时,需要更多的存储资源。JWT 令牌包含了用户信息和声明,服务器可以避免频繁访问存储,使得系统更容易扩展。
  3. 无状态性:Session 依赖服务器的状态来验证用户身份,需要在服务器端保存会话状态。而 JWT 是无状态的,服务器可以直接解密和验证令牌,无需保存任何状态信息。
  4. 跨域通信:由于 JWT 存储在客户端,可以轻松地在不同域名的服务器之间传递,而 Session 则需要处理跨域通信的问题。
  5. 时效性:Session 的有效期由服务器控制,可以设置较短的时间以提高安全性,但可能导致用户需要频繁重新登录。JWT 可以包含令牌的过期时间,客户端可据此判断是否需要刷新令牌。

选择哪种机制应根据具体的需求和安全性要求来决定。一般而言,JWT 更容易在分布式系统中实现和扩展,适合于无状态的、跨域的、具有较长有效期的身份验证和授权需求;而 Session 适用于相对简单的应用或需要较强的安全性控制的场景。

分析 Session 与 JWT 在性能、安全性和扩展性方面的差异

Session 和 JWT 在性能、安全性和扩展性方面存在一些差异。以下是它们之间的比较:

性能:

  • Session:由于 Session 信息存储在服务器端,每当客户端发送请求时,服务器都需要查找和读取相应的 Session 数据。这可能会对服务器的性能造成一定的影响,特别是在高并发的情况下。
  • JWT:由于 JWT 是无状态的,服务器不需要在存储中查找和读取用户的会话数据。服务器可以直接验证和解析 JWT,这有助于提高性能,尤其是在分布式系统中。

安全性:

  • Session:Sessions 机制可以提供相对较高的安全性。因为 Session 数据存储在服务器端,对客户端来说是不可见的,因此难以被篡改。同时,可以使用传输安全层协议(如 HTTPS)保护会话标识符的传输,防止劫持和窃听。
  • JWT:JWT 的安全性取决于密钥的保护和签名算法的强度。如果密钥泄露或算法被破解,攻击者可能能够伪造令牌获取访问权限。另外,由于 JWT 是存储在客户端的,如果在令牌中包含敏感信息(如密码),则可能会存在泄露风险。

扩展性:

  • Session:由于 Session 存储在服务器端,因此在处理大量并发请求时,需要管理和维护多个会话对象,这可能对服务器的可扩展性带来一些挑战。
  • JWT:由于 JWT 是无状态的,不需要在服务器端存储会话数据,这样可以更容易地在分布式系统中实现和扩展。JWT 适用于具有高度可扩展性需求的系统。

总体而言,JWT 在性能和扩展性方面具有优势,尤其适用于分布式系统。然而,安全性方面需要注意保护密钥的安全性,并避免在令牌中包含敏感信息。Session 在安全性方面相对更可靠,但对服务器性能和可扩展性具有一定的影响。因此,在选择使用 Session 还是 JWT 时,需要综合考虑具体的应用场景和安全需求。

讨论在不同场景下选择 Session 或 JWT 的考虑因素

在选择 Session 或 JWT 时,需要根据具体的应用场景和需求来综合考虑多个因素,以下是几个常见场景和对应的考虑因素:

  1. 单一服务器应用场景:

在单一服务器应用场景下,Session 是一个比较成熟、可靠和易于维护的方案因为在单一服务器下管理 Session 的性能不是问题,也能够通过存储 Session 数据来进行有效的身份验证和授权。在这种场景下,Session 可以提供更好的安全性保障,也能够更容易地控制会话的有效期。但是,这种方案有一个显著的局限性,那就是在使用不同的服务器节点时会失去 Session 的状态信息,需要采取特殊的机制来在多个服务器之间同步和共享 Session 数据。

  1. 分布式应用场景:

在分布式应用场景下,每个服务器都可以独立地验证和授权用户,因此 Session 的优点在这种情况下就不是很显著。相比之下,JWT 是一种更适合分布式架构的解决方案。由于 JWT 包含了用户信息和声明,它们可以在不同的服务器之间交换和传递,从而解决了 Session 在跨服务器交换数据时的局限性问题。另外,由于 JWT 是无状态的,服务器可以更容易地扩展,而无需担心会话数据的同步和共享问题。

  1. 跨平台的应用场景:

在跨平台的应用场景下,Session 可能会出现各种问题,比如搜索引擎爬取,浏览器升级缓存问题等。另外,对于使用移动应用程序或公共 API 的用户来说,将 Session 数据存储在客户端或浏览器中可能会有安全问题。相比之下,JWT 可以更方便地传递和使用,同时也没有跨平台问题。由于 JWT 以 JSON 格式表示,因此可以作为 API 的常规响应格式,能更容易地被跨平台响应,从而更容易地实现 API 调用和数据交换。

总之,在决定使用 Session 还是 JWT 时,我们需要考虑因素包括:性能、安全性和可扩展性等,同时也要根据具体的应用场景和需求来进行评估和选择。

五、使用 Session 与 JWT 的实践

提供使用 Session 与 JWT 的实际案例

以下是使用 Session 与 JWT 的实际案例:

一、使用 Session 的实际案例

  1. 传统的 Web 应用程序:许多传统的 Web 应用程序使用 Session 来管理用户会话。当用户登录时,服务器会创建一个 Session,并将一个唯一的 Session ID 发送给用户的浏览器。在后续的请求中,浏览器会将 Session ID 发送给服务器,服务器通过该 ID 来识别用户的会话。

  2. 购物车示例:在电子商务网站中,Session 可以用于存储用户的购物车信息。当用户添加商品到购物车时,服务器会将商品信息存储在 Session 中。在用户查看购物车或进行结账时,服务器可以从 Session 中获取购物车的内容。

二、使用 JWT 的实际案例

  1. API 访问控制:JWT 常用于 API 访问控制。客户端在进行 API 请求时发送 JWT,服务器通过验证 JWT 的签名和其中的声明来确定客户端是否有权访问该 API 资源。

  2. 单点登录(Single Sign-On,SSO)系统:JWT 可以用于实现单点登录。在 SSO 系统中,用户在一个身份提供者(Identity Provider,IDP)上进行身份验证,然后获取一个包含身份信息的 JWT。之后,用户可以将这个 JWT 发送给多个服务提供者(Service Provider,SP),而无需再次进行身份验证。SP 可以通过验证 JWT 的签名来确认用户的身份。

这些只是使用 Session 与 JWT 的一些实际案例,实际上,Session 和 JWT 在许多其他场景中也有广泛的应用。具体的使用取决于应用的需求和设计。

六、结论

总结 Session 与 JWT 的特点和适用场景

以下是 Session 与 JWT 的特点和适用场景的总结:

一、Session

特点:

  1. 存储在服务器端:Session 是在服务器端存储的,每个用户在服务器上有一个唯一的 Session 对象。
  2. 依赖于服务器状态:Session 的存在依赖于服务器的状态,服务器需要维护每个用户的 Session 信息。
  3. 可扩展性有限:随着用户数量的增加,服务器需要管理大量的 Session 信息,可能会对性能和扩展性造成一定的限制。

适用场景:

  1. 传统的 Web 应用程序:Session 适用于传统的 Web 应用程序,其中服务器负责管理用户的会话。
  2. 需要服务器端存储数据:如果应用程序需要在服务器端存储用户的相关数据(如购物车信息、用户偏好等),Session 是一个合适的选择。
  3. 对安全性要求不高:如果对数据的安全性要求不高,并且可以接受一定的安全风险,Session 可以满足需求。

在这里插入图片描述

二、JWT

特点:

  1. 自包含:JWT 是一个包含用户身份信息和权限信息的自包含字符串。
  2. 无状态:JWT 本身是无状态的,服务器不需要存储与用户会话相关的状态信息。
  3. 可扩展性好:JWT 可以在不同的系统和服务之间进行传递和验证,具有较好的可扩展性。

适用场景:

  1. API 访问控制:JWT 适用于 API 访问控制,客户端在进行 API 请求时发送 JWT,服务器通过验证 JWT 的签名和其中的声明来确定客户端是否有权访问该 API 资源。
  2. 单点登录(SSO)系统:JWT 可以用于实现单点登录,用户在一个身份提供者(Identity Provider,IDP)上进行身份验证,然后获取一个包含身份信息的 JWT。之后,用户可以将这个 JWT 发送给多个服务提供者(Service Provider,SP),而无需再次进行身份验证。
  3. 移动应用和跨平台应用:JWT 适用于移动应用和跨平台应用,因为它可以在客户端存储和传递,而不依赖于服务器端的状态。

在这里插入图片描述

总的来说,选择 Session 还是 JWT 取决于应用的需求和特点。如果需要服务器端存储数据并且对安全性要求不高,可以选择 Session。如果需要在不同系统之间传递身份和权限信息,或者对可扩展性和性能有更高的要求,可以选择 JWT。

相关文章:

Session 与 JWT 的对决:谁是身份验证的王者? (下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...

论文笔记:Confidential Assets

Confidential Assets 描述了一种称为“保密交易”的方案,该方案模糊了所有UTXO的金额,同时保持了不创建或销毁硬币的公共可验证性。进一步将此方案扩展到“保密资产”,一种单一的基于区块链的分类帐可以跟踪多种资产类型的方案。将保密交易扩…...

Docker下搭建MySQL主从复制

目录 主从复制简介 主从复制搭建 主从复制简介 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数 据库一般是准实时的业务数据库。 主从复制的作用 做数据的热备。作为后备数据库,主数据库服务器故…...

VBA数据库解决方案第七讲:如何利用Recordset对象打开数据库的数据记录集

《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...

内部培训平台的系统 PlayEdu搭建私有化内部培训平台

PlayEdu是由白书科技团队多年经营的线上教育系统,专为企业提供的全新企业培训方案 我们的目标是为更多的企业机构搭建私有化内部培训平台,以满足不断增长的培训需求 通过PlayEdu,企业可以有效地组织和管理培训资源,提供高质量的…...

Elasticsearch 相似度评分模型介绍

前言 Elasticsearch 是基于 Lucene 的世界范围内最流行的全文检索框架,其文档相似度算法包含 TF/IDF 和 BM25,从 ES 5.0开始 BM25 算法已经成为 ES 默认的相似度评分模块。 TF-IDF 与 BM25 的区别 TF-IDF 和 BM25 都是计算文本相似性的常用算法。TF-ID…...

视频生成的发展史及其原理解析:从Gen2、Emu Video到PixelDance、SVD、Pika 1.0

前言 考虑到文生视频开始爆发,比如11月份就是文生视频最火爆的一个月 11月3日,Runway的Gen-2发布里程碑式更新,支持4K超逼真的清晰度作品(runway是Stable Diffusion最早版本的开发商,Stability AI则开发的SD后续版本)11月16日&a…...

SQL Server 2016(基本概念和命令)

1、文件类型。 【1】主数据文件:数据库的启动信息。扩展名为".mdf"。 【2】次要(辅助)数据文件:主数据之外的数据都是次要数据文件。扩展名为".ndf"。 【3】事务日志文件:包含恢复数据库的所有事务…...

Linux C语言 30-套接字操作

Linux C语言 30-套接字操作 本节关键字:C语言 网络通信、套接字操作、TCP、UDP、服务端、客户端 相关C库函数:socket, bind, listen, accept, setsockopt, recv, send, recvfrom, sendto, close 什么是网络通信? 通信是人与人之间通过某种…...

RPC和REST对比

RPC和REST对比 参考学习 RPC 和 REST 之间有什么区别? 当我们对比RPC和REST时,其实是在对比RPC风格的API和REST风格的API,后者通常成为RESTful API。 远程过程调用(RPC)和 REST 是 API 设计中的两种架构风格。API …...

外包干了2年,技术退步明显。。。

前言 简单的说下,我大学的一个同学,毕业后我自己去了自研的公司,他去了外包,快两年了我薪资、技术各个方面都有了很大的提升,他在外包干的这两年人都要废了,技术没一点提升,学不到任何东西&…...

深度学习——第1章 深度学习的概念及神经网络的工作原理

1.1 序言——探索智能机器 千百年来,人类试图了解智能的机制,并将它复制到思维机器上。 人类从不满足于让机械或电子设备帮助做一些简单的任务,例如使用滑轮吊起沉重的岩石,使用计算器做算术。 人类希望计算机能够自动化执行更…...

爬虫爬取百度图片、搜狗图片

通过以下代码可以爬取两大图片网站(百度和搜狗)的图片,对于人工智能、深度学习中图片数据的搜集很有帮助! 一、爬取百度图片 该代码可以爬取任意百度图片中自定义的图片: import requests import re import time imp…...

Android Camera2使用

一 简介 1.1 Camera API: 这是旧版本的相机API,也称为Camera1 API。它提供了较简单的使用方式,适用于旧版Android设备。但它存在一些限制,如性能不佳、操作复杂等 1.2 Camera2 API: 这是新版本的相机API&#xff0…...

IOS/安卓+charles实现抓包(主要解决证书网站无法打开问题)

安装 官网下载 https://www.charlesproxy.com/latest-release/download.do 安装charles文档 流程 上述链接解决下图问题 使用介绍 Charles介绍 上述链接看一至三即可,了解首页各个按钮的作用 charles全面使用教程及常见功能详解(较详细&#xff09…...

七、Lua字符串

文章目录 一、字符串(一)单引号间的一串字符(二)local str "Hello, "(三)[[ 与 ]] 间的一串字符(四)例子 二、字符串长度计算(一)string.len&…...

0基础学java-day13

一、包装类 1. 包装类的分类 1) 针对八种基本数据类型相应的引用类型【对象】—包装类 2) 有了类的特点,就可以调用类中的方法。 3) 如图: 2 包装类和基本数据的转换 3 案例演示 Integer01.java package com.hspedu.wrapper;/*** author 林然* version 1.0*/ p…...

好题记录:

好题记录&#xff1a; 1:2:3&#xff1a;三级目录 1: 下面代码的结果是&#xff1a;&#xff08; &#xff09; 下面代码的结果是&#xff1a;&#xff08; &#xff09;#include <stdio.h> int main() {int arr[] {1,2,3,4,5};short *p (short*)arr;int i …...

web前端之JavaScrip中的闭包

MENU 闭包--笔试-11defineReactive函数&#xff0c;利用闭包封装Object.defineProperty()闭包--节流函数--笔试-10闭包的定义JavaScript闭包的9大经典使用场景 闭包–笔试-11 function fun() { var n 9; // js 中强行给一个未声明的变量赋值&#xff0c;// 程序不会报错// 并…...

Windows下命令行启动与关闭WebLogic的相关服务

WebLogic 的服务器类型 WebLogic提供了三种类型的服务器&#xff1a; 管理服务器节点服务器托管服务器 示例和关系如下图&#xff1a; 对应三类服务器&#xff0c; 就有三种启动和关闭的方式。本篇介绍使用命令行脚本的方式启动和关闭这三种类型的服务器。 关于WebLogic 的…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...