我有一个 REST API Spring Boot 应用程序(称为应用程序“A”)。它调用另一个 API(称为“B”)。
“B”受 OAuth2 保护,需要 CSRF 令牌才能进行 POST/PUT/DELETE。
每个“A”->“B”调用都包含来自 Azure 的 JWT OAuth2 令牌。 “A”可以通过调用“B”的端点的 getCsrfToken() 来获取 CSRF 令牌。
问题是:“A”应该为每个不安全的操作调用 CSRF 令牌,还是应该将其存储在 Java 服务中并重复使用直到过期?
我认为这是安全性和可用性之间的平衡。显然,每次都获得新的令牌更安全。但这可能会导致可用性问题。
有多种使用令牌的方法:
如果使用 Synchronizer Token 模式,您应该在每个请求中发送它。也不建议使用 GET 请求。它应该在每个会话或每个请求生成一次。但是,当用户转到上一页时,它可能会导致一种情况,其中包含不再有效的令牌。那么这将是一个误报安全事件。
基于加密的Token模式不需要存储在服务器端。它正在使用加密。这是一种无状态方法。
基于HMAC的令牌不需要将其存储在客户端。它使用 HMAC(基于哈希的消息身份验证代码)进行加密。
您也应该回答自己,您的应用程序是有状态的,还是无状态的,并选择正确的方法。另外,请查看 OWASP 跨站请求伪造预防备忘单。