Spring-Security
logout()
neal89
2025. 5. 23. 22:31
📌 로그아웃 처리 흐름
- 클라이언트 요청
클라이언트가 로그아웃 요청을 보냅니다. (예: POST /logout) - LogoutFilter 진입
LogoutFilter가 요청을 가로챕니다. - RequestMatcher 확인
설정한 URL 및 HTTP 메서드와 일치하는지 확인합니다. - LogoutHandler 실행
- 세션 무효화
- 쿠키 삭제
- SecurityContextHolder 클리어 등
- LogoutSuccessHandler 실행
로그아웃 성공 후 리다이렉션 또는 후속 처리 수행
⚙️ logout() 설정 옵션 요약
메서드 | 설명 |
logoutUrl() | 로그아웃 처리 URL 지정 (기본 /logout) |
logoutRequestMatcher() | HTTP 메서드 및 경로를 커스터마이징 |
logoutSuccessUrl() | 로그아웃 후 리다이렉션 URL |
logoutSuccessHandler() | 커스텀 성공 핸들러 지정 |
addLogoutHandler() | 추가 작업을 위한 핸들러 삽입 |
invalidateHttpSession() | 세션 무효화 여부 (기본값: true) |
clearAuthentication() | 인증 객체 클리어 여부 (기본값: true) |
deleteCookies() | 삭제할 쿠키 지정 (기본값: 아무것도 삭제하지 않음) |
🧪 로그아웃 설정 예제
http
.logout()
.logoutUrl("/logout")
.logoutRequestMatcher(new AntPathRequestMatcher("/logout", "POST"))
.logoutSuccessUrl("/login?logout")
.invalidateHttpSession(true)
.clearAuthentication(true)
.deleteCookies("JSESSIONID")
.addLogoutHandler(new CustomLogoutHandler())
.logoutSuccessHandler(new CustomLogoutSuccessHandler());
❓ 추가 질문 정리
✅ Q1. 쿠키, 세션, 인증 객체를 지우는 설정은 디폴트로 true인가요?
- clearAuthentication()
기본값은 true. 따로 설정하지 않아도 Authentication 객체는 로그아웃 시 클리어됩니다. - 세션 무효화 (invalidateHttpSession)
기본적으로 true입니다. 세션이 자동으로 무효화됩니다. - 쿠키 삭제 (deleteCookies)
기본값은 삭제하지 않음. JSESSIONID와 같은 쿠키를 삭제하려면 명시적으로 deleteCookies("JSESSIONID")처럼 설정해야 합니다.
✅ Q2. addLogoutHandler()로 핸들러를 추가하는 이유는?
- Spring Security는 이미 내부적으로 기본 LogoutHandler들을 갖고 있습니다.
- 개발자는 이 동작을 덮어쓰는 것이 아니라 추가하는 방식으로 커스텀 로직을 삽입할 수 있습니다.
- 예: 로그아웃 시 사용자 로그 저장, 외부 API 호출, 캐시 삭제 등
✅ Q3. 로그아웃 URL은 왜 모든 사용자에게 접근 허용해야 하나요?
- 로그아웃 URL은 인증되지 않은 사용자에게도 접근 가능해야 합니다.
- 인증 만료 또는 예외 상황에서 로그아웃 요청이 불가능하면 아이러니한 보안 문제가 발생합니다.
- Spring Security는 기본적으로 permitAll()을 적용하여 로그아웃 URL에 대해 모든 접근을 허용합니다.