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

有状态与无状态身份验证

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

无状态和有状态架构

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

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

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

无状态认证

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

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

无状态认证 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中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-05-28
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-05-28
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-05-28
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-05-28
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-05-28
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-05-28
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-05-28
  • 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-05-28
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-05-28
  • CSS可以根据任何属性值来定位HTML元素吗?
    CSS可以根据任何属性值来定位HTML元素吗?
    靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
    编程 发布于2025-05-28
  • 在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8表中将latin1字符转换为utf8 ,您遇到了一个问题,其中含义的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致电。为了解决此问题,您正在尝试使用“ mb_convert_encoding”和“ iconv”转换受...
    编程 发布于2025-05-28
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-05-28
  • 将图片浮动到底部右侧并环绕文字的技巧
    将图片浮动到底部右侧并环绕文字的技巧
    在Web设计中围绕在Web设计中,有时可以将图像浮动到页面右下角,从而使文本围绕它缠绕。这可以在有效地展示图像的同时创建一个吸引人的视觉效果。 css位置在右下角,使用css float and clear properties: img { 浮点:对; ...
    编程 发布于2025-05-28
  • 解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    编程 发布于2025-05-28
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-05-28

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

Copyright© 2022 湘ICP备2022001581号-3