身份验证: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 使用与会话 的相关文章

  • 查明具有特定 ID 的会话是否已过期

    我正在创建一个上传功能 将用户上传的文件存储在服务器上 并以用户的会话 ID 作为名称 现在 我只想将此文件保留在服务器上 直到该会话处于活动状态 所以 我的问题是 如何根据会话 ID 确定会话是活动的还是过期的 以便在后一种情况下我可以安
  • Laravel 5 通过外部 API 对用户进行身份验证

    我想知道是否可以扩展内置身份验证以使用外部 API 来对用户进行身份验证 我是 Laravel 新手 非常感谢您的帮助 我正在 Laravel 5 2 中为我的客户制作一个自定义应用程序 但我无法直接访问他们的数据库服务器 我只能调用他们的
  • 如何使用 Laravel 5.3 注销并重定向到登录页面?

    我正在使用 Laravel 5 3 并尝试实现身份验证系统 我用了php artisan命令make auth来设置它 我根据我的布局编辑了视图 并将其重定向到我的仪表板页面而不是主页 在设置中设置为默认值 现在 当我尝试注销时 它向我抛出
  • 从会话 0(服务)启动提升的用户进程[重复]

    这个问题在这里已经有答案了 大家早 这个问题似乎已被问过几次 但我找不到它是否真的可能 我已发布于here http social msdn microsoft com Forums windowsdesktop en US 80e4e75
  • 为什么authentication:'plain'是rails中actionmailer的默认设置(使用gmail smtp)?

    我正在阅读Rails 的actionmailer 我的问题是关于所述的默认设置here http guides rubyonrails org action mailer basics html action mailer configur
  • ClientAuthError:令牌续订操作由于超时而失败 MSAL Angular

    我是 MSAL 新人 所以我只遵循从这里实现它的基本设置https github com AzureAD microsoft authentication library for js blob dev lib msal angular R
  • ASP.NET Core 1.0 Web API 中的简单 JWT 身份验证

    我正在寻找最简单的方法来设置使用 JWT 在 ASP NET Core 又名 ASP NET 5 中进行身份验证的 Web API 服务器 这个项目 博客文章 http www codeproject com Articles 369657
  • 使用 JWT 创建 Firebase 自定义身份验证令牌

    为了创建 firebase 自定义身份验证令牌 我使用第三方 JWT 库 https github com jwtk jjwt https github com jwtk jjwt 在此库中 有一个选项可以添加 firebase 自定义令牌
  • Roslyn,通过 hostObject 传递值

    我正在尝试通过 hostObject 发送一个类 但显然它不想工作 using Roslyn Compilers using Roslyn Compilers CSharp using Roslyn Scripting using Rosl
  • jQuery Mobile 和 PhoneGap 中的身份验证

    我有一个使用 jQuery Mobile 和 PHP CodeIgniter 框架 构建的 Web 应用程序 现在我正在尝试制作它的 PhoneGap 版本 以使其可以作为独立应用程序进行分发 但是 PHP Web 应用程序 版本使用 Io
  • 如何使用 JSESSIONID 手动加载 Java 会话?

    我有一个处理多部分表单帖子的 servlet 该帖子实际上是由嵌入在页面中的 Flash 文件上传组件制作的 在某些浏览器中 Flash 生成的 POST 不包含 JSESSIONID 这使得我无法在发布期间从会话加载某些信息 Flash
  • 通过 JDBC 与 CLI 使用 MIT Kerberos 连接到 PostgreSQL 9.4 时出错

    我已经使用 MIT Kerberos 5 设置了 PostgreSQL 9 4 并且可以使用 psql 在 CLI 上连接 提交指纹后 我的委托人是 bgiles postgres REALM pg hba conf 有 host all
  • 使用 C# 使用证书进行 SSL 客户端身份验证

    我需要创建一个 C 应用程序 该应用程序必须使用 SSL 向服务器发送 API 请求 我需要创建客户端身份验证 我已经拥有服务器 CA 证书 客户端证书 cer 客户端私钥 pem 和密码 我找不到有关如何创建客户端连接的示例 有人可以建议
  • 获取所有连接的用户 (Laravel 5)

    如何显示我家中所有已连接的用户 这是一个非常基本的方法 但希望是检测两者的有效方法Guest and RegisteredLaravel5 应用程序上的用户 Step 1 打开文件config session php并将驱动程序更改为数据库
  • iPhone 应用程序拒绝 17.2:应用程序要求用户使用 Facebook 帐户登录

    我按照此处的本机 iOS 应用程序的登录说明进行操作https developers facebook com docs mobile ios build https developers facebook com docs mobile
  • 将 ActiveAdmin 用户与现有用户模型合并

    我在项目早期就设置了 ActiveAdmin 并使用了默认值admin users认证模型 从那以后 我使用 Devise 建立了一个单独的用户模型 并意识到合并两个表可能会更明智 这样管理员就可以在 Activeadmin 和站点前端中进
  • 修改不同Django用户的会话数据

    这可能不可能 但是当某些情况发生时 我想修改某些登录用户的会话数据 标记一些额外的逻辑需要在下次加载页面时运行 有没有办法通过用户 ID 访问用户的会话 tldr Query Session模型 然后通过修改匹配会话SessionStore
  • JWT(Json Web 令牌)与自定义令牌

    我仔细查看了问题 但没有找到任何可以解决我的疑问的内容 我找到了有关 JWT 的大量信息 但在比较 JWT 相对于针对 REST 服务生成自定义令牌来对身份验证请求提供的优势时 发现的信息并不多 与生成自定义生成令牌相比 使用 JWT Js
  • Rails 中的会话、子域和 authlogic 问题

    我有一个带有 authlogic 身份验证的 Rails 应用程序和一个使用 subdomain fu 构建的 username domain com 结构 但是当从domain com转到username domain com时 我的会话
  • Jquery Ajax 调用返回 403 状态

    我有一个 jquery Ajax 调用来实现会话的 keepalive 这个 keepAlive 方法将每 20 分钟调用一次 function keepAlive ajax type POST url KeepAliveDummy asp

随机推荐

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

    我正在尝试为替代架构交叉编译一些应用程序 我的典型流程如下 下载源代码并将其解压到 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 提供了一种在客户端维护会话状态的方法 而不是在服务器上进行维护 人们在问这个问题时通常的意思是 使用