Web 身份验证:Cookie 与 令牌

发布日期:2023-12-20 15:03浏览次数:



应用开发一般都少不了身份验证,而身份验证机制的稳定性对所有应用程序都变得至关重要。具体选择何种方式进行身份验证可以根据项目及团队情况来衡量,在决定之前需要先理解WEB身份验证常见的两种方式:基于 的身份验证和基于令牌()的身份验证。

身份验证是将用户凭据交换为唯一身份标识的过程。 在基于 的身份验证中,此唯一标识符 () 在服务器端创建并发送给浏览器。

当登录 Web 应用程序时,浏览器将从其应用程序的服务器接收一个 ,浏览器将存储它并将该 与每个后续请求一起发送,以验证请求来自同一用户。

为了更好地理解 的工作原理,下面将这个过程分解为 5 个部分。

服务器验证凭证成功后,创建 ,可以存储在内存或数据库中,为了更好的扩展建议将其存储在数据库中。如果是存储在内存中,在使用负载均衡或多服务器部署的场景下会出现 问题。

这个 通过名称值对发送,它包含一个唯一的 来标识用户。

除此之外,cookie 还可以包含到期日期、作用域和有效时间等详细信息。具有多个 标头的示例响应如下所示:

当服务器收到带有 的请求时,它会将 中的 与数据库中的 进行比较以验证用户的有效性。

可以使用浏览器开发工具在应用程序部分下的 存储中找到浏览器中保存的所有 。

一旦用户注销,服务器将通过清除数据库 并使 过期,2023年软件发展趋势分析报告模板pptx浏览器也会从 存储中删除它。

上面简单介绍了一下 的工作流程,下面来看看其特征与优缺点。

使用 进行身份验证,则无需明确开发任何内容来向请求添加 Cookie。 浏览器会负责 的处理,它会自动为所有请求添加 。

尽管这种自动化过程使开发变得更容易,但也有一些缺点。例如,有些请求不需要任何身份验证,但是使用这种方法, 也将在每个请求中被发送。 此外, 攻击者可以利用这种机制来欺骗浏览器向虚假网站发送带有 Cookie 的请求。

默认情况下,基于 的身份验证对攻击没有有效的保护,它们主要容易受到跨站脚本()和跨站请求伪造()攻击。 但是,可以显式地修改 标头来保护它们免受此类攻击。

例如,在设置 头时使用 属性可以很容易地保护 免受 攻击。

此外,可以在 标头中使用 属性来有效地防止 攻击。

属性有 3 个值可用::将确保浏览器不会在跨站点请求时发送 (如果没有定义 属性,这是 的默认行为)。 : 将确保浏览器仅针对同站点请求发送 。 将允许通过跨站点和同站点请求发送

除非特别配置,否则 仅适用于单个域名。尽管从表面上这似乎是一种限制,但它是默认情况下强制执行单一来源的最强大功能之一。但是,如果前端和后端 (API) 来自不同的域名或子域名,则需要在 中将其明确列入白名单。否则,浏览器不会随请求一起发送 。

如果正在构建一个API来向客户端公开服务,那么 可能不是最佳的选择。除非客户端只是浏览器,否则它会使客户端变得复杂。

例如,开发的是一款手机应用,与令牌 相比,拥有 将使移动应用程序 管理变得复杂


Web 身份验证:Cookie 与 令牌



Web 身份验证:Cookie 与 令牌


如前所述,服务器负责 设置,需要在数据库中为每个用户存储 。

尽管有成熟的方法来处理可扩展性(例如,使用像 这样的内存数据库作为 的存储),但它仍然增加了更多的复杂性。

但是,随着用户数量的增加,在扩展和管理这些 时可能会出现问题。

由于这种方法为每个用户维护单独的 ,所以可以存储额外的数据到 中。

通过 和 ,可以存储特定的数据,如用户个性化、访问控制和 。然后,它允许将其用于后续请求。

然而,也可以用 来实现这一点。例如,使用 令牌,可以存储 数据。然而,由于它将增加 的大小,保留更多 将影响更高的网络利用率。

如果我们只考虑单个请求,这可能没有意义,但当事情聚集和扩展时,开销就会变得显而易见。

由于 提供了 选项,可以限制 JavaScript 对它的访问。此外,它将阻止任何访问 与跨站点脚本攻击。

引入基于令牌的身份验证是为了解决基于 方法的不足。 与 不同,基于 的方法需要自己实现, 保存在客户端。

当登录到web应用程序时,服务器将验证凭据并向浏览器发送加密 。然后浏览器将存储这个 ,并可以添加到后续请求的授权头中。

然而,基于 方法的标准实现要比上面描述的流程复杂得多。例如, 引入了多个身份验证流来处理不同类型的用例。

为了更好地理解 的工作方式,下面将这个过程分解为4个部分,并以使用最广泛的 标准 作为实例。 是基于令牌的身份验证中最常用的开放标准。

通常,需要在传输时使用加密(如 SSL)来保护通道。

在服务器端,可以使用像 jsonwebtoken 这样的 NPM 库来生

成这些令牌。

使用 生成的 如下所示:

浏览器可以将此 存储在本地存储、 或 中。然后这个 将被添加到必要请求的授权头中,并发送到服务器端进行请求验证。因此,需要使用 JavaScript 来实现向标头添加 。

此外,可以使用 库中的 函数来解码此 并在应用程序中使用有效负载数据。

一旦用户退出系统,需要手动清除存储在存储中的 ,使其无法用于进一步的请求。

与 不同,基于令牌的方法是无状态的。这意味着它不会在数据库或服务器中保存有关用户的任何信息。 服务器只负责创建、验证令牌,这允许构建比基于 的方法更具可扩展性的解决方案。

尽管令牌试图解决 中的安全问题,但它也并不完全安全。 如果应用程序允许将外部 JavaScript 嵌入到应用程序中,则保存在浏览器中的令牌可能容易受到 攻击。

此外,由于令牌是无状态的,如果暴露在外面,在它到期之前没有办法撤销它。因此,网络和信息安全尽可能少地保留令牌至关重要。大部分身份验证服务将 令牌的有效期设置在 5 分钟以内。

基于令牌和基于 的方法是 Web 应用程序最常用的两种身份验证机制。在本文中,讨论了它们的工作原理、特性、优缺点。

正如所看到的,这些方法都不是 100% 完美的,它们各有优缺点。因此,在选择身份验证方法时,建议根据项目要求选择一种,而不是追求完美的方法。@DevPoint 深耕WEB开发10+年,追求技术精湛



原创文章出自IM电竞,欢迎转载!

如果您有什么问题,欢迎咨询技术员 点击QQ咨询