JWT令牌认证技术
Java Web Token (全称)
专门用来替换:Cookie + Session的应用状态管理方式,通常适合前后端分离的项目
**应用程序的状态:**后端服务器和浏览器相互识别的内容
传统应用状态管理的缺陷
先问个问题
大家在2,3阶段学习时,我们怎么样去管理应用程序的状态?
后端服务器Tomcat如何知道你发的请求是你的浏览器发的,它不是其它浏览器发的?
答案:Cookie +Session
缺陷
- 前端只能是浏览器或者有Cookie的前端技术
- 应用程序的服务器在横向扩展时,需要进行Session同步
- 不适合做前后端分离的项目
具体原因
**目前的前端(大前端)包含:**各种浏览器,各种手机APP,各种应用小程序,还有其他的设备但上述的这些前端技术中,Cookie是浏览器所特有的
JWT解决方案
JWT的流程
后端通过JWT的技术,可以生成一个Token令牌的东西,生成出来之后,交给前端,要求前端进行存储,前端的每次请求需要携带该Token令牌到后端来识别
JWT的组成
JWT由3段信息构成:头(header)、载荷(payload)、签证(signature)
头(header)、载荷(payload) 采用Base64位加密方法,签证(signature)使用HMACSHA256进行加密运算。
标准案例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
头(Header)
主要承载2部分内容:声明Token使用JWT技术产生,声明加密的算法 通常直接使用 HMACSHA256
完整头的JSON格式:
{
'typ': 'JWT',
'alg': 'HS256'
}
头的内容是固定的,不会发生变化
它对应的字符串是:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
载荷(payload)
后端通过JWT承载,传递给前端有用的相关数据
组成载荷的2个部分:标准中注册的声明,其它的声明
标准中注册的声明(建议但不强制):
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
其它的声明
载荷中,可以申明上述的标准信息,也可以附加一些个人信息(个人信息有的是公共的,有的是私有的)
备注:不管是公共的,还是私有的,由于载荷使用Base64位算法,都是可以破解的
其它的声明,不要写一些非常敏感的信息,例如:银行卡卡号,银行卡密码,登录名,登录密码……
签证(signature)
签证由3部分构成
header (base64加密后的内容)
payload (base64加密后的内容)
secret 盐值
将以上3部分内容使用:HMACSHA256算法进行加密
ture)
签证由3部分构成
header (base64加密后的内容)
payload (base64加密后的内容)
secret 盐值
将以上3部分内容使用:HMACSHA256算法进行加密
保证令牌颁发的权威性!