谈一谈关于jwt的一些事
- 什么是jwt?
- jwt的特点总结
- jwt的好处
- JWT与OAuth的区别
- JWT踩坑
什么是jwt?
谈到jwt,我们必须了解到jwt是用来干什么的,我的个人理解jwt是用来处理存储分布式的用户信息的一种工具。
在没有jwt之前,我们通常是如何存储用户的登录信息的呢?
- session存储:通过登录后,将用户的的登录数据保存在session存储,等到需要时再从session中取出来进行使用。但是这样一来就出现了一个问题,随着分布式时代的到来,session的一些问题就暴露了出来,比如无法跨服务进行共享用户的登录状态以及容易被CSRF攻击等,于是出现了第二种技术。
- 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的区别
- OAuth2是一种授权框架 ,JWT是一种认证协议 -无论使用哪种方式切记用HTTPS来保证数据的安全性
- OAuth2用在使用第三方账号登录的情况(比如使用weibo, qq, github登录某个app),而JWT是用在前后端分离, 需要简单的对后台API进行保护时使用。
JWT踩坑
前后端分离处理关于跨域时有三种解决方案
- 后端处理,因为一般token是在hender中通过制定Authorization来携带token,所以需要在跨域cors中指定Authorization
- 前端处理之http-proxy-middleware :前端跨域通过这个代理来转发请求为网关域名,来通过跨域
- 万能的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