初识JWT
什么是JWT
官网解释
是一种开放标准,用于各方之间以JSON对象安全的传输信息,此信息可以验证和信任,因为它是数字签名的。
自己理解
JWT是json web token的缩写,见名知意就是通过JSON形式作为web应用中的令牌,用于各方之间以JSON对象安全的传输信息,现在项目中主要使用的还是授权,接口访问权限的验证。
为什么使用JWT
传统的认证方式session
session的工作原理:
- 用户第一次请求服务器时,服务器端会生成一个sessionid
- 服务器端将生成的sessionid返回给客户端,通过set-cookie
- 客户端收到sessionid会将它保存在cookie中,当客户端再次访问服务端时会带上这个sessionid
- 当服务端再次接收到来自客户端的请求时,会先去检查是否存在sessionid,不存在就新建一个sessionid重复1,2的流程,如果存在就去遍历服务端的session文件,找到与这个sessionid相对应的文件,文件中的键值便是sessionid,值为当前用户的一些信息
- 此后的请求都会交换这个 Session ID,进行有状态的会话。
由上显而易见的就能看出session的弊端:
- 若是大量用户,则会在服务器端生成大量session会话,服务器内存吃不消,会造成卡顿
- 分布式应用下,每次产生的认证记录只会保存在当前服务器内存中,这样就限制了负载均衡的能力,若想使用还得进行session共享;
- 前后端的项目中前端基本上为了解决跨域问题都会使用代理的,这样就是用户一次请求就要转发多次,使用session的话每次都得携带sessionid,服务器还要查询用户信息。
- 安全问题,sessionid是存储在cookie中的,cookie被截取的话就会造成跨站攻击
JWT的认证
- 登录页输入账号、密码发送到后端接口;
- 后端查数据库进行验证,验证成功后把用户的一些基本信息作为payload(负载),和头部分别进行base64编码,然后拼接后进行签名,形成一个token
- 后端将token返回给前端,前端可以将token保存到本地(localstorage),退出登录进行删除保存的jwt
- 前端每次请求将jwt放到head中,后端接收后对jwt进行有效验证,若有效进行逻辑访问,否则就直接返回到登录页。