Spring-Security

logout()

neal89 2025. 5. 23. 22:31

📌 로그아웃 처리 흐름

  1. 클라이언트 요청
    클라이언트가 로그아웃 요청을 보냅니다. (예: POST /logout)
  2. LogoutFilter 진입
    LogoutFilter가 요청을 가로챕니다.
  3. RequestMatcher 확인
    설정한 URL 및 HTTP 메서드와 일치하는지 확인합니다.
  4. LogoutHandler 실행
    • 세션 무효화
    • 쿠키 삭제
    • SecurityContextHolder 클리어 등
  5. 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에 대해 모든 접근을 허용합니다.