跳转到主要内容

会话令牌

本文约需 2 分钟阅读

会话令牌是指为维持用户的登录状态,由服务器或客户端发行的临时标识符。 HTTP 本质上是无状态协议,每个请求的连接都相互独立。会话令牌弥补了这种无状态性,是服务器判断「该请求来自先前登录的用户 A」的机制。在 Web 应用程序安全中,它与认证并列,是最重要的要素之一。

HTTP 的无状态性与会话管理

在 HTTP/1.0 时代,Web 是一种获取文档的简单协议。其设计是请求与响应一对一地完成,不保留前后的上下文。然而,随着电商网站的购物车和登录功能成为需求,「保持状态」变得不可或缺。 1994 年 Netscape 的 Lou Montulli 发明了 Cookie,产生了让浏览器保存服务器发行标识符的机制。这就是会话管理的起源。

当前的会话管理大致分为服务器端会话和基于令牌的会话两种方式。选择哪一种取决于应用程序的架构与安全需求。

基于 Cookie 与基于令牌 (JWT)

在服务器端会话中,服务器生成会话 ID,并将对应的会话数据保存在服务器端 (内存、数据库、 Redis 等)。仅将会话 ID 通过 Cookie 传递给客户端,并让其在之后的请求中发送该 ID。由于由服务器管理状态,可以即时使会话失效 (登出、强制断开)。

另一方面,以 JWT (JSON Web Token) 为代表的基于令牌的方式,将状态嵌入到包含用户信息和有效期的令牌本身中。由于服务器只需验证令牌的签名即可完成认证,无需会话存储,扩展性优异。然而,存在一个根本性课题:一旦发行的 JWT 难以被即时失效。即使用户更改了密码,现有的 JWT 在有效期之前仍可继续使用。为缓解该问题,通常会组合使用有效期较短 (约 15 分钟) 的访问令牌和有效期较长的刷新令牌。

针对会话的攻击

会话令牌是攻击者绝佳的目标。会话劫持是窃取有效会话令牌以冒充用户的攻击。代表性手法是利用 XSS 漏洞从 JavaScript 读取 Cookie。

会话固定攻击 (Session Fixation) 是让受害者使用攻击者事先准备好的会话 ID 的手法。当受害者用该会话 ID 登录后,攻击者便能以相同的会话 ID 访问已认证的状态。作为对策,在登录成功时重新生成会话 ID (会话再发行) 是必须的。CSRF 攻击也是以会话令牌的存在为前提的攻击,与会话管理密切相关。可在会话劫持对策会话令牌窃取的防御策中确认具体对策。

通过 Cookie 属性强化安全性

在使用 Cookie 管理会话令牌时,恰当的属性设置是安全的关键。Secure 属性限制仅在 HTTPS 连接时发送 Cookie,通信路径的加密相结合以防止窃听。 HttpOnly 属性禁止从 JavaScript 访问 Cookie,防止通过 XSS 窃取令牌。 SameSite 属性控制跨站点请求时的 Cookie 发送,降低 CSRF 攻击的风险。

这三个属性也被称为「会话 Cookie 的三件神器」,缺少其中任何一个都可能成为安全漏洞。Web 安全实践书 (Amazon)中,Cookie 属性的设置也是最先讲解的基础事项。

令牌的有效期设计

有效期的设计本身就是安全性与便利性之间的权衡。过短会迫使用户频繁重新登录,过长则会在令牌泄露时扩大损失。作为一般准则,银行等高安全性服务设置为 15-30 分钟,一般的 Web 服务设置为 1-24 小时,像社交网络这类重视便利性的服务则设置为数周至数月。浏览器的密码安全性也是与会话管理相关的重要话题。

相关术语

这篇文章对您有帮助吗?

XHatena