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

有状态与无状态身份验证

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

无状态和有状态架构

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

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

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

无状态认证

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

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

无状态认证 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]删除
最新教程 更多>
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-07-13
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-07-13
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-07-13
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    在Microsoft Visual C 中,Microsoft consions用户strate strate strate strate strate strate strate strate strate strate strate strate strate strate strate st...
    编程 发布于2025-07-13
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-07-13
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-07-13
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-07-13
  • JavaScript计算两个日期之间天数的方法
    JavaScript计算两个日期之间天数的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    编程 发布于2025-07-13
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c [&& && && && && && && && && && &&&&&&&&&&&&&&&&&&&&&&&华仪的函数时,在接受成员函数指针的函数时,要在函数上既要提供指针又可以提供指针和指针到函数的函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此...
    编程 发布于2025-07-13
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将其...
    编程 发布于2025-07-13
  • CSS可以根据任何属性值来定位HTML元素吗?
    CSS可以根据任何属性值来定位HTML元素吗?
    靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
    编程 发布于2025-07-13
  • 如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    appEngine静态文件mime type override ,静态文件处理程序有时可以覆盖正确的mime类型,在错误消息中导致错误消息:“无法猜测mimeType for for file for file for [File]。 application/application/octet...
    编程 发布于2025-07-13
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-07-13
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-07-13
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-07-13

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

Copyright© 2022 湘ICP备2022001581号-3