7.1. 访问令牌的安全考量
7.1.1. 安全威胁
下面列出了几种针对使用某种形式令牌的协议的常见威胁。这些威胁基于 NIST 特别出版物 800-63 [NIST800-63]。
7.1.1.1. 访问令牌的生成或修改
攻击者可能会生成一个假的访问令牌,或者修改现有令牌的内容(例如认证信息或属性声明),导致资源服务器给客户端授予了不恰当的访问权限。例如,攻击者可能会修改令牌,以延长其有效期。恶意客户端可能会修改陈述,以访问它们原本不能查看的信息。
7.1.1.2. 访问令牌的泄露
访问令牌可能包含认证信息和属性声明,其中包含了敏感信息。
7.1.1.3. 访问令牌的重定向
攻击者使用原定被一台资源服务器使用的访问令牌,访问另一台资源服务器,后者误认为访问令牌是被其使用的。
7.1.1.4. 访问令牌的重放
攻击者试图使用过去已在该资源服务器上使用过的访问令牌。
7.1.2. 减少威胁
使用数字签名保护访问令牌的内容,可以减少许多威胁。
或者,不记名令牌可以包含对授权信息的引用,而不是直接编码这些信息。使用引用可能需要资源服务器和授权服务器进行一次额外互动,以将引用解析为授权信息。本规范美哦与定义这种互动的机制,但代码检查 [RFC7662] 定义了一种此类机制。
本文档没有规定访问令牌的编码或内容。因此,关于保障访问令牌完整性的方法的详细建议不在本规范的范围内。访问令牌的 JWT 形式 [RFC9068] 描述了访问令牌编码和签名机制的一个示例。
为了处理访问令牌的重定向,有一点很重要,即授权服务器在令牌中包含预期接收者(受众)的身份,后者通常是单台(或若干台)资源服务器。此外,还建议将访问令牌的使用限制在特定范围内。
如果传输 cookies 时没有 TLS 保护,那么其中包含的任何信息都有泄露的风险。因此,不记名令牌禁止被存储在可以被明文发送的 cookies 中。关于 cookies 的安全考量见《HTTP 状态管理机制》[RFC6265]。
在某些部署(包括那些使用负载均衡的部署)中,与资源服务器的 TLS 连接会在实际提供资源的服务器之前终止。这可能导致,在 TLS 连接终止的前端服务器和提供资源的后端服务器之间,令牌不受保护。在这种部署中,必须采取足够的措施,确保前后端服务器之间的访问令牌机密性。令牌加密就是其中一种可能的措施。
7.1.3. 建议总结
7.1.3.1. 保护不记名令牌
客户端的实现必须确保不记名令牌不会泄露给非预期方,因为后者可以使用这些令牌访问受保护资源。这是使用不记名令牌时的首要安全考量,也是下面所有更具体建议的基础。
7.1.3.2. 验证 TLS 证书链
当请求受保护资源时,客户端必须验证 TLS 证书链。不这么做可能会导致 DNS 劫持攻击窃取令牌,并且获取预期外的访问权限。
7.1.3.3. 始终使用 TLS(https)
当使用不记名令牌发起请求时,客户端必须始终使用 TLS,或者等效的传输层安全性协议。不这么做会将令牌暴露给数种攻击,让攻击者获取预期外的访问权限。
7.1.3.4. 不要在 HTTP cookies 里存储不记名令牌
具体实现禁止在可以被明文发送(cookies 的默认传输模式)的 cookies 中存储不记名令牌。在 cookies 中存储不记名令牌的具体实现必须采取措施预防跨站请求伪造。
7.1.3.5. 颁发短期的不记名令牌
授权服务器应该颁发短期的不记名令牌,特别是在将令牌颁发给在网络浏览器中运行的客户端,或者其它可能发生信息泄露的环境时。使用短期的不记名令牌可以减少其泄露的影响。
7.1.3.6. 颁发有限范围的不记名令牌
授权服务器应该颁发包含受众限制的不记名令牌,将它们的范围限制在预期内的依赖方或依赖方集合。
7.1.3.7. 不要在页面 URL 中传递不记名令牌
不记名令牌禁止在页面 URL 中传递(例如,作为查询字符串参数),而应该在采取了保密措施的 HTTP 消息头或消息体中传递。浏览器、网络服务器以及其它软件可能无法充分保护浏览器历史记录、网络服务器日志以及其它数据结构中的 URL。如果不记名令牌在 URL 中传递,那么攻击者就有可能从历史数据、日志或其它不安全的地方窃取令牌。
7.1.4. 访问令牌的权限限制
与访问令牌关联的权限应该被限制在特定应用或用例所需的最小范围内。这样可以防止客户端超出资源所有者授权的权限。它还能防止用户超出各自安全策略授权的权限。权限限制还有助于减少访问令牌泄漏的影响。
特别是,访问令牌应该被限制在特定的资源服务器上(受众限制),最好是单台资源服务器。为了实现这一点,授权服务器将访问令牌与特定的资源服务器关联起来,每台资源服务器都有义务验证每个请求,以确定随该请求发送的访问令牌是否用于该台特定的资源服务器。如果不是,资源服务器必须拒绝为相应请求提供服务。客户端和授权服务器可以利用本文档和 [RFC8707] 分别规定的 scope 或 resource 参数,来确定要访问的资源服务器。
此外,访问令牌应该被限制在资源服务器或资源上的特定资源和特定操作。为了实现这一点,授权服务器将访问令牌与相应的资源和操作关联起来,每台资源服务器都有义务验证每个请求,以确定随该请求发送的访问令牌是否用于特定资源上的特定操作。如果不是,资源服务器必须拒绝为相应请求提供服务。客户端和授权服务器可以利用 [RFC9396] 中规定的 scope 和 authorization_details 参数,来确定这些资源和/或操作。