我使CSRF保护,并使用弹簧引导设置XSRF-TOKEN饼干
在我看到如预期的那样Cookie设置浏览器中,但没有experation。我有这些问题
这是我的springboot代码
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/**").permitAll()
.and().csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
答案 0 :(得分:0)
有没有办法在此Cookie上设置最长期限或在会话到期时使其过期?
不需要更改Cookie的最长期限,因为默认情况下,CookieCsrfTokenRepository
会创建它,以使其不会永久存储。通常在关闭浏览器后将其删除:
cookie.setMaxAge(-1);
但是,如果您真的要更改它,则必须编写自己的CsrfTokenRepository
实现,因为尽管最好重写saveToken(...)
的{{1}}方法,您不能,因为它是CookieCsrfTokenRepository
类。取而代之的是,您可以使用组合,并让实现的委托委托给final
以外的每个方法调用的CookieCsrfTokenRepository
对象,在saveToken(...)
处,您将编写自定义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。