CookieCsrfTokenRepository.withHttpOnlyFalse() 有什么作用,什么时候使用?

What does Cookie CsrfTokenRepository.withHttpOnlyFalse () do and when to use it?

我现在正在尝试学习 Spring 安全性,我已经看到许多使用它的不同示例。我知道 CSRF 是什么,Spring 安全性默认启用它。 我很好奇的是这种定制。

  .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
  .and()
  .authorizeRequests(request -> {
                request
                    .antMatchers("/login").permitAll()
                    .anyRequest()
                    ....more code

.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) 这行有什么样的定制,什么时候使用它合适。 如果有人能提供一个简单的解释,我将不胜感激。

CSRF 代表 跨站请求伪造

这是一种随请求一起发送的令牌,用于防止攻击。为了使用 Spring 安全 CSRF 保护,我们首先需要确保对任何修改状态的内容使用正确的 HTTP 方法(PATCHPOSTPUT,并且 DELETE – 不是 GET)。

使用 Spring CookieCsrfTokenRepository 的 CSRF 保护工作如下:

  • 客户端向服务器发出 GET 请求(Spring 启动后端),例如请求主页
  • Spring 发送 GET 请求的响应以及 Set-cookie header,其中包含安全生成的 XSRF 令牌
  • 浏览器使用 XSRF Token 设置 cookie
  • 在发送 state-changing 请求(例如 POST)时,客户端(可能是 angular)将 cookie 值复制到 HTTP 请求 header
  • 请求与 header 和 cookie 一起发送(浏览器自动附加 cookie)
  • Spring比较header和cookie的值,如果相同则接受请求,否则返回403给客户端

方法 withHttpOnlyFalse 允许 angular 读取 XSRF cookie。确保 Angular 发出带有 withCreddentials 标志设置为 true 的 XHR 请求。


代码 来自CookieCsrfTokenRepository

@Override
public CsrfToken generateToken(HttpServletRequest request) {
    return new DefaultCsrfToken(this.headerName, this.parameterName,
            createNewToken());
}

@Override
public void saveToken(CsrfToken token, HttpServletRequest request,
        HttpServletResponse response) {
    String tokenValue = token == null ? "" : token.getToken();
    Cookie cookie = new Cookie(this.cookieName, tokenValue);
    cookie.setSecure(request.isSecure());
    if (this.cookiePath != null && !this.cookiePath.isEmpty()) {
            cookie.setPath(this.cookiePath);
    } else {
            cookie.setPath(this.getRequestContext(request));
    }
    if (token == null) {
        cookie.setMaxAge(0);
    }
    else {
        cookie.setMaxAge(-1);
    }
    cookie.setHttpOnly(cookieHttpOnly);
    if (this.cookieDomain != null && !this.cookieDomain.isEmpty()) {
        cookie.setDomain(this.cookieDomain);
    }

    response.addCookie(cookie);
}

@Override
public CsrfToken loadToken(HttpServletRequest request) {
    Cookie cookie = WebUtils.getCookie(request, this.cookieName);
    if (cookie == null) {
        return null;
    }
    String token = cookie.getValue();
    if (!StringUtils.hasLength(token)) {
        return null;
    }
    return new DefaultCsrfToken(this.headerName, this.parameterName, token);
}


public static CookieCsrfTokenRepository withHttpOnlyFalse() {
    CookieCsrfTokenRepository result = new CookieCsrfTokenRepository();
    result.setCookieHttpOnly(false);
    return result;
}

您可以探索方法 here

您可以在此处找到有关 cookie 的 httpOnly 属性的更多信息:https://www.cookiepro.com/knowledge/httponly-cookie/