一、什么是JWT
官网地址:https://jwt.io/
JSON Web令牌(JWT)是一个开放标准([RFC 7519](https://tools.ietf.org/html/rfc7519)),它定义了一种紧凑且自包含的方式,用于在各方之间安全地将信息作为JSON对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对对JWT进行签名。
JWT简称JSON Web Token,也就是通过JSON形式作为Web应用的令牌,用于在各方之间安全地将信息作为JSON对象传输,在数据传输过程中,还可以完成数据加密、签名等相关处理。
二、JWT能做什么?
1、授权
单点登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域轻松使用
一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。
2、信息交换
JSON Web Token 是在各方之间安全地传输信息的好方法,因此可以对JWT进行签名(例如,使用公钥/私钥对),可以确保发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此还可以验证内容是否遭到篡改。
三、为什么用JWT?
1、传统的session认证以及其缺点
步骤
1、登录成功,将用户信息和该用户对应的权限信息存放到Session中,前端将其保存为cookie
2、下次请求前端将cookie发送给后端应用,后端应用就可以识别该用户
3、判断要访问的资源是否有权限
认证流程
暴露的问题
1、Session:用户经过应用认证后,都会在服务端做一次记录,以便用户下次请求的鉴别。而session一般都是保存在内存中,随着认证用户的增多,服务端的开销会明显增大。
2、扩展性:用户认证,则服务器做了相应的记录。这就意味着下次请求还需要在已经认证过的服务器上认证才可以得到授权的资源等。但是这在分布式方面,限制了负载均衡的能力,影响应用的扩展能力
3、CSRF:基于cookie进行的用户识别,如果cookie被截获,用户很容易受到跨站请求的伪造攻击。
4、Session经常过期回收,导致Session为空,一些业务莫名其妙无法被使用。(可以改进为使用数据库的Session)
2、基于JWT的认证
认证流程
1、前端通过web表单将自己的用户名和密码发送给后端接口认证。这个过程一般是HTTP POST请求
2、后端核对用户名和密码成功后,将用户id等信息作为JWT Payload(负载),将其与头部分别进行Base64编码拼接后签名,形成一个JWT(Token)。生成的JWT类似于aaa.bbb.ccc的字符串(head.payload.signature)响应给前端
3、后端将JWT字符串在登录成功后返回给前端。前端可以将返回的结果保存在localStorage或sessionStorage上,退出登录时删除JWT即可
4、前端在每次请求时将JWT放入HTTP Header中的AUthorization位上(解决XSS和XSRF问题)
5、后端检查是否存在,存在则验证JWT的有效性,例如,检查签名是否过期、token接收方是否是自己
6、验证通过,后端使用JWT包含的信息进行其它操作,返回响应结果。
jwt的优势
1、简洁:可以通过URL,POST参数或者在HTTP Header发送,因为数据量小,传输速度快
2、自包含:负载中包含了所有用户所需要的信息,避免多次查询数据库
3、跨语言:因为Token是以JSON加密的形式保存在客户端,原则上任何web形式都支持
3、不需要再服务保存会话信息,特别适用于分布式微服务