# JWT
# 是什么
JSON Web Token 是一个非常简单实用的规范,通过它可以在客户端和服务端之前传递安全可靠的数据
# 组成
jwt 由三部分组成,将这三部分用.
连接起来就构成一个 jwt (header.payload.signature)
- 头部(header)
- 载荷(payload)
- 签名(signature)
# header
header 描述 jwt 的基本信息,如类型、签名所用算法等。
{
// 类型为 JWT
"typ": "JWT",
// HS256 算法
"alg": "HS256"
}
对 header 进行 Base64 编码,得到第一部分
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
# payload
payload 是携带数据的地方,我们可以将需要传递到服务端的数据放在 payload 内。
{
// 官方定义了 5 个字标识一些信息
// jwt 签发者
"iss": "god",
// 在什么时候签发
"iat": 1441525213,
// exp 什么时候过期 Unix 时间戳
"exp": 1441525324,
// 接收 jew 的用户
"aud": "xxx@yyy.com"
// jwt 面向的用户
"sub": "xxx@yyy.com"
// 剩下的就可以自己定义了
"userID": 12345,
...
}
依旧 Base64 编码,得到第二部分的字符串和 header 用 .
拼在一起
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0
# signature
签名环节,我们需要提供一个只有你知道的密钥(secret),对连在一起的 header 和 payload 用 HS256
算法加密,得到加密后的字符串,和前面的拼在一起:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM
三部分合体成功!jwt 构造成功!
# 防伪
是否能伪造 jwt 呢?仔细想想就知道,如果你不知道服务端的密钥,手动修改 header 或 payload 的任何部分,得到的 Base64 编码就不一样了,新的编码经过密钥生成的签名肯定和旧的不同。没有正确的签名,服务器会直接返回错误。
服务器验证一个 jwt 的过程也很简单:
- 收到 jwt
- 将 header 和 payload 用密钥和对应的算法签名
- 判断生成的签名和 jwt 第三部分是否一致
- 不一致则返回错误,一致则表示 payload 内的数据可信
# 总结
jwt 的核心就是密钥,拥有密钥就拥有生成 jwt 的权利(千万不能泄露)
payload 中的数据不是加密的,不要放敏感数据