JWT(JSON Web Token)是一种用于安全传输信息的开放标准(RFC 7519)。它被广泛应用于身份认证和授权场景。JWT的主要特点是它的 compact(紧凑)和 self-contained(自包含)特性。以下是对JWT的详细介绍:
1. JWT结构
JWT由三部分组成,用.
(点)分隔开:
-
Header(头部):描述JWT的元数据,通常包括令牌的类型(JWT)和所使用的签名算法(如HS256、RS256等)。
{ "alg": "HS256", "typ": "JWT" }
经过Base64Url编码后,Header部分看起来像这样:
eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9
-
Payload(负载):包含要传递的数据(声明)。这些数据可以是关于实体的信息(例如用户ID),也可以是其他元数据。声明分为三类:
- 注册声明(Registered Claims):预定义的声明,例如
iss
(发行者)、exp
(过期时间)等。 - 公共声明(Public Claims):可以自定义,但需要避免与其他应用程序冲突。
- 私有声明(Private Claims):用于在应用程序之间传递信息,可以是应用程序自定义的。
例如:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
经过Base64Url编码后,Payload部分看起来像这样:
eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9
- 注册声明(Registered Claims):预定义的声明,例如
-
Signature(签名):用于验证消息的完整性。根据Header中指定的算法和密钥对Header和Payload部分进行签名,生成签名部分。签名过程如下:
- 使用Header和Payload部分的Base64Url编码结果,连接成一个字符串。
- 使用指定的算法(例如HMAC SHA256)和密钥对这个字符串进行签名。
- 将签名结果进行Base64Url编码。
例如,使用HMAC SHA256算法:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
生成的签名部分看起来像这样:
cZbT7iT2NedIf-FenDsbWo0IGJ3kY57TYPkuNAA0bSM
2. JWT的使用
-
认证:JWT常用于用户认证。用户登录后,服务器生成一个JWT并返回给用户,用户在后续请求中将JWT包含在请求头中,服务器验证JWT以确认用户身份。
-
授权:JWT还可以用于授权。可以在JWT中包含用户的角色和权限信息,以控制用户访问特定资源。
3. JWT的优点
- 自包含:JWT包含了所有信息,无需额外的数据库查询。
- 可扩展性:可以根据需要自定义声明。
- 跨域支持:JWT可以在不同的域之间传递(例如不同的微服务)。
4. JWT的安全性
- 签名:确保JWT未被篡改。
- 过期时间:可以通过设置
exp
(过期时间)来限制JWT的有效期。 - 加密:JWT通常是未加密的,敏感信息应谨慎放入JWT中。可以使用JWE(JSON Web Encryption)来加密JWT。
5. JWT的缺点
- 不可撤销:JWT一旦签发,直到过期之前无法撤销,可能导致安全隐患。
- 大小:JWT较大时,可能影响网络传输性能。
6. 示例
假设我们有一个用户登录系统,用户成功登录后,服务器生成一个JWT,并将其返回给用户。用户在每次请求中都带上这个JWT,服务器通过验证JWT来识别用户身份并确定访问权限。
希望这个介绍能帮助你更好地理解JWT。如果你有任何具体问题或需要更详细的信息,随时告诉我!