对 JWT 的一些认识
JWT 全称 JSON Web Token,是一个设计规范,这个规范允许我们使用JWT在客户端和服务器之间传递安全可靠的信息。换句话说,服务器接收到JWT之后,可以验证它的合法性。
1. JWT 的组成
JWT本质上是一个字符串,一个完整的JWT由三部分组成,头部(header), 荷载(Payload), 和签名(Signature),中间用.
隔开,如下是一个典型的JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
其中头部和荷载使用了base64编码,分别解码之后得到两个JSON串:
//头部
{
"alg": "HS256",
"typ": "JWT"
}
alg字段为加密算法。
//荷载
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
荷载的字段及含义:
- iss: 该JWT的签发者
- sub: 该JWT所面向的用户
- aud: 接收该JWT的一方
- exp(expires): 什么时候过期,这里是一个Unix时间戳
- iat(issued at): 在什么时候签发的
而第三部分签名则不能使用base64解码出来,该部分用于验证头部和荷载数据的完整性。
2. 如何生成 JWT
- 生成头部header
- 生成荷载payload
- 生成签名signature
signature = encode(base64(header) + '.' + base64(payload), secret) - JWT = header.payload.signatrue
注:encode是header.alg指定的加密算法;secret为**,需要妥善保存。
3. 如何验证一个 JWT 的合法性
在得到一个 JWT 串之后,如何验证它携带的信息是否可靠呢(假设该串为:header.payload.signatyre),我们只需要:
- base64 解码 header 得到加密算法 encode;
- 计算vercode = encode(header.payload, secret);
- 验证 vercode 和 signatyre 是否匹配
4. 应用
JWT可作为Token,用于单点登陆;相比普通的Token,它的优势在于服务器无需使用额外的存储空间来保存Token,因为使用生成JWT时的secret,就可以验证JWT的合法性。
JWT的安全性建立在加密方**的安全性之上。若服务端使用JWT作为Token来鉴别用户身份,而**泄漏的话,得到**的人便可以为任意用户生成合法的Token,进而冒充他们与服务端交互。
下一篇: Java的Arrays类api详解