86.JWT(json web token)
参考1### JWT(json web token)
适用于分布式站点的单点登录场景。
传统的session认证
服务端为了识别客户端的用户信息的一种凭证。
问题:
服务端需要记录每个用户的认证信息,随着用户的增多,服务端开销增大。
在分布式应用上很难得到扩展。
cookie如果被截获,用户就很容易收到跨站请求伪造的攻击(CSRF:跨站脚本攻击,盗用用户信息发送请求)。
基于token的鉴权机制
每次请求必须带token,相对于session的机制,信息存储在客户端,降低了服务端的压力。
服务端要允许跨域:Access-Control-Allow-Origin: *
流程:
-
用户使用用户名密码来请求服务器
-
服务器进行验证用户信息
-
服务器通过验证发送给用户一个token
-
客户端存储token,并在每次请求时在请求头加上token值
-
服务端验证token返回结果
JWT
构成
头部(header:声明类型和加密算法)+荷载(payload:存放有效信息)+签证(signature:加密后的header+加密后的payload+secret)
将头部进行base64加密+荷载进行Base64加密+通过header中声明的加密方式+secret组合加密
secret保存在服务端的,jwt的签发生成也是在服务端的,secret是用来进行jwt的签发和jwt的验证。相当于是服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret就意味着客户端可以自我签发jwt了。
应用
在请求头里加Authorization,并加上bearer标注。
应用场景:
身份认证,单点登录SSO;信息交换,数据是经过编码的,可以确保发送者没有伪造。
优点
使用json,可跨语言支持;
便于传输,jwt的构成非常简单,字节占用小;
不需要再服务端保存会话信息,易于扩展。
流程
当用户发起请求登录成功后
服务端返给用户一个JWT,用户只需要本地保存该Token和refresh_token。
当用户访问时在请求头加上Authorization头部。