jwt全名是JSON Web Token,是一种开放标准
jwt由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
- 头部(Header) Base64编码:头部包含两段信息,分别是类型(type),和签名(alg)。类型用于声明这是一个jwt,而加密算法则规定了用于加密和解密的算法 -> 通常是HMAC SHA256加密算法。头部经过Base64编码后,形成头部字符串。
- 载荷(Payload)Base64编码:载荷分为三个部分:标准中注册的声明、公共的声明和私有的声明。JWT 官方规定了 7 个字段(标准中注册的声明),可供使用:
-
- iss (Issuer):签发者。
- sub (Subject):主题。
- aud (Audience):接收者。
- exp (Expiration time):过期时间。
- nbf (Not Before):生效时间。
- iat (Issued At):签发时间。
- jti (JWT ID):编号。
而公共的声明和私有的声明则是根据实际需求进行自定义的。
载荷经过Base64编码后,形成载荷字符串。
- 签名(Signature) :签名是使用头部和载荷经过哈希运算后得到的结果,用于验证JWT的真实性和完整性。 签名是通过将头部和载荷字符串拼接在一起,并使用密钥进行哈希运算得到的。这个签名与头部和载荷一起构成了完整的JWT。通过签名,可以验证这个JWT是否被篡改过。
签名是jwt的关键,因为头部和载荷其实并没有被加密,真正通过加密算法生成的是签名。服务端通过利用它存储的密钥解密来看头部和载荷是否与签名解密出来的头部和载荷相同,从而判断是否正确。
例子: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
- 头部(header) :eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9,Base64编码后表示的头部信息是 {"alg": "HS256", "typ": "JWT"} ,表明使用了HS256算法进行签名。
- 载荷(payload) :eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ,Base64编码后表示的载荷信息是 {"sub": "1234567890", "name": "John Doe", "iat": 1516239022} ,包含了用户ID、用户名和令牌的签发时间等信息。
- 签名(signature) :SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c,使用HS256算法对头部和载荷进行签名后得到的结果,用于验证JWT的完整性和真实性。
使用: 一般就是登录时服务端通过密钥和用户的信息生成jwt并以token的形式返回给客户端,以后客户端发送请求时都会将这段token携带到请求头上发送到服务端,服务端再根据密钥来判断这段token是否是有效的。
综上,我想你对什么是jwt有了一定的了解,那么他的优缺点应该也更好理解了。