谈一谈CSRF、Token、JWT

2021-09-17  本文已影响0人  Small_Song

一、CSRF

CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向信任网站发送跨站请求。利用受害者在信任网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对信任网站执行某项操作的目的。

一个典型的CSRF攻击有着如下的流程:

二、CSRF Token

我们知道,CSRF的一个特征是,攻击者无法直接窃取到用户的信息(Cookie,Header,网站内容等),仅仅是冒用Cookie中的信息。
而CSRF攻击之所以能够成功,是因为服务器误把攻击者发送的请求当成了用户自己的请求。那么我们可以要求所有的用户请求都携带一个CSRF攻击者无法获取到的Token。服务器通过校验请求是否携带正确的Token,来把正常的请求和攻击的请求区分开,也可以防范CSRF的攻击。
大概的流程是这样的:

三、JWT

说到这个JWT,就必须谈一下cookie和session。我们知道,HTTP是无状态的协议,而Cookie+Session作为用来跟踪浏览器用户身份的一种非常经典会话方式。这里不做过多解释,如果不清楚,推荐轩辕志远在知乎上的回答
对于这种模式,其第一个问题在于,扩展性不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。
举例来说,A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?
一种解决方案是 session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。
另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。
再来看第二个问题,也就是上面讲的CSRF攻击问题,我们知道,防止CSRF攻击的一种方法,就是利用Token,然后我们再来看看JWT,JWT的全称是JSON Web Token。很显然了,这就是一种Token而已。

来看一下JWT的实现过程吧:

四、总结

回顾二与三中的内容,你可能会有疑问,前文在CSRF Token中所说的最后一步,不是依旧会有Token和session中存储值的对比这一步么?那session中不是存东西了?这就要说到JWT的高明之处了,观察JWT设计的整个流程,服务器端并不需要将接收到的Token与session进行对比,只利用Token自己加上前面所说的巧妙地方法,就可以校验真伪了。
也就是说,CSRF Token中所说的解决方案,可以理解为一种概念指导性的东西,对于Token,你当然可以那么简单的实现,但是JWT提供了一种更好的不需要session存值就可以验证Token正确性的方法。
某种意义上JWT只不过是定义了一种更具体的token实现方式,而利用token的方案可以用来解决CSRF攻击问题。然而JWT不只是这样而已,它在token中加了用户信息在里面,解决CSRF同时,又解决cookie+session模式的扩展性问题。何乐而不为呢?

上一篇 下一篇

猜你喜欢

热点阅读