一、为什么使用JWT
1、避免跨域(CORS)发生时导致的cookie不能使用的问题:
cookie是与一定的域名绑定的,如果发生跨域,那么cookie将无法携带;虽然可以通过父域名的方案来解决,但是还是有完全跨域需求的存在。
2、避免查库:
因为JWT自身的playload中可以携带一些业务信息(不要存放私密信息,playload中的内容虽不可被修改,但可被查看),进行鉴权时,可以直接进行使用,而不需要再去查库获取相关信息。
二、授权(登录)及鉴权(权限校验)
先去授权中心进行授权,拿到token之后,再访问相关API,访问时需要进行鉴权处理
三、JWT组成
JWT: 全称为json web token,由Header(头)、Playload(有效负载)、Signature(签名)三部分组成(逗号分隔)
1.Header
头通常由两部分组成:令牌的类型(JWT)和正在使用的签名算法(如HMAC SHA256或RSA)
把这个JSON通过base64url编码,以形成JWT的第一部分
2.Playload
令牌的第二部分是有效负载,它包含声明。声明是关于实体(通常是用户)和附加数据的语句。声明有三种类型:注册声明、公开声明和私人声明
注册声明:这些是一组预先定义的声明,这些声明不是强制的,但建议提供一组有用的、可互操作的声明。其中包括:ISS(发行人)、EXP(到期时间)、SUB(主题)、AUD(受众)等
公开声明:这些可以由使用JWT的人员随意定义。但是为了避免冲突,应该在IANA JSON Web令牌注册表中定义它们,或者将它们定义为包含抗冲突命名空间的URI。
私有声明: 这些是为了在双方之间共享信息而创建的自定义声明,这些声明同意使用它们,并且既不是注册声明也不是公共声明。
例如:
然后,对有效负载进行base64url编码,形成JSONWeb令牌的第二部分。
3.Signature
要创建签名部分,您必须获取编码的头、编码的有效负载、一个秘密、头中指定的算法,并对其进行签名。
例如,如果要使用hmac sha256算法,将按以下方式创建签名:
签名用于验证消息是否在过程中发生了更改,对于使用私钥签名的令牌,它还可以验证JWT的发送者是它所说的人。
JWT结果:输出是三个base64 URL字符串,用点分隔,这些点可以在HTML和HTTP环境中轻松传递。下面显示了一个JWT,它对前面的头和有效负载进行了编码,并用一个秘钥进行了签名: