发布日期:2023-12-20 15:03浏览次数:
应用开发一般都少不了身份验证,而身份验证机制的稳定性对所有应用程序都变得至关重要。具体选择何种方式进行身份验证可以根据项目及团队情况来衡量,在决定之前需要先理解WEB身份验证常见的两种方式:基于 的身份验证和基于令牌()的身份验证。
身份验证是将用户凭据交换为唯一身份标识的过程。 在基于 的身份验证中,此唯一标识符 () 在服务器端创建并发送给浏览器。
当登录 Web 应用程序时,浏览器将从其应用程序的服务器接收一个 ,浏览器将存储它并将该 与每个后续请求一起发送,以验证请求来自同一用户。
为了更好地理解 的工作原理,下面将这个过程分解为 5 个部分。
服务器验证凭证成功后,创建 ,可以存储在内存或数据库中,为了更好的扩展建议将其存储在数据库中。如果是存储在内存中,在使用负载均衡或多服务器部署的场景下会出现 问题。
这个 通过名称值对发送,它包含一个唯一的 来标识用户。
除此之外,cookie 还可以包含到期日期、作用域和有效时间等详细信息。具有多个 标头的示例响应如下所示:
当服务器收到带有 的请求时,它会将 中的 与数据库中的 进行比较以验证用户的有效性。
可以使用浏览器开发工具在应用程序部分下的 存储中找到浏览器中保存的所有 。
一旦用户注销,服务器将通过清除数据库 并使 过期,2023年软件发展趋势分析报告模板pptx浏览器也会从 存储中删除它。
上面简单介绍了一下 的工作流程,下面来看看其特征与优缺点。
如
使用 进行身份验证,则无需明确开发任何内容来向请求添加 Cookie。 浏览器会负责 的处理,它会自动为所有请求添加 。尽管这种自动化过程使开发变得更容易,但也有一些缺点。例如,有些请求不需要任何身份验证,但是使用这种方法, 也将在每个请求中被发送。 此外, 攻击者可以利用这种机制来欺骗浏览器向虚假网站发送带有 Cookie 的请求。
默认情况下,基于 的身份验证对攻击没有有效的保护,它们主要容易受到跨站脚本()和跨站请求伪造()攻击。 但是,可以显式地修改 标头来保护它们免受此类攻击。
例如,在设置 头时使用 属性可以很容易地保护 免受 攻击。
此外,可以在 标头中使用 属性来有效地防止 攻击。
属性有 3 个值可用::将确保浏览器不会在跨站点请求时发送 (如果没有定义 属性,这是 的默认行为)。 : 将确保浏览器仅针对同站点请求发送 。 将允许通过跨站点和同站点请求发送
除非特别配置,否则 仅适用于单个域名。尽管从表面上这似乎是一种限制,但它是默认情况下强制执行单一来源的最强大功能之一。但是,如果前端和后端 (API) 来自不同的域名或子域名,则需要在 中将其明确列入白名单。否则,浏览器不会随请求一起发送 。
如果正在构建一个API来向客户端公开服务,那么 可能不是最佳的选择。除非客户端只是浏览器,否则它会使客户端变得复杂。
例如,开发的是一款手机应用,与令牌 相比,拥有 将使移动应用程序 管理变得复杂


如前所述,服务器负责 设置,需要在数据库中为每个用户存储 。
尽管有成熟的方法来处理可扩展性(例如,使用像 这样的内存数据库作为 的存储),但它仍然增加了更多的复杂性。
但是,随着用户数量的增加,在扩展和管理这些 时可能会出现问题。
由于这种方法为每个用户维护单独的 ,所以可以存储额外的数据到 中。
通过 和 ,可以存储特定的数据,如用户个性化、访问控制和 。然后,它允许将其用于后续请求。
然而,也可以用 来实现这一点。例如,使用 令牌,可以存储 数据。然而,由于它将增加 的大小,保留更多 将影响更高的网络利用率。
如果我们只考虑单个请求,这可能没有意义,但当事情聚集和扩展时,开销就会变得显而易见。
由于 提供了 选项,可以限制 JavaScript 对它的访问。此外,它将阻止任何访问 与跨站点脚本攻击。
引入基于令牌的身份验证是为了解决基于 方法的不足。 与 不同,基于 的方法需要自己实现, 保存在客户端。
当登录到web应用程序时,服务器将验证凭据并向浏览器发送加密 。然后浏览器将存储这个 ,并可以添加到后续请求的授权头中。
然而,基于 方法的标准实现要比上面描述的流程复杂得多。例如, 引入了多个身份验证流来处理不同类型的用例。
为了更好地理解 的工作方式,下面将这个过程分解为4个部分,并以使用最广泛的 标准 作为实例。 是基于令牌的身份验证中最常用的开放标准。
通常,需要在传输时使用加密(如 SSL)来保护通道。
在服务器端,可以使用像 jsonwebtoken 这样的 NPM 库来生
成这些令牌。使用 生成的 如下所示:
浏览器可以将此 存储在本地存储、 或 中。然后这个 将被添加到必要请求的授权头中,并发送到服务器端进行请求验证。因此,需要使用 JavaScript 来实现向标头添加 。
此外,可以使用 库中的 函数来解码此 并在应用程序中使用有效负载数据。
一旦用户退出系统,需要手动清除存储在存储中的 ,使其无法用于进一步的请求。
与 不同,基于令牌的方法是无状态的。这意味着它不会在数据库或服务器中保存有关用户的任何信息。 服务器只负责创建、验证令牌,这允许构建比基于 的方法更具可扩展性的解决方案。
尽管令牌试图解决 中的安全问题,但它也并不完全安全。 如果应用程序允许将外部 JavaScript 嵌入到应用程序中,则保存在浏览器中的令牌可能容易受到 攻击。
此外,由于令牌是无状态的,如果暴露在外面,在它到期之前没有办法撤销它。因此,网络和信息安全尽可能少地保留令牌至关重要。大部分身份验证服务将 令牌的有效期设置在 5 分钟以内。
基于令牌和基于 的方法是 Web 应用程序最常用的两种身份验证机制。在本文中,讨论了它们的工作原理、特性、优缺点。
正如所看到的,这些方法都不是 100% 完美的,它们各有优缺点。因此,在选择身份验证方法时,建议根据项目要求选择一种,而不是追求完美的方法。@DevPoint 深耕WEB开发10+年,追求技术精湛
原创文章出自IM电竞,欢迎转载!