【问题标题】:How do I set max-age for the XSRF-Token cookie generated by spring boot如何为 spring boot 生成的 XSRF-Token cookie 设置 max-age
【发布时间】:2019-06-26 22:25:24
【问题描述】:
我正在启用 csrf 保护并使用 spring boot 设置 XSRF-TOKEN cookie
在浏览器中,我看到 cookie 已按预期设置,但没有任何经验。我有这些问题
- 有没有一种方法可以设置这个cookie 的最大年龄或使其在会话到期时到期?
- 我应该将 XSRF 令牌存储在会话中而不是 cookie 中以获得更好的安全性吗?
- 使用 AngularJS 作为前端,springboot 作为后端进行 CSRF 保护的最佳方法是什么?
这是我的springboot代码
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/**").permitAll()
.and().csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
【问题讨论】:
标签:
angularjs
spring-boot
csrf
【解决方案1】:
有没有办法可以设置此 cookie 的最大年龄或使其在会话过期时过期?
应该不需要更改 cookie 的最大年龄,因为默认情况下CookieCsrfTokenRepository 创建它,因此它不会被永久存储。通常在关闭浏览器时会被删除:
cookie.setMaxAge(-1);
但是如果你真的想改变它,你就必须编写自己的CsrfTokenRepository 实现,因为虽然重写CookieCsrfTokenRepository 的saveToken(...) 方法会很好,但你不能因为它是final 类。相反,您可以使用组合并将您的实现委托给除saveToken(...) 之外的每个方法调用的CookieCsrfTokenRepository 对象,您将在其中编写自定义cookie 逻辑。然后将其添加到您的WebSecurityConfigurerAdapter:
protected void configure(HttpSecurity http) throws Exception {
http.
...
.and().csrf()
.csrfTokenRepository(new MyCustomCookieCsrfTokenRepository());
}
再一次,三思而后行是否有必要。
我应该将 XSRF 令牌存储在会话中而不是 cookie 中以获得更好的安全性吗?
好吧,如果有人可以窃取您的 cookie,那么理论上他们也可以窃取您的会话。如果您可以在服务器中为 cookie 的值维护状态,那么继续。但如果没有,请坚持使用 cookie。 Spring Security 负责处理细节。
使用 AngularJS 作为前端,springboot 作为后端进行 CSRF 保护的最佳方法是什么?
一种方法是将 CRSF 令牌作为 cookie 发送,然后让您的 ANGularJS 应用程序将令牌发送回“X-XSRF-TOKEN”标头中,或者作为名称为“_csrf”的请求参数。
如果你想在会话中存储 CSRF 值,你需要有一种方法让你的 AngularJS 应用程序知道它。传统上,在非单页设置中,您会将其写入表单作为隐藏参数。但由于这不是你的情况,你可能想坚持使用 cookie。