谈一谈关于jwt的一些事

  • 什么是jwt?
  • jwt的特点总结
  • jwt的好处
  • JWT与OAuth的区别
  • JWT踩坑


什么是jwt?

谈到jwt,我们必须了解到jwt是用来干什么的,我的个人理解jwt是用来处理存储分布式的用户信息的一种工具。
在没有jwt之前,我们通常是如何存储用户的登录信息的呢?

  1. session存储:通过登录后,将用户的的登录数据保存在session存储,等到需要时再从session中取出来进行使用。但是这样一来就出现了一个问题,随着分布式时代的到来,session的一些问题就暴露了出来,比如无法跨服务进行共享用户的登录状态以及容易被CSRF攻击等,于是出现了第二种技术。
  2. redis配合token,将token保存在redis中,通过token请求去读取存放在redis的信息,这样子就避免了内存中的用户信息如何被共享的问题,并且因为token很难被伪造,可以轻松避免一些低级CSRF攻击,但是这种依然会有一些 问题(比如redis失效,崩溃,以及保存成本等原因),出现了第三种保存存储用户登录状态的方式,那就是jwt。

jwt虽然也是基于token认证推出的一种登录机制,但是原理却和以上两种有本质区别。因为它是基于客户端保存的的。以上两种都是基于服务器认证然后保存在服务器端的。
jwt采用的非对称加密的形式,将加密过后用户信息以及过期时间返回对应的token到客户端进行保存,然后每次客户端都需要传入传入token,然后服务器会再次对token进行解密取出响应的信息进行处理。

jwt的特点总结

基于Token的身份认证是无状态的,服务器或者Session中不会存储任何用户信息。

jwt的好处

安全:因为没有经过cokie以及session等会话机制处理,所以可以轻松防御CSRF攻击,而且jwt返回的token会有过期时间,所以会让黑客拿到过期token依然无法通过服务器认证

JWT与OAuth的区别

  1. OAuth2是一种授权框架 ,JWT是一种认证协议 -无论使用哪种方式切记用HTTPS来保证数据的安全性
  2. OAuth2用在使用第三方账号登录的情况(比如使用weibo, qq, github登录某个app),而JWT是用在前后端分离, 需要简单的对后台API进行保护时使用。

JWT踩坑

前后端分离处理关于跨域时有三种解决方案

  1. 后端处理,因为一般token是在hender中通过制定Authorization来携带token,所以需要在跨域cors中指定Authorization
  2. 前端处理之http-proxy-middleware :前端跨域通过这个代理来转发请求为网关域名,来通过跨域
  3. 万能的nginx,我就不说了。

最后放上我的cors处理方案

//允许的域,不要写*,否则cookie就无法使用了
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin());
//允许传入的跨域方法
headers.add(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD,"POST, GET, PUT, OPTIONS, DELETE, PATCH");
//  Authorization需要加上 要不然不允许跨域 携带
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS,"Authorization, Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
//  允许携带cookie
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE);

最后引用:
知乎大佬的解释 5分钟了解jwt