什么是 JSON Web Token(JWT)?
JSON Web Token(JWT)是一种用于在web上传递信息的标准,它以JSON格式表示信息,通常用于身份验证和授权。
JWT由三个部分组成:Header(头部)、Payload(负载)和Signature(签名)。它们用点号分隔开,形成了一个JWT令牌。
JWT 的基本结构
- Header
Header(头部)是JWT结构的第一部分,它是一个包含关于令牌的元数据的JSON对象。Header通常包含两个主要字段:alg
和 typ
。
alg
(Algorithm)字段:这个字段指定了用于签名JWT的加密算法。它可以是以下之一:
HS256
:HMAC-SHA256,使用密钥进行对称加密。RS256
:RSA-SHA256,使用RSA密钥对进行非对称加密。ES256
:ECDSA-SHA256,使用椭圆曲线数字签名算法进行非对称加密,等等。
typ
(Type)字段:这个字段表示令牌的类型。对于JWT,这个字段的值通常是**JWT
**,用于指示这是一个JSON Web Token。
一个简单的 JWT 头可以是下面这样:
{
"typ":"JWT",
"alg":"HS256"
}
- Payload
Payload(负载)用于存储实际的用户数据和其他相关信息。Payload是一个包含键值对的JSON对象,它包含了有关JWT令牌的有用信息。
JWT 规定了7个官方字段:
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
除了官方字段,你还可以在这个部分定义私有字段,一个Payload如下所示:
{
"userId":"123",
"iss": "your_app",
"sub": "user123",
"role": "admin",
"exp": 1699999999
}
- Signature
JWT的Signature(签名)是JWT令牌的第三个部分,用于确保令牌的完整性和来源验证。Signature是通过将Header和Payload的组合(不包括分隔符**.
**)与一个密钥进行加密或哈希生成的值。
Signature生成方式:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)