WHAT - JWT(JSON Web Token)
目录
- 组成格式
- 存储位置
- 如何解析
在如下文章中,我们都提到了 JWT(JSON Web Token):
- WHAT - 用户登录系列(二)- 单点登录 SSO
- WHAT - 用户登录系列(三)- Bearer Token、OAuth 2.0、OIDC、PKCE
我们今天就来介绍一下。
JSON Web Tokens (JWT) 是一种用于在网络应用间安全传递信息的一种简洁的、自包含的方式。JWT可以通过数字签名来验证数据的完整性和来源。
JWT通常用于身份验证和信息交换,特别是在分布式环境中。
组成格式
JWT(JSON Web Token),通常是一个 Base64 编码的字符串,由 三部分 组成:
- Header(头部) - 描述签名算法(alg)、令牌类型(typ)等信息
- Payload(负载) - 包含用户身份信息(如
sub
、name
、email
)、过期时间等 - Signature(签名) - 用于验证 Token 的完整性和真实性。由将 Header 和 Payload 使用指定的算法(如HMAC、RSA等)和密钥(始终存储在服务器上)加密后生成的。
示例:
eyJhbGciOiJSUzI1NiIsImtpZCI6IjE2MzEyMzEyMzEyMzEyMzEyIn0.
eyJpc3MiOiJodHRwczovL2lkcC5leGFtcGxlLmNvbSIsInN1YiI6IjEyMzQ1Njc4OTAiLCJhdWQiOiJteWFwcCIsIm5hbWUiOiJUb20gU21pdGgiLCJlbWFpbCI6InRvbS5zbWl0aEBleGFtcGxlLmNvbSIsImlhdCI6MTYzMDQ5NzYwMCwiZXhwIjoxNjMwNTAxMjAwfQ.
MFLw38F5I1p3o4vUuM35Xly_7RYBRjNwhYF83X...
这个 Token 由三部分组成,以 .
分隔。
以前后端交互为例,在后续服务器拿到前端传过来的 JWT 的验证过程中,服务器会首先对 Header 和 Payload 进行解码,然后使用相同的密钥和算法对 Header 和 Payload 重新进行签名,并与 JWT 中的 Signature 部分进行比对,来验证 JWT 的完整性和真实性。
另外,JWT 可能包含其他的声明,如发行人(issuer)、受众(audience)等。服务器可以根据应用程序的需求来验证这些声明是否符合预期,以进一步确保 JWT 的有效性。
存储位置
一般可以存储在:
- HTTP Cookie(推荐,配合
HttpOnly
和Secure
) - LocalStorage(不推荐,可能被 XSS 攻击窃取)
- SessionStorage(仅限当前会话)
- Memory(内存存储)(适用于前端 SPA 应用)
🔹 安全建议
- 尽量存储在 Cookie 中,并启用
HttpOnly
和Secure
选项,防止 XSS 攻击。 - 避免存储在 LocalStorage,因为它容易被 JavaScript 访问(可能被 XSS 攻击)。
- 若存储在内存中,刷新页面后会丢失 Token(适用于短会话)。
如何解析
前端可以使用 jwt-decode
解析:
import jwtDecode from "jwt-decode";
const idToken = "eyJhbGciOiJSUzI1NiIsImtpZCI6...";
const decoded = jwtDecode(idToken);
console.log(decoded);
📌 输出:
{
"iss": "https://idp.example.com",
"sub": "1234567890",
"aud": "myapp",
"name": "Tom Smith",
"email": "tom.smith@example.com",
"iat": 1630497600,
"exp": 1630501200
}