如果我们在服务器端使用模板引擎,则可以像这样将CSRF令牌传递给客户端:
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
但是,如果我们根本无法使用模板引擎,则应使用如下响应标头将CSRF令牌传递给客户端:
CsrfToken token = (CsrfToken) request.getAttribute("_csrf");
// Spring Security will allow the Token to be included in this header name
response.setHeader("X-CSRF-HEADER", token.getHeaderName());
// Spring Security will allow the token to be included in this parameter name
response.setHeader("X-CSRF-PARAM", token.getParameterName());
// this is the value of the token to be included as either a header or an HTTP parameter
response.setHeader("X-CSRF-TOKEN", token.getToken());
public static final String DEFAULT_CSRF_TOKEN_ATTR_NAME = HttpSessionCsrfTokenRepository.class.getName().concat(".CSRF_TOKEN");
CsrfToken sessionToken = (CsrfToken) request.getSession().getAttribute(DEFAULT_CSRF_TOKEN_ATTR_NAME);
后一种方式,服务器应向客户端提供虚拟REST API,因为客户端无法在第一个HTML页面加载之前进行AJAX调用。
像后一种方法那样获取CSRF令牌是否很危险?