Study😜

Spring Security에서 /logout 동작 과정

내일이야 2025. 1. 24. 16:29

프로젝트에서 직접 /logout API를 생성한 적이 없는데 호출되고, 커스텀하게 사용하지 않았을 때 세션만 제거하고 쿠키는 제거하지 않아서 Spring Security의 /logout 동작 과정을 살펴보게 되었습니다.🙂


Spring Security의 로그아웃 API 살펴보기

Spring Security는 GET /logoutPOST /logout을 지원합니다.

 

/logout을 호출했을 때 springframework.security.web.authentication.logout.LogoutFilter.javadoFilter가 수행됩니다.

doFilter에서 logout과 onLogoutSuccess를 주목하면 됩니다.

 

this.handler.logout(request, response, auth);

  • springframework.security.web.authentication.logout.CompositeLogoutHandler.java의 logout을 수행합니다.

로그아웃 API를 커스텀하게 사용하지 않았을 때, this.logoutHandlers는 2개의 Handler를 가지고 있습니다.

  • SecurityContextLogoutHandler
    • 세션 무효화
    • SecurityContext 삭제
  • LogoutSuccessEventPublishingLogoutHandler

 

SecurityContextLogoutHandler의 logout 함수를 보겠습니다.

72라인을 보면 /logout을 호출했을 때 session을 무효화시키는 것을 확인할 수 있습니다. 그리고 securityContext를 삭제하는 것도 확인할 수 있습니다.

즉, SecurityContextLogoutHandler가 하는 일은 세션을 무효화하고 securityContext를 삭제합니다.


커스텀 로그아웃 API 구현

이렇게만 살펴봐도 쿠키를 제거하는 곳은 찾아볼 수 없었습니다.

그래서 /logout을 커스텀하게 구현하고 다시 CompositeLogoutHandler.java를 살펴보겠습니다.

 

/logout을 커스텀하기 위해서 각자 만들었던 Filter에서 아래와 같이 작성하면 됩니다.

(저는 securityFilterChain을 수정했습니다. 쿠키제거를 수행하는 코드가 필요했기 때문에 아래 코드처럼 deleteCookies를 추가했습니다.)

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
    
            // 생략...

            .logout(httpSecurityLogoutConfigurer -> {
                httpSecurityLogoutConfigurer.logoutUrl("/logout");
                // 쿠키 제거
                httpSecurityLogoutConfigurer.deleteCookies("token");
            })
            
            // 생략...

}

 

 

커스텀 이후 springframework.security.web.authentication.logout.CompositeLogoutHandler.javalogout를 다시 살펴보면, CookieCleaningLogoutHandler가 추가된 것을 확인할 수 있습니다. 

 

이제, /logout API를 호출하면 쿠키도 제거됩니다!😎