JWT生成的token的构成部分
JWT(JSON Web Token)生成的Token由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),各部分通过英文句点.
连接。以下是具体内容及作用解析:
1. 头部(Header)
- 作用:声明Token类型和签名算法。
- 内容:
typ
:固定为"JWT"
,表示Token类型。alg
:签名算法,如HS256
(HMAC SHA256)、RS256
(RSA SHA256)等。
- 编码方式:JSON对象通过Base64URL编码为字符串,例如:
{"alg": "HS256", "typ": "JWT"} // 编码后:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
2. 载荷(Payload)
- 作用:携带用户信息及声明(Claims),包括标准字段和自定义数据。
- 内容:
- 标准声明(官方建议但不强制使用):
iss
(Issuer):签发者(如服务端域名)。sub
(Subject):主题(如用户ID)。aud
(Audience):接收方(如客户端应用ID)。exp
(Expiration Time):Token过期时间(Unix时间戳)。nbf
(Not Before):生效时间。iat
(Issued At):签发时间。jti
(JWT ID):唯一标识。
- 自定义声明:开发者可添加业务相关字段,如用户角色、权限、用户名等。例如:
{"userId": 123, "role": "admin"} // 编码后:eyJ1c2VySWQiOjEyMywicm9sZSI6ImFkbWluIn0
- 标准声明(官方建议但不强制使用):
- 编码方式:JSON对象通过Base64URL编码,但不加密(明文可见)。
3. 签名(Signature)
- 作用:验证Token完整性和真实性,防止篡改。
- 生成方式:
- 拼接编码后的Header和Payload:
base64UrlEncode(Header) + "." + base64UrlEncode(Payload)
。 - 使用Header中声明的算法(如
HS256
)和服务器端密钥(Secret Key)加密生成签名。
// 示例:使用HMAC SHA256生成签名 signature = HMACSHA256(headerBase64 + "." + payloadBase64, secretKey);
- 拼接编码后的Header和Payload:
- 验证方式:服务端用相同算法和密钥重新计算签名,与Token中的签名比对是否一致。
完整Token示例
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywicm9sZSI6ImFkbWluIiwiaWF0IjoxNzM1NDc4MDA1fQ.GromRG7kK90UfU_Q5iOSHs_xE-zSk0e0HLHqJQUjYMU
- 分解:
- 头部:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
(解码后为{"alg":"HS256","typ":"JWT"}
)。 - 载荷:
eyJ1c2VySWQiOjEyMywicm9sZSI6ImFkbWluIiwiaWF0IjoxNzM1NDc4MDA1fQ
(解码后包含用户ID、角色、签发时间)。 - 签名:
GromRG7kK90UfU_Q5iOSHs_xE-zSk0e0HLHqJQUjYMU
。
- 头部:
注意事项
- 敏感信息:Payload内容未加密,避免存储密码等敏感数据。
- 有效期:通过
exp
字段控制Token过期时间,建议设置较短的有效期(如2小时)。 - 密钥安全:签名密钥(Secret Key)必须严格保密,泄露将导致Token可被伪造。
如需生成或验证JWT,可使用工具库如Java的JWTUtil
(Hutool)、Node.js的jsonwebtoken
或Python的PyJWT
。