本文建议我们应该在每个请求上更改我们的 CSRF 令牌以防止 BREACH 攻击。即,如果我们使用 gzip/brotli 和每会话 CSRF 令牌和 SSL,我们的令牌只有 1000 个请求就容易受到攻击。
假设这是真的,如何在不中断后退/前进和多个选项卡的情况下在每个请求上重新生成 CSRF 令牌?
显而易见的解决方案是在我们的会话中存储一组有效的 CSRF 令牌,而不仅仅是最近的一个,也许将其限制在 100 个左右。
但是如果我们使用 JWT 或其他东西呢?我们可以只在其中存储用户 ID,然后验证令牌没有过期并且属于当前用户,我们根本不需要将它存储在服务器上。唯一的问题是我们无法在用户注销时撤销 CSRF-JWT,这需要一个短暂的过期时间,但我们不希望它太短或者它在用户有机会提交之前就过期了形式。
解决这个问题的最佳方法是什么?