복붙노트

[SPRING] POST 요청에 잘못된 CSRF 토큰이 있습니다.

SPRING

POST 요청에 잘못된 CSRF 토큰이 있습니다.

개요 Spring 보안에 기반한 인증으로 API 게이트웨이를 사용할 예정입니다. 나는 https://spring.io/guides/tutorials/spring-security-and-angular-js/ 링크에있는 단계를 수행하여 해당 github 프로젝트의 "pair-double"모듈을 기반으로 프로젝트를 만들었습니다 https://github.com/spring-guides/tut-spring-security-and-angular-js.git.

문제 문제는 POST 요청이 서버에 제출되면 "잘못된 CSRF 토큰"예외가 발생한다는 사실입니다. 발생 된 예외의 예는 다음과 같습니다.

{
  "timestamp": 1461714933215,
  "status": 403,
  "error": "Forbidden",
  "message": "Invalid CSRF Token '1cdc44ad-43cb-44e6-b903-bec24fe903fd' was found on the request parameter '_csrf' or header 'X-XSRF-TOKEN'.",
  "path": "/ui/test"
}

나는 문제를 다시 점검했지만 아무 소용이 없는지 확인했다. 이 시나리오를 우편 배달부에서 테스트하고 'X-XSRF-TOKEN'을 POST 요청의 헤더로 설정했지만 아무 일도 없었습니다.

따라서 스프링 보안 접근법을 처음 사용하는 사람이라면 누구나 나에게 해결책을 제안 할 수 있다면 감사하겠습니다.

해결법

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

    1.해당 프로젝트의 보안 구성을 보면 XSRF-TOKEN 쿠키가 필터를 사용하여 각 요청에 추가된다는 것을 알 수 있습니다. 따라서해야 할 일은 해당 쿠키의 가치를 받아 X-XSRF-TOKEN 헤더에 저장하는 것입니다. 이 경우를 테스트하기 위해 유사한 보안 구성을 가진 테스트 프로젝트를 만들었습니다. 전체 코드는 다음과 같습니다.

    해당 프로젝트의 보안 구성을 보면 XSRF-TOKEN 쿠키가 필터를 사용하여 각 요청에 추가된다는 것을 알 수 있습니다. 따라서해야 할 일은 해당 쿠키의 가치를 받아 X-XSRF-TOKEN 헤더에 저장하는 것입니다. 이 경우를 테스트하기 위해 유사한 보안 구성을 가진 테스트 프로젝트를 만들었습니다. 전체 코드는 다음과 같습니다.

    @RestController
    @SpringBootApplication
    public class TestApplication extends WebSecurityConfigurerAdapter {
    
        public static void main(String[] args) {
            SpringApplication.run(TestApplication.class, args);
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                .antMatchers("/**")  // Disable authentication for all requests.
                .permitAll()
                .and()
                .csrf().csrfTokenRepository(csrfTokenRepository())
                .and()
                .addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class); // Register csrf filter.
        }
    
        private Filter csrfHeaderFilter() {
            return new OncePerRequestFilter() {
    
                @Override
                protected void doFilterInternal(HttpServletRequest request,
                                                HttpServletResponse response,
                                                FilterChain filterChain) throws ServletException, IOException {
    
                    CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
                    if (csrf != null) {
                        Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
                        String token = csrf.getToken();
                        if (cookie == null || token != null
                                && !token.equals(cookie.getValue())) {
    
                            // Token is being added to the XSRF-TOKEN cookie.
                            cookie = new Cookie("XSRF-TOKEN", token);
                            cookie.setPath("/");
                            response.addCookie(cookie);
                        }
                    }
                    filterChain.doFilter(request, response);
                }
            };
        }
    
        private CsrfTokenRepository csrfTokenRepository() {
            HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
            repository.setHeaderName("X-XSRF-TOKEN");
            return repository;
        }
    
        @RequestMapping(value = "/test", method = RequestMethod.GET)
        public String testGet() {
            return "hello";
        }
    
        @RequestMapping(value = "/test", method = RequestMethod.POST)
        public String testPost() {
            return "works!";
        }
    }
    

    우편 발송자에게이를 테스트하려면 다음을 수행하십시오.

  2. from https://stackoverflow.com/questions/36878189/invalid-csrf-token-in-post-request by cc-by-sa and MIT license