【问题标题】: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 已按预期设置,但没有任何经验。我有这些问题

  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());
}

【问题讨论】:

    标签: angularjs spring-boot csrf


    【解决方案1】:

    有没有办法可以设置此 cookie 的最大年龄或使其在会话过期时过期?

    应该不需要更改 cookie 的最大年龄,因为默认情况下CookieCsrfTokenRepository 创建它,因此它不会被永久存储。通常在关闭浏览器时会被删除:

    cookie.setMaxAge(-1);
    

    但是如果你真的想改变它,你就必须编写自己的CsrfTokenRepository 实现,因为虽然重写CookieCsrfTokenRepositorysaveToken(...) 方法会很好,但你不能因为它是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。

    【讨论】:

      猜你喜欢
      • 2020-01-16
      • 2016-04-28
      • 2020-03-30
      • 2021-01-08
      • 1970-01-01
      • 2018-06-13
      • 2017-06-09
      • 2017-11-23
      • 1970-01-01
      相关资源
      最近更新 更多