2024年9月24日

CAS与JWT的区别

作者 高劲松

CAS和JWT的主要区别在于它们的认证机制、数据存储位置、适用场景以及安全性方面。

  1. 认证机制和数据存储位置‌:
    • CAS(Central Authentication Service)是一种基于代理票据的单点登录(SSO)认证系统。它通过一个中心认证服务器来管理用户的登录状态和授权信息,各个应用服务器都与该中心认证服务器进行通信。用户信息存储在服务端的session中‌12。
    • JWT(JSON Web Token)则是一种开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,在各方之间安全地传输信息作为JSON对象。在JWT的认证机制中,用户信息以token的形式存在客户端,通常存储在本地存储或HTTP header中‌23。
  2. 适用场景‌:
    • CAS更适合于大型企业或组织,其中存在多个应用服务器,需要一个中心化的认证服务来管理用户的登录状态。CAS的部署和维护成本相对较高,因为它需要一个独立的认证服务器和客户端的配置‌12。
    • JWT则更适合于微服务架构或分布式系统,因为它可以轻松地在不同的服务之间传递用户身份信息,且不需要中心化的认证服务。JWT的优点包括跨域使用、无需服务器存储状态等‌2。
  3. 安全性‌:
    • CAS的安全性依赖于中心认证服务器的安全配置,包括防止SQL注入、XSS攻击等。用户信息存储在服务端,相对较难被篡改‌1。
    • JWT的安全性依赖于数字签名,通过在JWT生成时添加签名,并在验证时检查签名的完整性来确保token未被篡改。JWT是自包含的,包含了所有必要的信息,因此可以轻松地在不同服务之间传递‌23。

综上所述,CAS和JWT各有其优势和适用场景。选择使用哪一种技术取决于具体的应用需求、系统架构以及安全要求等因素‌

CAS – Central Authentication Server

CAS 全称 Central Authentication Server,也称作中央认证服务,是支持 JWT 的。

其分为两个部分:CAS 服务端(CAS Server) 和 CAS 客户端(CAS Client)。服务端负责认证工作,独立部署;客户端负责处理访问请求,需要登录时,重定向到服务端。

认证流程

  1. 浏览器向客户端请求提供某个受保护的资源。
  2. 重定向到服务端进行认证
  3. 用户进行身份认证
  4. 服务端生成票据
  5. 客户端向服务端验证票据
  6. 验证成功返回用户信息

02

JWT – JSON Web Token

JWT 是一种用于在两方之间安全地表示声明的方法,是 token 思想的一种实现方式。

组成部分

本质上就是一个字符串,但是其带有签名信息,接收后可以校验是否正确或是否被篡改等。JWT 组成分为三个部分,每个部分用点号连接,像是这样:

HEADER.PAYLOAD.SIGNATURE
 
  1. HEADER:用于声明 算法 和 token 类型,alg 表明算法是 HS256,typ 表明类型是 JWT,如下:
{
  "alg": "HS256",
  "typ": "JWT"
}
 
  1. PAYLOAD:存放所需传递的数据,有默认字段也可以自定义私有字段(这是未加密的,仅进行了编码,只能传递非敏感的信息),如下:
{
    // 自带的默认字段
    "iss": "发行人",
    "exp": "到期时间",
    "sub": "主题",
    "aud": "用户",
    "nbf": "在此之前不可用",
    "iat": "发布时间",
    "jti": "ID用于标识JWT",
    // 自定义的字段
    "name": "Tom",
    "admin": true
}
 
  1. VERIFY SIGNATURE:结构如下,将 HEADER 、PAYLOAD 、secret密钥 三个部分分别进行 base64UrlEncode 的操作(secret 可以不 encode),然后使用自己所选的算法(在 HEADER 中指定)进行计算,得出的结果便是此部分的内容。
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload) + "." +
  secret 或者 base64UrlEncode(secret)
) 
 

认证流程

1. 客户端(浏览器)向服务端发送账号密码请求登录

2. 服务端校验账号密码并生成 JWT Token 将其返回

3. 客户端(浏览器)保存 JWT Token,下次需要请求时将其携带

4. 服务端校验 JWT Token 信息(像 VERIFY SIGNATURE 部分一样进行相同操作,取出 header 和 payload 并加上 secret 一同进行 encode,然后比对此部分是否一致),然后验证有效性、是否过期等等,通过后返回业务数据

5. 客户端(浏览器)收到业务数据,进行处理并使用