복붙노트

[SPRING] 스프링 csrf 토큰 변수의 이름 바꾸기

SPRING

스프링 csrf 토큰 변수의 이름 바꾸기

내 응용 프로그램이 다른 포털 응용 프로그램에서 실행됩니다. 둘 다 봄에 구현되며 둘 다 csrf 보안을 사용합니다.

기본적으로 세션에서 csrf 토큰의 이름이 변경되므로 토큰이 충돌없이 작동 할 수 있습니다. 지금까지 시도한 것은 다른 토큰 리포지토리를 만들고 보안 구성 클래스에서 매개 변수 이름과 세션 특성 이름을 변경하려고하는 것입니다.

final HttpSessionCsrfTokenRepository tokenRepository = new HttpSessionCsrfTokenRepository();
tokenRepository.setHeaderName("TOOLBIZ-CSRF-TOKEN");
tokenRepository.setParameterName("toolbiz_csfr");
//tokenRepository.setSessionAttributeName("toolbiz_csrf");

요청을하면 Spring은이 새로운 설정을별로 좋아하지 않으며 로그는 다음 줄을 생성합니다.

Invalid CSRF token found

더 무엇을해야합니까? 내가 놓친 게 있니?

해결법

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

    1.이것은 나를 위해 일한 것입니다 :

    이것은 나를 위해 일한 것입니다 :

    @Configuration
    @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
    public class OptosoftWebfrontSecurity extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/assets/**").permitAll()
                .anyRequest().authenticated().and().formLogin().and()
                .httpBasic().disable()
                .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class)
                .csrf().csrfTokenRepository(csrfTokenRepository());
    }
    
    private CsrfTokenRepository csrfTokenRepository() {
        HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
        repository.setHeaderName("X-XSRF-TOKEN");
        repository.setParameterName("_csrf");
        return repository;
    }
    
    }
    

    그리고 필터 : -

    public class CsrfHeaderFilter extends 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())) {
                    cookie = new Cookie("XSRF-TOKEN", token);
                    cookie.setPath("/");
                    response.addCookie(cookie);
                }
            }
            filterChain.doFilter(request, response);
        }
    }
    

    WebSecurityConfigurerAdapter # configure 메소드를 대체 했습니까?

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

    2.헤더의 이름을 바꾸기 전에 보유하고있는 쿠키를 삭제하십시오. 모든 것이 잘 설정된 동일한 문제가 있었지만 브라우저의 오래된 쿠키가 필터 기능을 기본적으로 쓸모 없게 만들었습니다.

    헤더의 이름을 바꾸기 전에 보유하고있는 쿠키를 삭제하십시오. 모든 것이 잘 설정된 동일한 문제가 있었지만 브라우저의 오래된 쿠키가 필터 기능을 기본적으로 쓸모 없게 만들었습니다.

  3. from https://stackoverflow.com/questions/31293303/renaming-spring-csrf-token-variable by cc-by-sa and MIT license