복붙노트

[SPRING] Spring Security 3.2.0.RELEASE를 사용하면 순수 HTML 태그 라이브러리가없는 페이지에서 CSRF 토큰을 얻을 수 있습니까?

SPRING

Spring Security 3.2.0.RELEASE를 사용하면 순수 HTML 태그 라이브러리가없는 페이지에서 CSRF 토큰을 얻을 수 있습니까?

오늘 저는 스프링 보안 3.1.4에서 별도의 자바 구성 종속성을 사용하여 Java 구성을 포함하는 새로운 3.2.0 릴리스로 업그레이드했습니다. CSRF는 기본적으로 켜져 있으며 "http.csrf (). disable ()"을 사용하여 재정의 된 configure 메소드에서 비활성화 할 수 있음을 알고 있습니다. 그러나 이것을 비활성화하고 싶지는 않지만, JSP 태그 라이브러리 나 Spring 태그 라이브러리가 사용되지 않는 로그인 페이지에 CSRF 토큰이 필요합니다.

내 로그인 페이지는 Yeoman을 사용하여 생성 한 Backbone 앱에서 사용하는 순전히 HTML입니다. HttpSession에 포함 된 CSRF 토큰을 양식이나 헤더로 포함 시키면 "예상 CSRF 토큰을 찾을 수 없습니다. 세션이 만료 되었습니까?" 예외?

해결법

  1. ==============================

    1.참조에서 설명한대로 _csrf라는 요청 속성을 사용하여 CSRF를 얻을 수 있습니다. HTML 페이지에 CSRF를 추가하려면 JavaScript를 사용하여 요청에 포함해야하는 토큰을 얻어야합니다.

    참조에서 설명한대로 _csrf라는 요청 속성을 사용하여 CSRF를 얻을 수 있습니다. HTML 페이지에 CSRF를 추가하려면 JavaScript를 사용하여 요청에 포함해야하는 토큰을 얻어야합니다.

    몸체의 JSON은 외부 도메인에서 가져올 수 있으므로 JSON처럼 몸체보다 헤더로 토큰을 반환하는 것이 안전합니다. 예를 들어 자바 스크립트가 다음에 의해 처리 된 URL을 요청할 수 있습니다.

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

    그런 다음 JavaScript는 응답 헤더에서 헤더 이름이나 매개 변수 이름 및 토큰을 가져 와서 로그인 요청에 추가합니다.

  2. ==============================

    2.@ rob-winch가 맞지만 세션에서 토큰을 가져 오는 것이 좋습니다. Spring-Security가 CsrfAuthenticationStrategy를 사용하여 SessionManagementFilter에 새로운 토큰을 생성하면 요청시 세션이 아니라 세션으로 설정됩니다. 따라서 잘못된 csrf 토큰으로 끝날 수도 있습니다.

    @ rob-winch가 맞지만 세션에서 토큰을 가져 오는 것이 좋습니다. Spring-Security가 CsrfAuthenticationStrategy를 사용하여 SessionManagementFilter에 새로운 토큰을 생성하면 요청시 세션이 아니라 세션으로 설정됩니다. 따라서 잘못된 csrf 토큰으로 끝날 수도 있습니다.

    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);
    
  3. ==============================

    3.참고 : CORS와 AngularJS를 사용하고 있습니다.

    참고 : CORS와 AngularJS를 사용하고 있습니다.

  4. ==============================

    4.나는 스프링 부트와 함께 thymeleaf를 사용합니다. 나는 똑같은 문제가 있었다. 나는 브라우저를 통해 반환 HTML의 소스보기 문제를 진단. 그것은 다음과 같아야합니다.

    나는 스프링 부트와 함께 thymeleaf를 사용합니다. 나는 똑같은 문제가 있었다. 나는 브라우저를 통해 반환 HTML의 소스보기 문제를 진단. 그것은 다음과 같아야합니다.

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
    <title>Spring Security Example </title>
    </head>
    <body>
    <form method="post" action="/login">
    <div><label> User Name : <input type="text" name="username" /> </label></div>
    <div><label> Password: <input type="password" name="password" /> </label></div>
    <input type="hidden" name="_csrf" value=<!--"aaef0ba0-1c75-4434-b6cf-62c975dcc8ba"--> />
    <div><input type="submit" value="Sign In" /></div>
    </form>
    </body>
    </html>
    

    이 html 코드를 볼 수없는 경우. 이름과 값 앞에 태그를 넣는 것을 잊어 버릴 수도 있습니다.

    login.html

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
    <title>Spring Security Example </title>
    </head>
    <body>
    <div th:if="${param.error}"> Invalid username and password. </div>
    <div th:if="${param.logout}"> You have been logged out. </div>
    <form th:action="@{/login}" method="post">
    <div><label> User Name : <input type="text" name="username"/> </label></div>
    <div><label> Password: <input type="password" name="password"/> </label></div>
    <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
    <div><input type="submit" value="Sign In"/></div>
    </form>
    </body>
    </html>
    
  5. from https://stackoverflow.com/questions/20862299/with-spring-security-3-2-0-release-how-can-i-get-the-csrf-token-in-a-page-that by cc-by-sa and MIT license