单页应用程序和CSRF

3
假设我们有一个单页应用程序(SPA)在nginx上被服务,在域名example.com,REST API托管在api.example.com。SPA和API之间的身份验证是通过JWT进行的。短期(15分钟)的访问令牌存储在SPA中的localstorage中,而长期(数天)的刷新令牌则由服务器设置在 HttpOnly cookie 中。CORS被允许在域名example.com上。
问题1:我昨天与同事讨论了这个问题,他们认为因为我的刷新令牌驻留在Cookie中,所以我需要为我的应用程序提供CSRF保护。但我认为这是不正确的,因为刷新令牌不能用于“访问”任何私有资源,并且只能在特定端点的GET请求期间由服务器进行检查,该端点将令牌交换机制公开给SPA。
Q1: 这种推理正确吗? HttpOnly cookie 中的刷新令牌是否存在被恶意利用的风险?
问题2:进一步思考后,即使我们要为某些CSRF保护做些准备,如果出于平静的目的,您会如何首先向客户端发送令牌?我们不使用表单并完全在客户端渲染UI,因此隐藏字段是不可能的,索引文件由nginx提供,因此我们也无法在HTML中嵌入meta标签。
Q2: 是否有办法使CSRF保护适用于单页应用程序?
1个回答

1
我认为在cookie中保存刷新令牌是可以的。只需确保cookie只能发送到负责刷新的一个端点,并满足OWASP应用程序安全验证标准V3.4中提到的其他cookie保护要求,该标准可在此处找到:https://owasp.org/www-project-application-security-verification-standard/
如果有人通过CSRF攻击你,最糟糕的事情是什么?他可能会强制你刷新令牌。但是令牌不会以任何方式暴露给攻击者,因此不会发生泄漏。
如果尽管如此,您仍被迫解决CSRF问题,请参考以下内容:https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接