jwt身份认证

2022-10-25  本文已影响0人  wuqingfeng

JWT(JSON Web Tokens) 是一个开放的标准(RFC 7519)定义的一种简洁的、自包含的方法,用于通信双方之间以 Json 对象的形式安全的传递信息。

1 JWT结构

JWT由header、payload、signature三部分组成。


850498-20200320133305475-1970269555.jpg

对它们更详细的描述如下:

1.1 header

jwt 的头部承载两部分信息:

{
    "typ": "JWT",
    "alg": "HS256"
}

然后将头部进行 base64 编码,构成了第一部分。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

1.2 payload

有效载荷就是存放有效信息的地方,这些有效信息包含三个部分:

iss:jwt签发者
sub:jwt所面向的用户
aud:接收 jwt 的一方
exp:jwt的过期时间,这个过期时间必须要大于签发时间
nbf:定义在什么时间之前,该jwt都是不可用的.
iat:jwt 的签发时间
jti:jwt 的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
{
    "sub": "1234567890",
    "name": "John Doe",
    "admin": true
}

然后将其进行 base64 编码,得到 Jwt 的第二部分:

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

1.3 signature

创建签名需要使用编码后的 header 和 payload 以及一个秘钥,使用 header 中指定签名算法进行签名。例如如果希望使用 HMAC SHA256 算法,那么签名应该使用下列方式创建:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

secret 是保存在服务器端的,jwt 的签发生成也是在服务器端的,secret 就是用来进行 jwt 的签发和 jwt 的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个 secret, 那就意味着客户端是可以自我签发和验证 jwt 了。
碰到 JWT token 可以去 JWT 官网解密看看,下面这是官网解密出来的数据,可以很清楚的看到它的三部分内容:

碰到 JWT token 可以去 JWT 官网解密看看,下面这是官网解密出来的数据,可以很清楚的看到它的三部分内容:


image.png

2. JWT使用

JWT在实际应用流程如下:


850498-20200320133306091-1592499456.jpg

其中,因为JWT加密算法如HMAC为信息摘要算法,所以第5步check jwt signature的过程应当为重新计算signature并比对的过程。

上一篇 下一篇

猜你喜欢

热点阅读