Skip to content

rest api的csrf问题

Csrf也被称为Session Riding,是不是不使用session的无状态服务就没有csrf问题了呢?客户端可以使用一个安全的token(比如JWT)。

是否存在CSRF问题取决于客户端怎样存储和发送token。

Token不在客户端持久化

一旦我们获取到token后,我们可以将token设置为一个js变量保存。也就是说token是保存在浏览器的内存中,且它只能被当前页面访问。

这是最安全的方式,csrf和xss攻击一般都需要另开一个页面进行,它们无法访问已经登录的页面。

然而,我们不能要求用户在每次刷新页面之后都重新登录。所以这种方式用户体验太差,一般不会这么做。

Token存储在浏览器的storage中

我们可以持久化token到浏览器的session storage(也可以是其他存储介质)。那么js客户端就可以从中读取token,并在所有的请求头中都带上必要的认证信息。比如jwt的请求头就是Authorization: Bearer <token>

在这种情况下,应用没有CSRF问题。但前端需要处理token,有被xss攻击的风险。

但是如果将token保存在cookie中,即便将http-only设置为true,应用会和使用session的stateful应用一样,面临CSRF的风险。

其他可能存在CSRF问题的场景

比如HTTP basic authentication,Mutual authentication,浏览器会自动将认证信息附加在任何http请求上。在这些情况下,也是存在csrf问题的。

Published in基础知识未分类

Be First to Comment

Leave a Reply

Your email address will not be published.