身份验证:JWT 使用与会话

2024-01-27

在身份验证等情况下,使用 JWT 相对于会话有什么优势?

它是作为独立方法使用还是在会话中使用?


JWT 本身并没有使用“会话”的优势。 JWT 提供了一种在客户端维护会话状态的方法,而不是在服务器上进行维护。

人们在问这个问题时通常的意思是“使用 JWT 比使用 JWT 有什么好处?服务器端会话".

对于服务器端会话,您要么必须将会话标识符存储在数据库中,要么将其保留在内存中并确保客户端始终访问同一服务器。这两者都有缺点。对于数据库(或其他集中式存储)来说,这成为瓶颈并且需要维护——本质上是对每个请求执行额外的查询。

使用内存解决方案,您会限制水平扩展,并且会话将受到网络问题的影响(客户端在 Wifi 和移动数据之间漫游、服务器重新启动等)。

将会话移至客户端意味着您消除了对服务器端会话的依赖,但它也带来了一系列挑战。

  • 安全地存储令牌。
  • 安全运输。
  • JWT 会话有时很难失效。
  • 相信客户的说法。

JWT 和其他客户端会话机制都存在这些问题。

JWT 特别解决了最后一个问题。它可能有助于理解 JWT 是什么:

这是一点信息。对于用户会话,您可以包含用户名和令牌过期时间。但它可以是任何东西,甚至是会话 ID 或用户的整个配置文件(但请不要这样做)。 它具有安全签名,可以防止恶意方生成虚假令牌(您需要访问服务器的私钥来对它们进行签名,并且可以验证它们在签名后没有被修改)。 您可以通过每个请求发送它们,就像 cookie 或Authorization将发送标头。事实上,它们通常是在 HTTP 中发送的Authorizationheader 但使用 cookie 也可以。

该令牌已签名,因此服务器可以验证其来源。我们将假设服务器信任其自身的安全签名能力(您应该使用标准库:不要尝试自己执行此操作,并正确保护服务器)。

关于安全传输令牌的问题,答案通常是通过加密通道(通常是 httpS)发送。

关于将令牌安全地存储在客户端,您需要确保坏人无法获取它。这(主要)意味着阻止不良网站的 JS 读取令牌并将其发送回给他们。使用与缓解其他类型的 XSS 攻击相同的策略可以缓解这种情况。

如果您需要使 JWT 失效,肯定有多种方法可以实现。仅为请求“终止其他会话”的用户存储每个用户的纪元是一种非常有效的方法,可能已经足够好了。如果应用程序需要每个会话失效,则可以以相同的方式维护会话 ID,并且“killed tokens”表仍然可以保持比完整用户表小得多(您只需要保留比完整用户表更新的记录)允许的最长令牌生命周期)。因此,使令牌无效的能力部分抵消了客户端会话的好处,因为您必须维持此会话终止状态。这很可能是一个比原始会话状态表小得多的表,因此查找仍然更有效。

使用 JWT 令牌的另一个好处是,使用可能包含您期望拥有的每种语言的库来实现相当容易。它也完全脱离了您最初的用户身份验证方案 - 如果您转向基于指纹的系统,则无需对会话管理方案进行任何更改。

一个更微妙的好处:因为 JWT 可以携带“信息”并且客户端可以访问它,所以您现在可以开始做一些聪明的事情。例如,提醒用户,他们的会话将在注销前几天到期,让他们可以根据令牌中的到期日期重新进行身份验证。无论你能想象到什么。

简而言之:JWT 回答了其他会话技术的一些问题和缺点。

  1. “更便宜”的身份验证,因为您可以消除数据库往返(或者至少可以查询更小的表!),从而实现水平可扩展性。

  2. 防篡改的客户端声明。

虽然 JWT 没有解决安全存储或传输等其他问题,但它没有引入任何新的安全问题。

JWT 存在很多负面影响,但如果您实现与其他类型的身份验证相同的安全性,那就没问题。

最后一点:这也不是 Cookie 与令牌的比较。 Cookie 是一种存储和传输信息位的机制,也可用于存储和传输 JWT 令牌。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

身份验证:JWT 使用与会话 的相关文章

  • 在本地安全存储用于 Web 服务的密码

    我有一个应用程序 通过发送用户名和密码来对第三方 Web 服务进行身份验证 目前 我每次启动应用程序时都会在 winform 上输入密码 但我需要它自动登录 我想比更安全地存储用户名 密码 Dim username as String us
  • 每次使用会话来获取/设置对象属性

    我尝试搜索这个 但我什至不知道如何用它来搜索 我试图做的是有一个类 每次我访问它来更改它时 我实际上都是从会话中获取和设置值 这是我正在尝试做的事情 到目前为止我所做的事情 public class example public int p
  • JWT 令牌中允许使用哪些字符?

    我看到 JWT 令牌由 A Z a Z 0 9 和特殊字符组成 and 我想知道 JWT 令牌中允许的字符列表 来自智威汤逊介绍 https jwt io introduction 输出是三个用点分隔的 Base64 URL 字符串 Bas
  • 在 React Native 应用程序中哪里可以获取 EXPO DEBUG 值?

    当我尝试登录 expo 时出现此错误 exp Set EXPO DEBUG true in your env to view the stack trace 你知道我到底要在哪里设置值吗EXPO DEBUG EXPO DEBUG是一个环境变
  • Docker Hub API v2 令牌身份验证问题

    目前 我正在开发一个非常轻量级版本的 Docker 容器编排器 并且我必须能够从公共 Docker Hub 注册表获取图像摘要 我想使用 Docker Registry API v2 来实现此目的 我正在尝试使用以下 API 调用获取授权令
  • NHibernate、数据绑定到 DataGridView、延迟加载和会话管理 - 需要建议

    我的主应用程序窗体 WinForms 有一个 DataGridView 它使用 DataBinding 和 Fluent NHibernate 显示 SQLite 数据库中的数据 该表单在应用程序运行的整个过程中都是打开的 出于性能原因 我
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • 使用 Vaadin Flow Web 应用程序处理全局所有布局和“路由”URL 的登录

    Vaadin 8 在 Vaadin 8 中 在我的UI子类我通过检查用户的会话是否带有一个属性来处理登录 该属性表明他们是否已成功登录 如果没有的话 我的UI子类显示登录布局 而不是带有导航选项的其他内容 例如菜单栏和在该 UI 内切换布局
  • CakePHP 身份验证插件身份关联

    我正在使用 CakePHP 3 8 并迁移到身份验证插件 https book cakephp org authentication 1 1 en index html https book cakephp org authenticati
  • 如何使用系统凭据自动登录网站?

    我需要为 Intranet 用户开发一个 Web 应用程序 我不希望他们每次访问该网站时都输入登录凭据 它应该从系统用户名和密码自动加载 即 如果他们拥有有效的系统用户名和密码 他们应该能够登录应用程序 我正在使用Java 如何满足这个要求
  • 我可以使用passport-google回调来验证android/ios用户吗?

    我有一个使用 google passport oauth2 进行身份验证的 node js 服务器 我的服务器端代码看起来像这样文档 https www npmjs com package passport google oauth2 au
  • 有没有办法拥有租户特定的 JWT 令牌

    我目前正在开发一个 SPA 应用程序 角度 后端使用 Python Flask API 该应用程序将支持多个租户 我对安全概念有点挣扎 我目前正在使用 jwt extend 颁发的 JWT 令牌对所有租户都有效 我当然可以从令牌中获取用户
  • 为什么LocalSessionFactoryBean不实现getCurrentSession,而SessionFactory的实例却可以调用该方法?

    这是我的 Spring Bean 配置
  • SSL 和会话劫持/固定

    快问 SSL 是否完全防止会话劫持 固定 谢谢 不可以 例如 在以下情况下可能会发生劫持 被黑客入侵的 CA 根签署无效证书 该证书可用于发起中间人攻击 被黑客攻击的域名所有者电子邮件收件箱使黑客有可能购买经过域名验证的证书 错误的密钥策略
  • 如何在使用 Web 服务时获取会话对象?

    如何在使用 Web 服务时获取会话对象 服务在两个程序之间调用 如何在使用 Web 服务时获取用户会话对象 不可能使用请求对象获取会话 因为当我们谈论服务时不会有请求或响应 如果您正在与JAX WS https jax ws dev jav
  • ini_set 'session.gc_maxlifetime' 为 1 天

    If I do ini set session gc maxlifetime 86400 这是否意味着用户可以将浏览器留在同一页面 非活动状态 最多 1 天 而不必担心会话被垃圾收集并被注销 如果服务器配置不支持此功能会发生什么 它会给我一
  • 使用 OWIN Ws-Federation 包针对 ADFS 3.0 进行身份验证

    我有一个MVC内网站点 需要使用AD帐户进行身份验证 我设置了 ADFS 3 0 Windows Server 2012 R2 并遵循this http www cloudidentity com blog 2014 02 12 use t
  • Joomla getUser() 不显示更新的用户数据

    下面的代码允许我在用户的 Joomla 个人资料的个人资料页面中显示用户名 鉴于我已经覆盖了模板以获得我想要的外观和感觉 user JFactory getUser if user gt guest echo You are logged
  • 如何在 Spring-Security 中重命名表 persist_logins

    Spring Security 中管理 记住我 身份验证的默认表名称是 persistent logins 由于数据库命名约定 我需要重命名该表 持久登录 to T PERSISTENT LOGINS 请提供任何帮助 您需要编写自己的实现J
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web

随机推荐

  • 交叉编译:如何使用一个前缀安装,并使用不同的前缀部署?

    我正在尝试为替代架构交叉编译一些应用程序 我的典型流程如下 下载源代码并将其解压到 var source 中 configure prefix var install CC my cross compiler gcc make 进行安装 这
  • 从 React.js 进行 RESTful API 调用

    我正在为同构 JavaScript 应用程序做一个 POC 以从服务器端渲染 HTML POC 使用简单的 HTML 但我想进行 API 调用并获取 JSON 响应并将其发送到渲染函数 我尝试了各种方法但它不起作用 我缺少什么 我对 Rea
  • Javascript 指针/引用的疯狂。有人可以解释一下吗?

    Javascript 通过引用传递对象 这是完全有道理的 但是一旦你开始操纵这些对象 一切都会以一种看起来不直观的方式运作 让我举个例子 var a b a b a a one console log JSON stringify a ou
  • 无法使用selenium web驱动程序连接到电子/CEF应用程序

    我正在尝试使用此示例代码自动化 electron api demos 1 app public static void main String args throws IOException InterruptedException int
  • asp.net MVC:本地化

    我的目标语言在 Session lang 中 它是 en 或 it 我已将其添加到 Site master 中
  • Java 中的线程是否依赖于平台?

    很明显 操作系统调度 线程算法对 Java 线程有影响 但是 我们可以有把握地说线程依赖于操作系统 机器吗 如果是这样的话 那么 Java 平台不依赖吗 是的 Java 中线程调度的细节取决于 JVM 实现 并且 通常 也取决于操作系统实现
  • 是否可以将 Stripe Connect 与 Meteor.js 一起使用?

    有人成功集成了 Stripe Connect 和 Meteor js 吗 我已经使用 Stripe Checkout 通过 Meteor 包向买家收取付款 但我现在正在研究建立一个买家和卖家可以直接进行交易的市场 我还没有找到任何适用于 M
  • 棘手的 I一次性问题

    我试图抽象 封装以下代码 以便所有客户端调用都不需要重复此代码 例如 这是从视图模型 MVVM 到 WCF 服务的调用 using var channelFactory new WcfChannelFactory
  • 在没有选择器错误的情况下使用包

    我正在使用这个名为的配置库Viper https github com spf13 viper 在我的主要内容中 我有这个 viper SetConfigName development viper AddConfigPath config
  • Try-catch 创建无限循环[重复]

    这个问题在这里已经有答案了 我需要能够接受用户输入 直到输入大于初始价格 但我还需要使其稳健 以便用户无法通过输入双精度 整数以外的内容来破坏程序 如果用户确实输入了 double int 以外的内容 问题在于它创建了一个循环并重复 请输入
  • WPF // MahApps.Metro // Caliburn.Micro // 弹出控件 // HeaderedContentControl

    自从 MahApps Metro 1 5 0 发生变化以来 Flyout 的基本元素已从ContentControl to HeaderContentControl 现在使用 Caliburn Micro 和 MVVM 方法this htt
  • Android 原生代码:将 Surface 分配给特定显示器

    我正在寻找一种将 Surface 本机窗口 对象分配给显示器的方法 以便提交到该本机窗口的缓冲区将渲染到该特定显示器而不是主显示器 我想用本机代码来做到这一点 在Java中 可以通过使用Presentation API来完成 在本机代码中我
  • Mockito:如何测试构造函数被调用?

    我正在使用 Mockito 来测试 Java 应用程序中的方法 如何测试构造函数是否被调用过一次 我正在尝试进行类似的验证 verify myClass times 1 doSomething anotherObject 但我无法验证构造函
  • python 通过列表创建一个包含一行的数据框

    在Python中 假设我有一个列表 1 2 3 100 我想使用这个列表创建一个数据框 其中有一行 行值是列表 最快且优雅的方法是什么 将列表作为列表参数传递给data In 11 l range 1 100 pd DataFrame da
  • 在 Django 中通过哈希有效保存文件

    我正在开发一个 Django 项目 我希望用户能够做的是上传文件 通过表单 然后将文件本地保存到自定义路径并使用自定义文件名 其哈希值 我能想到的唯一解决方案是使用我正在使用的 FileField 的 upload to 参数 这意味着什么
  • 找不到与给定名称匹配的资源(在“title”处,值为“@string/action_settings”)

    所以我最近 就像今天最近 开始尝试在eclipse中工作 我一直在关注 Android 开发者初学者课程 到目前为止一切都很顺利 我已经开始构建一个简单的用户界面 http developer android com training ba
  • 无法找到软件包 openssl-dev

    我正在尝试使用 Ubuntu 18 04 在 Linux 上安装 ROOT CERN 软件包 每当我进入先决条件下载时 都使用以下命令 sudo apt get install dpkg dev cmake g gcc binutils l
  • 接口继承一致性

    首先看这段代码 class Program static void Main string args var x Base new Derived IMethod x DoWork Console ReadKey interface IMe
  • 背包0-1个定量

    我正在编写具有多个约束的背包 0 1 的变体 除了重量约束之外 我还有数量约束 但在本例中 我想解决背包问题 因为我的背包中需要恰好有 n 件物品 且重量小于或等于 W 目前正在为简单的 0 1 案例实现动态编程 ruby 解决方案 基于
  • 身份验证:JWT 使用与会话

    在身份验证等情况下 使用 JWT 相对于会话有什么优势 它是作为独立方法使用还是在会话中使用 JWT 本身并没有使用 会话 的优势 JWT 提供了一种在客户端维护会话状态的方法 而不是在服务器上进行维护 人们在问这个问题时通常的意思是 使用