如何安全处理认证令牌

安全管理认证令牌(访问令牌和刷新令牌)的最佳实践 │ 适用于不同应用类型(Web、移动端、服务器端),涵盖存储、│ 传输、过期和撤销等环节。

Intermediate

安全处理认证令牌对应用程序安全至关重要。最佳方案通常取决于应用类型(网页、移动端、服务器端)及所用令牌类型(访问令牌、刷新令牌)。

以下是安全处理认证令牌的通用原则与最佳实践:

通用原则

  • 保密与安全:将令牌视为敏感凭证,令牌签名密钥仅应向必需的服务披露。
  • 采用HTTPS协议:始终通过安全HTTPS连接传输令牌,防止数据被截获。
  • 最小化有效负载中的敏感数据:令牌有效负载中切勿包含敏感用户数据,因令牌即使经过签名也易被解码。
  • 设置短效期:为访问令牌设定短效期(数分钟至数小时),以限制令牌遭泄露时攻击者的可利用时间窗口。
  • 避免硬编码:切勿在应用程序中硬编码令牌或以明文形式存储令牌。

按应用类型划分的令牌存储方案

1. Web应用程序

  • 内存存储(适用于单页应用的访问令牌):将访问令牌存储在浏览器内存中被视为安全方案,可规避文件系统存储相关风险。可通过JavaScript闭包或Web Workers实现,这些机制在独立的全局作用域中运行。但需注意内存存储的令牌会在页面刷新或关闭标签页时丢失。
  • 安全HttpOnly Cookie(刷新令牌及传统Web应用)
    • 刷新令牌应使用带SameSite属性(Lax或Strict)的安全HttpOnly Cookie。此类Cookie无法被客户端JavaScript访问,可降低跨站脚本攻击风险。
    • 传统服务器渲染的Web应用建议将令牌存储在服务器端以实现最高安全性。若必须使用客户端存储,请采用加密的会话Cookie。
  • 避免使用本地存储和会话存储:切勿将敏感令牌存储在localStoragesessionStorage中,因其易受跨站脚本攻击(XSS)威胁。

2. 移动应用(iOS与Android)

  • 平台专属安全存储:利用操作系统的安全存储机制。
    • iOS:使用钥匙串(Keychain)。
    • Android:使用密钥库(KeyStore)或Android内部数据存储。
    • 这些机制旨在保护敏感数据,防止令牌被设备上其他应用程序窃取。

3. 服务器端应用

  • 服务器端存储:对于后端执行API调用的应用,令牌应存储在服务器端。此方案提供最高安全级别,因令牌不会暴露给客户端。
  • 加密存储:若需持久化存储令牌,应在数据库或文件系统中对其进行静态加密。

令牌管理最佳实践

  • 刷新令牌:使用刷新令牌获取新的短效访问令牌,避免用户频繁重新认证。 刷新令牌应具有较长有效期,采用安全存储方式(如HttpOnly Cookie),并建议在使用后定期轮换。
  • 令牌撤销:制定令牌撤销策略,尤其针对刷新令牌,在令牌泄露或用户注销时立即执行撤销。
  • 最小声明原则:为保障性能与安全性,令牌有效负载中仅包含绝对必要的声明。
  • 时钟偏差容忍:验证基于时间的声明(如过期时间)时,应允许少量时钟偏差(数秒级),以应对服务器间微小的时间差异。
  • 后端为前端服务(BFF)模式:针对单页应用(SPAs),建议采用后端为前端服务(BFF)模式,由后端处理令牌获取与存储,充当单页应用与认证服务器之间安全的中介层。