jwt是什么?
全称:Java Web Token
是一种标准,一般用来在登录用户和身份信息验证之间进行信息认证。这个token可以用于认证。JWT是基于Json的一个公开规范,它允许我们在用户和服务器之间传递安全可靠的信息
JWT的使用流程是什么?
JWT的具体使用方式是,服务端根据规范生成一个令牌(token),并发放给客户端。此时,客户端在请求服务端时可以携带这个令牌,以证明自己的身份信息。因此,可以说JWT是Token的一种具体实现形式,它遵循特定的标准和格式。
jwt解决了什么问题?为什么要使用jwt?
传统---Session认证
用户认证通过之后服务端会创建对应的session并存储,会生成一个唯一的session_id并返回给客户端,客户端在浏览器的Cookie中或其他方式(内存,但服务器重启后会丢失;数据库持久化)进行存储。下次再访问的时候携带者session_id,服务端根据session_id就可以验证是谁发送的请求,进行身份验证等等
Session存储了什么?
缺点:Session保存在服务器中,如果是是分布式应用的话Session无法共享(因为每次请求不一定会在哪台机器上),不便于维护
jwt的组成有哪些?
header,头部分。它是一个描述 JWT 元数据的 Json 对象
alg 属性表示签名使用的算法,默认为 HMAC SHA256(写为HS256),typ 属性表示令牌的类型,JWT 令牌统一写为JWT
Payload,也是一个 Json 对象
组成:传递的信息+默认字段信息
iss (issuer):签发人/发行人
sub (subject):主题
aud (audience):用户
exp (expiration time):过期时间
nbf (Not Before):生效时间,在此之前是无效的
iat (Issued At):签发时间
jti (JWT ID):用于标识该 JWT
注意:JSON 对象也使用 Base64 URL 算法转换为字符串后保存,是可以反向反编码回原样的
Signature,签名。
需要指定一个 secret,该 secret 仅仅保存在服务器中,保证不能让其他用户知道。这个部分需要 base64URL 加密后的 header 和 base64URL 加密后的 payload 使用 . 连接组成的字符串,然后通过header 中声明的加密算法 进行加secret组合加密,然后就得出一个签名哈希,也就是Signature,且无法反向解密。
注意:JWT对三个部分都使用的是Base64进行编码,但是Base64是可逆的,所以注意在Payload部分不要携带敏感信息。
比方说我们有上图这样一个token,我们就可以通过JWT官网提供的工具进行解密。解密之后会自动拆分成对应的三部分
但是要注意,签名部分的文本框中要填写你在项目中配置的secret,否则会出现下面这种验证失败的问题:
项目中jwt的使用场景是什么?
用户登录身份验证
项目中如何使用jwt的?
流程图
代码实现
加密
- 选择算法:在创建JWT时,选择合适的算法(如HMAC、RSA等)来生成数字签名。
- 创建Payload:将要传递的信息(称为Payload)以JSON格式编码,并将其与头部(Header)一起组成JWT的第二部分。
- 创建Header:Header包含了描述JWT的元数据和指定所用算法的信息,也以JSON格式编码。
- 生成签名:使用所选的算法、密钥和Header与Payload的组合来生成数字签名。
- 创建JWT:将Header、Payload和签名组合在一起,用.分隔,形成最终的JWT。
解码
- 分割JWT:将JWT按.分割成Header、Payload和签名三部分。
- 验证签名:使用相同的算法、密钥和Header与Payload的组合来验证签名的有效性,确保JWT在传输过程中未被篡改。
- 解码Payload:将Payload部分进行Base64解码,得到原始的JSON格式数据,包含了传递的信息。
- 使用信息:根据Payload中的信息,进行相应的操作,如验证身份、授权等。