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

有状态与无状态身份验证

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

无状态和有状态架构

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

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

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

无状态认证

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

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

无状态认证 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]删除
最新教程 更多>
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示 仅通过Python的MlStripper 来简化剥离过程,Python Standard库提供了一个专门的功能,MLSTREPERE,MLSTREPERIPLE,MLSTREPERE,MLSTREPERIPE,MLSTREPERCE,MLST...
    编程 发布于2025-05-29
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    揭开神秘:content Security Policy Directive errors 遇到Enigmatic错误“拒绝加载脚本...此问题源于内容安全策略(CSP)指令,该指令限制了不受信任来源的资源加载。 However, resolving this challenge can be s...
    编程 发布于2025-05-29
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-05-29
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-05-29
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] 剩余_size- = buf_size lines = buffer.split('\ n'....
    编程 发布于2025-05-29
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月份)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将...
    编程 发布于2025-05-29
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-05-29
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-05-29
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-05-29
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-05-29
  • Python不会对超范围子串切片报错的原因
    Python不会对超范围子串切片报错的原因
    在python中用索引切片范围:二重性和空序列索引单个元素不同,该元素会引起错误,切片在序列的边界之外没有。这种行为源于索引和切片之间的基本差异。索引一个序列,例如“示例” [3],返回一个项目。但是,切片序列(例如“示例” [3:4])返回项目的子序列。索引不存在的元素时,例如“示例” [9] ...
    编程 发布于2025-05-29
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-05-29
  • 如何解决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-05-29
  • 用户本地时间格式及时区偏移显示指南
    用户本地时间格式及时区偏移显示指南
    在用户的语言环境格式中显示日期/时间,并使用时间偏移在向最终用户展示日期和时间时,以其localzone and格式显示它们至关重要。这确保了不同地理位置的清晰度和无缝用户体验。以下是使用JavaScript实现此目的的方法。方法:推荐方法是处理客户端的Javascript中的日期/时间格式化和时...
    编程 发布于2025-05-29
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-05-29

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

Copyright© 2022 湘ICP备2022001581号-3