如何设置最大年龄为弹簧启动产生的XSRF令牌的cookie

时间:2019-02-02 16:03:43

标签: angularjs spring-boot csrf

我使CSRF保护,并使用弹簧引导设置XSRF-TOKEN饼干

在我看到如预期的那样Cookie设置浏览器中,但没有experation。我有这些问题

  1. 有没有一种方法可以设置此Cookie的最大使用期限,或使其在会话过期时过期?
  2. 为了更好的安全性,我应该在会话中存储XSRF令牌而不是cookie吗?
  3. 使用AngularJS作为前端并使用springboot作为后备保护CSRF保护的最佳方法是什么?

这是我的springboot代码

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
    .antMatchers("/**").permitAll()
    .and().csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}

1 个答案:

答案 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。