JWT(JSON Web Token)与SAML(安全断言标记语言)的区别

2024年10月5日 | 阅读 9 分钟

引言

JWT 是 JSON Web Token 的缩写,而 SAML 是 Security Assertion Markup Language 的缩写。它们是当代 Web 应用程序中最广泛使用的两种身份验证机制,用于验证用户身份以及向用户提供必要的资源访问权限。尽管它们的性质相似,但在结构、功能和适用性方面,它们的建立方式有所不同。JWT(JSON Web Token)是一种小型、URL 安全的传输信息的方法,通过一组声明在两个方之间进行信息传输。这种身份验证方法通常用于 RESTful API 进行无状态身份验证,并且可以无缝地集成到不同的平台。同时,SAML 是一种基于 XML 的架构,主要用于实现企业的单点登录(SSO)。它比 IdP 到 SP 的标准身份验证流程要复杂得多。区分 JWT 和 SAML 并选择正确的方法来妥善保护应用程序资源,同时实现最佳的性能和可用性结果,这一点非常重要。

什么是 JWT?

JWT(JSON Web Token) 指的是一种令牌格式,它紧凑、URL 安全,并用于在各方之间根据 JSON 结构传递信息。它广泛用于 Web 身份验证和授权程序中,特别是在资源丰富的 RESTful API 中。JWT 由三部分组成:头部(header),包含有关令牌内容的元数据;载荷(payload),包含实际数据;以及签名(signature),用于验证令牌内容的完整性。头部表明令牌的类型以及使用的哈希算法,而载荷包含声明或数据,签名则确保令牌未被篡改。JWT 也是无状态的,这使得它们能够在没有服务器端状态或存储的系统上工作,并且具有可伸缩性。

JWT 的特性

  • 紧凑且 URL 安全: JWT 体积小。因此,它适用于通过 HTTP 传输,并且可以轻松集成到 URL、头部或 Cookie 中。
  • 自包含: JWT 或 JSON Web Token 格式允许将重要且相关的数据编码并存储在令牌中,因此无需服务器端会话管理。正因如此,它在无状态身份验证中非常有用。
  • 基于 JSON: 令牌以 JSON 格式表示,这种格式简单易懂,并且可以用任何语言轻松进行编码和解码。
  • 声明(Claims): JWT 包含声明,它们是键值对,用于传达客户端详细信息和其他实用信息。需要注意的是,声明可以根据应用程序的需求进行创建或自定义。
  • 安全: 我们通常使用 HMAC 或 RSA 方法对 JWT 进行签名,以保护令牌中包含的信息。这也能确保没有人可以通过修改附加在其上的签名来篡改令牌。
  • 可扩展: 对于应用程序可能需要的额外信息,JWT 可以根据 JWT 的上下文添加自定义声明。
  • 互操作性: 使用 JWT 是不受供应商限制的,可以应用于任何平台和编程语言,这很有益。
  • 过期和撤销: JWT 可以包含过期时间(exp 声明)。这样,JWT 可以在规定时间后轻松过期,从而使 JWT 的安全特性令人印象深刻。然而,撤销通常需要额外的机制,因为前面提到的 JWT 是无状态的。

JWT 的缺点

  • 令牌大小: JWT 非常紧凑,但如果令牌中包含许多声明或较长的加密密钥,它可能会变得非常大。这可能导致使用大量带宽以及在给定时间内传输的数据量较小等问题。
  • 无状态特性: JWT 是无状态且自给自足的,这意味着与 SID 不同,没有一键式方法可以撤销在过期之前已颁发的令牌。如果令牌被泄露,这可能是一个问题,因为它在自行过期之前仍然是一个有效令牌。
  • 安全风险: 如果部署不当,JWT 存在令牌被篡改、算法欺骗(none 算法)以及暴露敏感且未充分加密信息的风险。
  • 无内置撤销机制: 与服务器端存储支持撤销的其他会话类型相比,JWT 只能通过一些额外的机制(如黑名单、较短的令牌过期时间等)来提前撤销令牌,这些是 JWT 的一些缺点。
  • 长期有效的令牌: 这意味着如果 JWT 令牌被盗,攻击者将有充足的时间来利用该令牌,如果它的过期时间很长。另一方面,使用短期有效的令牌可能会导致用户频繁重新验证,从而可能对效率产生负面影响。
  • 负载过重: 将更多数据添加到载荷中可能导致令牌膨胀,这意味着载荷变大,从而降低其性能,尤其是在移动或低带宽环境中使用时。
  • 实现复杂性: 尽管 JWT 的概念相对简单,但围绕它的 pitfalls 很多,例如不正确的签名、使用不安全的传输协议以及对声明的错误检查;如果实现不当,后者可能导致漏洞的存在。
  • 不原生支持刷新令牌: JWT 没有刷新令牌属性,因此,使用 JWT 的应用程序的开发人员必须设计自己的机制来处理令牌过期时需要创建新令牌以继续会话的情况。

什么是 SAML?

SAML(Security Assertion Markup Language) 是一种基于 XML 的开放标准,它允许在两个方之间交换身份验证和授权数据,这两个方通常是身份提供者(IdP)和服务提供者(SP)。它广泛用于企业网络中的单点登录(SSO),因为它允许用户使用单个凭据登录多个应用程序。SAML 通过 IdP 发出声明给 SP,从而简化了安全通信过程,用户无需再次登录。SAML 最适用于多个组织、系统以及高度正式化组织的结合场景。

SAML 的特性

  • 单点登录(SSO): SAML 支持单点登录,用户只需提供一次凭据即可访问多个应用程序或服务,这对用户来说非常高效。
  • 联合身份管理: 联合意味着属于不同组织或域的用户可以向身份提供者(IDP)进行身份验证,并可以向服务提供者(SP)请求服务。
  • 基于 XML: SAML 是基于 XML 开发的,这使得两个方之间的身份验证和授权数据交换更加结构化。
  • 安全数据交换: 通过集成数字签名和加密,SAML 中的声明是受保护且安全的。
  • 互操作性: SAML 的另一个优点是它与许多平台和应用程序兼容。它可以连接现代企业中广泛的不同系统。
  • 基于属性的访问控制(ABAC): 声明可以包含用户属性,以便根据用户的各种参数建立详细的访问级别。
  • 广泛采用的标准: SAML 正在不断发展,并且非常受欢迎,尤其是在大型公司中,它得到了行业的大力支持以及许多集成。
  • 减少密码疲劳: SAML 有助于减少为不同服务使用多个密码的需要,从而使用户更安全、更方便。

SAML 的缺点

  • 复杂性: 主要缺点之一是 SAML 是一个相当复杂的协议,其实现和维护需要大量精力,即使对于小型非企业应用程序也是如此。
  • XML 开销: SAML 使用 XML 格式,该格式可能相当庞大且笨重,因此可能需要更多带宽,并且与 JWT 等相比,处理时间更长。
  • 需要信任关系: SAML 依赖于建立和维护身份提供者(IdPs)和服务提供者(SPs)之间的信任,这可能会出现问题,尤其是在去中心化环境中。
  • 灵活性较低: 然而,SAML 的灵活性不如其他现代协议,因此,将其用于新应用程序或用例或微服务时会更加困难。
  • 会话管理挑战: SAML 本身不一定包含会话控制的方法。因此,会话功能(如跨多个服务的注销)可能具有挑战性,并且跨平台实现不同。
  • 不适合 API: 然而,由于其基于 XML 的支持以及在当今现代 Web 开发中普遍存在的基于浏览器的重定向因素,SAML 不适合 RESTful API 或移动应用程序开发。
  • 可伸缩性问题: 该方案的一个显著优点是易于实现,并且在大规模应用时具有良好的可伸缩性,但大规模应用程序中的 SAML 可能会消耗大量资源;例如,在解析 XML 和执行加密时,它会消耗更多的 CPU 时间和空间。
  • 在小型企业中采用缓慢: 因此,SAML 的普及不快,因为公司需要时间来采用它,并且它消耗大量资源,对于小型企业来说,集成 SAML 实现可能很麻烦,它们更倾向于选择更简单、更便宜的 OAuth 方法。

JWT 和 SAML 的十大区别

Difference between JWT and SAML
方面JWT(JSON Web Token)SAML(Security Assertion Markup Language)
定义JWT 使用紧凑且 URL 安全的 JSON 来减小其大小,从而更容易通过 HTTP 传输。SAML 使用 XML 结构来构建其消息,该结构经历了大量的扩展,使得其消息在字节大小上很大,并且需要更多的带宽才能通过。
主要用例JWT 主要用于 RESTful API 和微服务的无状态身份验证,令牌交换可以轻松进行,无需涉及服务器会话。SAML 主要用于单点登录(SSO),用户无需手动多次登录即可进行身份验证并访问组织内的不同应用程序。
令牌结构JWT 由三部分组成:头部、载荷和签名,所有这些都会被转换为易于解析的字符串,适用于跨不同平台使用。SAML 消息以 XML 形式存在,其中包含断言、请求和响应,使得消息在处理过程中变得复杂。
传输JWT 作为单个字符串传递,并且在大多数情况下用作头部,因此设计得灵活且紧凑,适用于移动和 Web 应用程序。SAML 消息通常使用 HTTP POST 绑定;这涉及重定向和表单提交,在身份验证情况下可能会耗时。
令牌撤销传统的 JWT 令牌不存储状态信息,因此不原生支持撤销;可以使用辅助机制,如黑名单或短过期时间。在 SAML 中,提供基于会话的身份验证,因此令牌撤销变得更容易,并且可以获得更好的 IdP 管理的会话。
实现复杂性JWT 在当今的应用程序中相对容易使用,并且在不同的编程语言和环境中得到了很好的采纳。SAML 比前者稍微复杂一些,因为它需要设置身份提供者(IdP)和服务提供者(SP)之间的信任关系。
安全性JWT 在正确保护时可能会出现问题;例如,存在令牌篡改或加密不当等问题,必须加以重视。SAML 特别具有强大的身份验证方法,如数字签名和加密,在大多数企业级应用程序中提供高级别的安全性。
互操作性JWT 是平台无关的,可以轻松集成到不同的系统中,尤其是在具有微服务架构的分布式环境中。SAML 在企业环境中得到了广泛支持,但在与较新、非企业系统集成时,互操作性可能面临挑战。
会话管理JWT 不支持原生会话管理,这可能导致跨分布式系统管理用户会话时出现潜在挑战。SAML 内在地支持会话管理,允许用户登录一次并在多个应用程序之间安全地保持会话。
可扩展性JWT 由于其无状态特性,具有高度的可伸缩性,非常适合分布式系统和云架构。SAML 对 XML 的依赖以及对信任关系的需求,可能会使大规模、去中心化环境的可伸缩性更具挑战性且资源消耗更大。

结论

因此,我们可以得出结论:虽然 JWT 和 SAML 都用于身份验证和授权目的,但它们在不同的环境中满足不同的需求和功能。JWT 因其小巧和统一的特性,特别适用于新的无状态应用程序。因此,它可用于 RESTful API 和微服务。另一方面,SAML 适用于需要高级单点登录和联合身份管理能力的企业场景。尽管 JWT 具有可伸缩性和集成简单性的优势,但 SAML 可以提供丰富的安全性以及会话管理选项。通过了解这些特性和缺点,可以更容易地根据应用程序的需求和系统基础架构选择最佳方案。


下一个主题3G与4G技术区别