caffeine-library / pro-spring-5

🌱 전문가를 위한 스프링5를 읽는 스터디
5 stars 0 forks source link

[question] csrf.disable() 하지 않을 시 `/logout` 동작하지 않음 #97

Closed binchoo closed 2 years ago

binchoo commented 2 years ago

질문

[singer-webapp-boot] 프로젝트에서 csrf 지원을 활성했을 때 logout이 동작하지 않네요. 이런 효과가 나타나는 연관성을 알고 싶습니다.

상세 내용

  1. 시큐리티 설정> http.csrf.disable() 하지 않음> 즉 csrf 지원 활성화 함.
    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/*").permitAll()
                .and()
                .authorizeRequests().antMatchers("/singers/**").authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/singers");
                //.and()
                //.csrf().disable();
    }
    }
  2. /singers 페이지> 임의 뷰 클릭> /login 인터셉트된 화면> user / user 로 로그인> 주소창으로 /logout 수행 GIF 2021-12-12 오후 1-16-22

이렇게 csrf 지원을 활성 후 /logout이 동작하지 않는 모습입니다. CSRF 토큰의 정의와 사용법 그리고 스프링 시큐리티의 CSRF 지원이란 무엇이며. 해당 옵션 활성시 /logout이 동작하지 않게 된 이유를 알아야 할 것 같습니다.

연관 챕터

93

참고

@caffeine-library/readers-pro-spring-5

binchoo commented 2 years ago

CSRF 공격을 막기 위해 GET 요청을 막고 있을 가능성이 있다.

예제는 GET 메서드로 logout을 요청했기 때문에.. POST 요청 실험이 필요하다.

LogoutConfigurer.java 코드 확인 시, POST 리퀘스트만 인식하는 점을 확인 가능하다.

image
binchoo commented 2 years ago

공식 문서에 따르면 [링크]

로그아웃 기능을 POST로만 제공한다면 CSRF 토큰이 반드시 요구되므로, 로그아웃 강제 공격을 방지할 수 있다는 점을 이유로 들고 있다. 100% ensure는 안 된다. 로그아웃 요청을 트리거하는 DOM 이벤트를 자바스크립트로 생성할 수만 있다면 악의적으로 로그아웃을 유발할 수 있음. (XSS) 아무튼 POST로 로그아웃을 제공하는 것이 보안 향상에는 도움이 된다. image

100 에서 CSRF 토큰을 통한 요청 보호 개념을 정리하고 이슈를 마칩니다.