복붙노트

[SPRING] CSRF - 처음 로그인 할 때만

SPRING

CSRF - 처음 로그인 할 때만

서버에 내 앱을 배포 할 때 처음으로 문제없이 로그인 할 수 있습니다. 하지만 로그 아웃 할 때 로그 아웃 요청에 "403 Forbidden"이 표시됩니다. 그런 다음 로그인 요청에서 403 오류가 발생하므로 성공적으로 로그인 할 수 없습니다. Ctrl + F5, 다시 로그인하려고하면 작동하지만 한 번만 작동합니다.

    @Override
    protected void configure(HttpSecurity http) throws Exception {
http
                .authorizeRequests()
                .antMatchers("/apps", "/sites", "/users").authenticated()
                .and()
                .csrf()
                .csrfTokenRepository(csrfTokenRepository())
                .and()
                .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
}
private CsrfTokenRepository csrfTokenRepository() {
    HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
    repository.setHeaderName("X-XSRF-TOKEN");
    return repository;
}

및 CsrfHeaderFilter 클래스

public class CsrfHeaderFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class
                .getName());
        response.setHeader("X-CSRF-HEADER", token.getHeaderName());

        response.setHeader("X-CSRF-PARAM", token.getParameterName());

        response.setHeader("X-XSRF-TOKEN", token.getToken());

        if (token != null) {
            Cookie cookie = WebUtils.getCookie(request, "X-XSRF-TOKEN");
            if (cookie == null || token != null && !token.equals(cookie.getValue())) {
                cookie = new Cookie("X-XSRF-TOKEN", token.getToken());
                cookie.setPath("/");
                response.addCookie(cookie);
            }
        }
        filterChain.doFilter(request, response);
    }

각도 :

$httpProvider.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';

중요한 경우 내 응용 프로그램은 localhost : 8080 / myApp에 배포됩니다.

해결법

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

    1.로그인, 로그 아웃과 같은 특정 이벤트가 발생하면 CSRF 토큰이 변경됩니다. 따라서 다음 POST 요청은 귀하의 경우처럼 실패합니다. 나는 같은 문제에 직면했고, 어떤 진단을 한 후에 로그인, 로그 아웃 등의 다른 GET 요청을 보내는 것이 그 문제를 해결할 수있는 최선의 방법이 될 것임을 알았다. (CORS를 사용하지 않는 경우, 로그인이있을 수도 있고, 로그 아웃은 리다이렉트 응답을 보낼 수도 있습니다). 자세한 내용은이 stackoverflow 게시물을 참조하십시오.

    로그인, 로그 아웃과 같은 특정 이벤트가 발생하면 CSRF 토큰이 변경됩니다. 따라서 다음 POST 요청은 귀하의 경우처럼 실패합니다. 나는 같은 문제에 직면했고, 어떤 진단을 한 후에 로그인, 로그 아웃 등의 다른 GET 요청을 보내는 것이 그 문제를 해결할 수있는 최선의 방법이 될 것임을 알았다. (CORS를 사용하지 않는 경우, 로그인이있을 수도 있고, 로그 아웃은 리다이렉트 응답을 보낼 수도 있습니다). 자세한 내용은이 stackoverflow 게시물을 참조하십시오.

  2. from https://stackoverflow.com/questions/31947205/csrf-logs-in-only-the-first-time by cc-by-sa and MIT license