【问题标题】:How does CRSF LazyCsrfTokenRepository work?CRSF LazyCsrfTokenRepository 是如何工作的?
【发布时间】:2018-08-09 22:56:39
【问题描述】:
Java 8 - 春季 4.3.x
在配置 spring security 并启用 csrf 功能时,我遇到了 CsrfTokenRepository 的两个实现,一个是 Lazy,另一个是基于 Cookie
我知道CookieCsrfTokenRepository 使用将 csrf 令牌写入 cookie 并在标头中接受 cookie 值来验证有效请求
有人可以帮我理解LazyCsrfTokenRepository 的工作原理吗?
【问题讨论】:
标签:
spring
spring-security
csrf
【解决方案1】:
来自javadoc:
一个 CsrfTokenRepository 延迟保存新的 CsrfToken 直到
访问生成的CsrfToken 的属性。
那么为什么会这样呢? 在 Spring Security 的早期版本中,HttpSessionCsrfTokenRepository 是默认值。这样做的缺点是它总是创建一个令牌,触发会话创建,无论令牌是否被使用,这在某些应用程序中可能是浪费的。
另一方面,LazyCsrfTokenRepository 仅创建一个包装器,并且仅在调用 getToken() 时创建实际令牌(例如在生成表单时)。这避免了不必要的会话创建。
LazyCsrfTokenRepository 的一个问题是,实际的令牌生成必须在 HTTP 响应提交之前发生,否则你会得到一个异常。如果您对此有疑问,最容易使用(仅)其他两种实现之一。