”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 有状态与无状态身份验证

有状态与无状态身份验证

发布于2024-11-04
浏览:922

无状态和有状态架构

指的是应用程序的状态,即给定时间的条件质量。在无状态身份验证中,不存储会话或用户,仅包含静态内容。这与有状态不同,有状态是动态内容

无状态进程是一种孤立的资源,它不引用任何其他服务或与另一个系统的交互。它仅在代码的该部分中运行,不会从旧事务中引入信息,因为无状态身份验证不存储此类数据;每个操作都是从头开始完成

状态身份验证允许信息多次使用,并基于先前事务的上下文执行。因此,在需要等待响应或预先存在的数据的应用程序中,无论是否存在于另一个系统或数据库中,都使用有状态。

无状态认证

无状态身份验证包含一种策略,在该策略中,用户在提供凭据后会收到访问令牌作为响应。该令牌已包含识别生成它的用户所需的所有信息,而无需不断查询颁发令牌的服务或数据库。

此令牌存储在客户端(浏览器),因此服务器只能通过确认有效负载和签名匹配来检查令牌的有效性。

无状态认证 JWT

JSON Web Token (JWT) 是具有 RFC-7519 中建立的标准的密钥,包含声明形式的实体,这些实体是独立的,无需调用服务器重新验证令牌。

是使用密钥以base64标准编码的字符串,如示例所示:

Autenticação Stateful x Stateless

优点和缺点

优点:

  • 服务器内存消耗低。
  • 在可扩展性方面非常出色。
  • 非常适合分布式应用程序,例如 API 和微服务。
  • 在独立的应用程序中生成和分发令牌,不依赖第三方。
  • 轻松解释和验证代币用户数据。

缺点:

  • 访问控制困难。
  • 无法随时轻易撤销令牌。
  • 如果有人有权访问令牌,它可以促进恶意第三方的进入。
  • 在令牌过期之前,会话无法更改。
  • JWT 令牌更加复杂,在中心化应用程序(例如整体式应用程序)中可能变得不必要。

状态认证

常用于各种应用程序,尤其是那些不需要太多可扩展性的应用程序,有状态会话在应用程序的后端中创建,并将会话引用发送回相应的用户。每次用户发出请求时,应用程序的一部分都会生成令牌。从那时起,对于每个新请求,该令牌将再次发送到应用程序以重新验证访问权限。在这个模型中,如果用户数据发生任何变化,令牌可以很容易地被撤销。

这些是不透明的访问令牌,即专有格式的简单字符串,不包含与该令牌相关的任何标识符或用户数据。接收者需要调用创建令牌的服务器来验证它。

示例令牌:8c90e55a-e867-45d5-9e42-8fcbd9c30a74

此 ID 必须与拥有该令牌的用户一起存储在数据库中。

优点和缺点

优点:

  • 集中实现逻辑。
  • 简化访问管理和控制。
  • 非常适合单体应用、MVC 应用程序和内部流程。
  • 更安全地抵御恶意第三方。

缺点:

  • 负责验证令牌的 API 中可能存在过载。
  • 可扩展性方面失败。
  • 在微服务之间分配身份验证的难度更大。
  • 在分布式应用中,如果身份验证服务失败,则所有其他服务将变得不可用。
  • 更高的实施复杂性。
  • 与第三方系统集成难度较大。

何时使用每种方法?

何时使用 JWT 令牌和无状态身份验证

  • 当需要更高的性能而不用担心 API 过载时。
  • 当服务之间分布有多个通信时。
  • 当需要识别哪个用户在不同服务中的系统中执行操作时。
  • 当不打算保留用户的数据时,仅保留他们的初始注册。
  • 如果需要生成对服务的外部访问。
  • 如果有必要在对系统影响最小的情况下操纵执行特定操作的人员的数据。

何时使用不透明令牌和状态身份验证

  • 如果需要对系统用户进行完全访问控制,主要是定义访问层次结构。
  • 在集中式应用程序中,没有分布式服务,也没有与外部服务通信。

最终考虑因素:

  • 在某些地方,例如“API 压力”,为了清楚起见,该术语可能会替换为“API 开销”。
  • 如果目标受众需要更多上下文,“JWT 令牌”部分可以包含对 RFC-7519 中提到的“声明”内容的更详细解释。
  • 在状态身份验证部分中,可以通过解释应用程序的哪个特定部分负责这一点来澄清“应用程序的一部分将生成令牌”这一短语。
版本声明 本文转载于:https://dev.to/oleobarreto/autenticacao-stateful-x-stateless-e8i?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 将 PHP 连接到数据库:MySQL 初学者
    将 PHP 连接到数据库:MySQL 初学者
    在 PHP 中连接到 MySQL 数据库至关重要,步骤如下:安装 MySQL 扩展使用 mysqli_connect() 函数创建连接,参数包括主机、用户名、密码和数据库名称使用 mysqli_connect_error() 函数检查连接是否成功实战案例:获取所有用户,通过查询数据库并使用 mysq...
    编程 发布于2024-11-17
  • 为什么 CSS `visibility:hidden` 无法实现悬停效果?
    为什么 CSS `visibility:hidden` 无法实现悬停效果?
    揭开谜团:为什么 CSS 可见性在悬停时失败CSS 可见性提供了一种操作元素可见性的便捷方法,但有时它会偶然发现意想不到的障碍。考虑这样一个场景,您定义了一个“扰流器”类来使文本最初不可见,并在鼠标悬停时显示它。尽管您有期望,文本仍然顽固地保持在隐藏状态,无视您的悬停努力。深入探讨原因这种令人困惑的...
    编程 发布于2024-11-17
  • 何时在 JavaScript 中使用 parseInt() 和 Number() 进行字符串到数字的转换?
    何时在 JavaScript 中使用 parseInt() 和 Number() 进行字符串到数字的转换?
    使用parseInt()和Number()将字符串转换为数字在JavaScript中将字符串转换为数字时,两个常用的函数是parseInt () 和数字 ()。虽然它们都具有相同的数值转换目的,但它们的方法和行为有所不同。parseInt()parseInt() 执行更具体的任务,称为解析。它尝试从...
    编程 发布于2024-11-17
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-17
  • 项目 避免不必要地使用检查异常
    项目 避免不必要地使用检查异常
    检查异常是 Java 中的一个强大工具,因为它们迫使程序员处理异常情况,从而提高代码可靠性。然而,过度使用可能会导致 API 难以使用。为了证明检查异常是合理的,情况必须是真正的异常并且程序员能够采取有用的操作。否则,未经检查的异常可能更合适。 Java 8 给检查异常的使用带来了额外的挑战,因为抛...
    编程 发布于2024-11-17
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-17
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-17
  • 为什么我的 PDO 更新查询无法修改 MySQL 中的特定行?
    为什么我的 PDO 更新查询无法修改 MySQL 中的特定行?
    使用 PDO 进行 MySQL 更新查询当尝试使用 PDO 和 MySQL 更新数据库行时,您可能会遇到这样的情况:您的代码执行失败。本指南探讨了此错误的可能原因并提供了解决方案。错误:不正确的 UPDATE 语法您遇到的错误源于不正确的 UPDATE 语法。具体来说,您的查询正在尝试用提供的值替换...
    编程 发布于2024-11-17
  • 数据库迁移对于 Golang 服务,为什么重要?
    数据库迁移对于 Golang 服务,为什么重要?
    DB Migration, why it matters? Have you ever faced the situations when you deploy new update on production with updated database schemas, but ...
    编程 发布于2024-11-17
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-17
  • 为什么在 Java 中连接空字符串不会抛出 NullPointerException?
    为什么在 Java 中连接空字符串不会抛出 NullPointerException?
    Java 中连接空字符串在 Java 中,连接空字符串可能看起来违反直觉,会导致出现 NullPointerException。但是,此操作成功执行,结果是一个包含“null”的字符串,后跟连接的字符串。为什么会这样?根据 Java 语言规范(JLS) 8,§ 15.18.1,在字符串连接期间,空引...
    编程 发布于2024-11-17
  • Java 正则表达式中的捕获组如何工作?
    Java 正则表达式中的捕获组如何工作?
    了解 Java 正则表达式捕获组在此代码片段中,我们使用 Java 的正则表达式 (regex) 库来提取字符串的一部分。正则表达式定义为“(.)(\d )(.)”,其中:(.*):匹配下一组之前的任意数量的任意字符.(\d ): 匹配前一组之后的任意数量的数字。(.*): 匹配前一组之后的任意数量...
    编程 发布于2024-11-17
  • 如何在 JavaScript 中将提示框中的用户输入转换为数值?
    如何在 JavaScript 中将提示框中的用户输入转换为数值?
    从提示框中检索数字输入将用户输入从提示框转换为数值对于在 JavaScript 中执行数学计算至关重要。这种转换可以通过函数 parseInt() 和 parseFloat() 来实现。parseInt() 和 parseFloat()parseInt() 和 parseFloat() 将数字的字符...
    编程 发布于2024-11-17
  • 如何将 C++ 代码转换为 C:自动和手动方法指南
    如何将 C++ 代码转换为 C:自动和手动方法指南
    将 C 代码转换为 C考虑到语言之间的复杂性和差异,将 C 代码转换为纯 C 可能是一项艰巨的任务。然而,有自动化工具和手动方法来应对这一挑战。自动转换工具值得考虑的一个自动化解决方案是 Comeau 的 C 编译器。该工具从 C 生成 C 代码,允许您维护 C 代码并根据需要将其转换为 C。但是,...
    编程 发布于2024-11-17
  • 在 PHP 中调整 PNG 大小时如何保持透明度?
    在 PHP 中调整 PNG 大小时如何保持透明度?
    在 PHP 中调整 PNG 大小时保留透明度在 PHP 中调整具有透明背景的 PNG 图像大小时,确保透明度是至关重要的维持。但网上很多代码示例都未能很好地实现这一点,导致调整大小后背景变成黑色。要解决这个问题,需要对代码进行具体调整。在执行 imagecolorallocatealpha() 函数...
    编程 发布于2024-11-17

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3