[SPRING] POST 요청에 잘못된 CSRF 토큰이 있습니다.
SPRINGPOST 요청에 잘못된 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.해당 프로젝트의 보안 구성을 보면 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!"; } }
우편 발송자에게이를 테스트하려면 다음을 수행하십시오.
from https://stackoverflow.com/questions/36878189/invalid-csrf-token-in-post-request by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] spring-boot 기본 JSP 404 찾을 수 없음 (0) | 2019.05.21 |
---|---|
[SPRING] 스프링 부트 2로 업그레이드 한 후 ObjectMapper가 기본 생성자없이 역 직렬화 할 수 없습니다. (0) | 2019.05.21 |
[SPRING] 봄의 독서 요구 몸 (0) | 2019.05.21 |
[SPRING] Io 예외 : Oracle Cloud에서 Oracle 오류 ORA-12650 (0) | 2019.05.21 |
[SPRING] 별도의 jar에있는 스프링 MVC 정적 리소스 (0) | 2019.05.21 |