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问题的。
Be First to Comment