什么是JWT?
JWT,全称为JSON Web Token,是一种用于在网络应用之间安全传递信息的开放标准。JWT最常用于身份验证和非敏感数据的传递。它的设计目标是让信息在各方之间传递时不需要存储服务器状态(无状态传递),并且能够安全地传递给受信任的接收方。
JWT的基本结构
JWT通常由三部分组成,分别用**点(.)**连接:Header(头部)、Payload(载荷)和Signature(签名)。
1. Header(头部)
JWT的头部包含令牌的元数据,常见的有两项:
typ: 表示令牌的类型,通常为“JWT”。
alg: 指定签名算法,常用的有HS256(HMAC SHA-256)、RS256(RSA SHA-256)等。
例如,头部可能是:
{
"alg": "HS256",
"typ": "JWT"
}
2. Payload(载荷)
载荷部分包含了JWT的声明。JWT有三种声明类型:
注册声明(Registered Claims):这些是预定义的字段,比如sub(主题,即用户ID)、name(用户名)、iat(签发时间)等。
公共声明(Public Claims):自定义的声明,可以用于传递应用程序特定的信息,但需避免冲突。
私有声明(Private Claims):自定义声明,通常用于双方间的通信,JWT规范并未对其定义,通常只在特定应用中使用。
例如,载荷部分可以包含如下信息:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
3. Signature(签名)
签名部分用于验证JWT的有效性,防止被篡改。它是通过对Header和Payload进行Base64编码后,将它们连接在一起,用header中声明的加密算法(如HS256)以及一个服务器端存储的密钥(Secret)进行加盐加密生成的。
生成签名的过程如下:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret)
注意: secret
是服务器端的私密信息,不应暴露给客户端。一旦客户端知道了这个密钥,便可以伪造JWT。
JWT的加密方式
对称加密(Symmetric Encryption)
常见的对称加密算法有HS256,它使用单一的密钥进行加密和解密操作。只有知道密钥的实体才能验证JWT是否被篡改。
非对称加密(Asymmetric Encryption)
非对称加密算法(如RSA)使用公钥和私钥。公钥用于加密数据,而私钥用于解密数据。JWT也可以使用非对称加密算法进行签名。这种方法通常用于**单点登录(SSO)**等复杂系统中,能够简化身份验证和授权的过程。
JWT的应用场景
JWT的主要应用场景是身份认证和授权。它常用于API身份验证、OAuth2.0身份验证等,适用于分布式系统中,尤其是无状态的应用和微服务架构中。
例如,JWT可以用在以下场景:
用户登录认证:用户登录时,服务器生成JWT并发送给客户端,客户端可以在后续请求中携带JWT进行身份验证。
API身份验证:服务器通过验证JWT来确定请求者的身份,从而允许访问API资源。
单点登录(SSO):利用JWT,用户只需一次登录便可在多个系统之间共享身份信息。
JWT与其他身份认证方式的对比
1. 基于Cookie的Session认证
传统的Session认证方式通过服务器端存储用户的会话状态(Session ID),而JWT采用无状态的方式,所有信息都包含在JWT本身。相比之下,JWT不需要在服务器端维护会话数据,这使得它更适合分布式和微服务架构。
2. API认证
JWT广泛用于RESTful API认证。在API认证中,JWT作为Authorization头部的一部分传递,使用Bearer Token的方式传递JWT,服务器通过验证JWT来认证用户身份。
JWT的优缺点
优点
无状态性:JWT不需要在服务器端存储会话信息,减少了服务器负担。
跨平台:由于JWT是基于JSON格式的,可以方便地在不同的应用之间传递。
易于扩展:可以在JWT的Payload中自定义字段,支持灵活扩展。
缺点
不加密:JWT默认不加密,因此任何人都可以解码JWT,获取其中的信息。为了确保安全,JWT只用于传递非敏感信息,或需要额外的加密措施。
Token泄漏风险:如果JWT被截获,攻击者可以利用其进行伪造身份。因此,必须通过HTTPS等方式确保Token的传输安全。
JWT的安全性:加密与签名
JWT的签名用于确保数据的完整性和防止篡改,但并不加密载荷数据。如果需要保护数据的隐私性,可以使用**JWE(JSON Web Encryption)**进行加密。
JWS(JSON Web Signature):对数据进行签名,确保数据未被篡改,但不加密数据。
JWE(JSON Web Encryption):对数据进行加密,同时签名,确保数据的隐私性和完整性。