JWT简介
JWT,全称是JSON Web Token,是一种规范化的 token,能解决分布式部署会话问题。
JWT是一个很长的字符串,字符之间通过"."分隔符分为三个子串:JWT头,有效载荷,签名。
默认情况下JWT是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。有效载荷这个JSON对象也使用Base64 URL算法转换为字符串保存。
使用方法:一般是登录成功后后端生成jwt给前端,前端存储起来,后续请求将它放入HTTP请求的Header Authorization字段中。
优缺点
优点
- 无状态,适合分布式应用;
- 自身包含身份验证所需信息,使得后端不用存储Session 信息。
缺点
- token无法主动失效
由于 token 的无状态设计,导致了它最大的缺点:当后端在token 有效期内废弃一个 token 或者更改它的权限的话,不会立即生效,一般需要等到有效期过后才真正的废除掉这个token。另外,当用户 Logout 的话,token 也还有效。除非,我们在后端增加额外的处理逻辑,比如设置存储token黑名单,或者只允许白名单的token操作。 - token无法自动续期
由于实际项目中,token的有效期时间不宜设置过长,但是项目经理又要求在一定时间内(大于token的有效期)用户免登陆。这种场景下,jwt就无法完成token的自动刷新,因为token失效后需要重新登录去重新生成一个新的token, token的有效期无法自动延长。除非给每个请求重新下发新的token或者token过期了直接重新生成新的token(也需要加)。 - jwt存储太多信息,增加了传输载荷
身份验证所需信息都被放到JWT里,如果还要进行一些数据交换,那载荷会更大,经过编码之后导致jwt非常长。
适用场景
有效期短
只希望被使用一次,比如,用户注册后发一封邮件让其激活账户,通常邮件中需要有一个链接,这个链接需要具备以下的特性:能够标识用户,该链接具有时效性(通常只允许几小时之内激活),不能被篡改以激活其他可能的账户,一次性的。这种场景就适合使用jwt。
而由于jwt具有一次性的特性。单点登录和会话管理非常不适合用jwt,如果在服务端部署额外的逻辑存储jwt的状态,那还不如使用session。基于session有很多成熟的框架可以开箱即用,但是用jwt还要自己实现逻辑。
框架应用
- spring security