jwt
JWT 解决什么问题?
JWT的主要目的是在服务端和客户端之间以安全的方式来转移声明。主要的应用场景如下所示:
- 认证
Authentication; - 授权
Authorization; - 联合识别;
- 客户端会话(无状态的会话);
- 客户端机密。
名词解释
JWS:Signed JWT签名过的jwtJWE:Encrypted JWT部分payload经过加密的jwt;目前加密payload的操作不是很普及;JWK:JWT的密钥,也就是我们常说的scret;JWKset:JWT key set在非对称加密中,需要的是密钥对而非单独的密钥,在后文中会阐释;JWA:当前JWT所用到的密码学算法;nonsecure JWT:当头部的签名算法被设定为none的时候,该JWT是不安全的;因为签名的部分空缺,所有人都可以修改。
JWT 组成
一个通常你看到的jwt,由以下三部分组成,它们分别是:
header:主要声明了JWT的签名算法;payload:主要承载了各种声明并传递明文数据;signture:拥有该部分的JWT被称为JWS,也就是签了名的JWS;没有该部分的JWT被称为nonsecure JWT也就是不安全的JWT,此时header中声明的签名算法为none。
Header
1 | |
Payload
1 | |
payload通常由三个部分组成,分别是Registered Claims;Public Claims;Private Claims;
Registered Claimsiss【issuer】发布者的url地址sub【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud【audience】接受者的url地址exp【expiration】该jwt销毁的时间;unix时间戳nbf【not before】该jwt的使用时间不能早于该时间;unix时间戳iat【issued at】该jwt的发布时间;unix 时间戳jti【JWT ID】该jwt的唯一ID编号
Public Claims这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。
Signature
Signature部分是对前两部分的签名,防止数据篡改。- 首先,需要指定一个密钥(
secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用Header里面指定的签名算法(默认是HMAC SHA256),按照下面的公式产生签名。1
2
3
4HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret) - 算出签名以后,把
Header、Payload、Signature三个部分拼成一个字符串,每个部分之间用”点”(.)分隔,就可以返回给用户。
jwt
http://mybestcheng.site/2022/11/20/authenticate/jwt/