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 方法(PATCH
、POST
、PUT
,并且 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/
我现在正在尝试学习 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 方法(PATCH
、POST
、PUT
,并且 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/