프로젝트에서 직접 /logout
API를 생성한 적이 없는데 호출되고, 커스텀하게 사용하지 않았을 때 세션만 제거하고 쿠키는 제거하지 않아서 Spring Security의 /logout
동작 과정을 살펴보게 되었습니다.🙂
Spring Security의 로그아웃 API 살펴보기
Spring Security는 GET /logout
과 POST /logout
을 지원합니다.
/logout
을 호출했을 때 springframework.security.web.authentication.logout.LogoutFilter.java
의 doFilter
가 수행됩니다.
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.java
의 logout
를 다시 살펴보면, CookieCleaningLogoutHandler
가 추가된 것을 확인할 수 있습니다.
이제, /logout
API를 호출하면 쿠키도 제거됩니다!😎
'Study😜' 카테고리의 다른 글
로컬에서 sonarqube 실행해보기 (0) | 2025.02.14 |
---|---|
CSRF(Cross-Site Request Forgery) (1) | 2025.01.24 |
Spring Security에서 WebSecurityConfigurerAdapter가 Deprecated된 이유와 새로운 구성 방법 (0) | 2024.12.28 |
[Docker] SpringBoot + MySQL + Docker 프로젝트 실행하기 (1) | 2024.09.17 |
AWS lambda에 Springboot 프로젝트를 Docker로 배포하기 (0) | 2024.09.07 |