暴露的问题 1、Session:用户经过应用认证后,都会在服务端做一次记录,以便用户下次请求的鉴别。而session一般都是保存在内存中,随着认证用户的增多,服务端的开销会明显增大。 2、扩展性:用户认证,则服务器做了相应的记录。这就意味着下次请求还需要在已经认证过的服务器上认证才可以得到授权的资源等。但是这在分布式方面,限制了负载均衡的能力,影响应用的扩展能力 3、CSRF:基于cookie进行的用户识别,如果cookie被截获,用户很容易受到跨站请求的伪造攻击。 4、Session经常过期回收,导致Session为空,一些业务莫名其妙无法被使用。(可以改进为使用数据库的Session)
认证流程 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、不需要再服务保存会话信息,特别适用于分布式微服务