본문 바로가기

spring security

로그 아웃 - logout()

정수원님의 **스프링 시큐리티 완전 정복** 강의 내용 기록입니다 !!

 

 

 

로그아웃
  • 스프링 시큐리티는 기본적으로 DefaultLogoutPageGeneratingFilter를 통해 로그아웃 페이지를 제공하며 "GET  /logout" URL로 접근이 가능함 → 로그아웃 버튼 클릭을 통해 "POST  /logout"
  • 로그아웃 실행은 기본적으로 "POST  /logout"으로만 가능
    • CSRF 기능을 비활성화 or RequestMatcher를 사용 ≫ GET, PUT, DELETE 모두 가능
  • 로그아웃 필터를 거치지 않고 스프링 MVC에서 커스텀하게 구현할 수 있음
  • 로그인 페이지가 커스텀하게 생성될 경우 로그아웃 기능도 커스텀하게 구현해야 함

 

logout() API

  • logoutUrl : 로그아웃이 발생하는 URL 지정
    • 기본값은 "/logout"
  • logoutRequestMatcher : 로그아웃이 발생하는 RequestMatcher을 지정
    • logoutUrl보다 우선적
    • Method를 지정하지 않으면 어떤 HTTP 메서드로 요청되어도 로그아웃 할 수 있음
  • logoutSuccessUrl : 로그아웃이 발생한 후 리다이렉션 될 URL
    • 기본값은 "/login?logout"
    • 지정된 url은 인증되지 않은 사용자도 접근이 가능해야 함 ≫ auth.requestMatchers("/loginSuccess").permitAll()
  • logoutSuccessHandler : 사용할 LogoutSuccessHandler를 설정
    • 이것이 지정되면 logoutSuccessUrl은 무시됨
  • deleteCookies : 로그아웃 성공 시 제거될 쿠키의 이름 지정
  • invalidateHttpSession : HttpSession을 무효화
    • 기본값은 true
  • clearAuthentication : 로그아웃 시 SecurityContextLogoutHandler가 인증(Authentication)을 삭제해야 하는지 여부
    • 기본값은 true
  • addLogoutHandler : 기존 로그아웃 핸들러 뒤에 새로운 LogoutHandler를 추가
  • permitAll : logoutUrl(), RequestMatcher()의 URL에 대한 모든 사용자의 접근을 허용

  • invalidateHttpSession, clearAuthentication 등은 웬만하면 설정하지 않음
  • 로그아웃 이후 리다이렉트 url만 지정하려면 logoutSuccessUrl로 / 특정 작업을 수행하기 위해서는 logoutSuccessHandler

 

LogoutFilter

 

client

↓  Post  /logout

LogoutFilter

RequestMatcher : 요청 정보가 매칭되는지 확인

- Http Method 확인 (Post가 맞는지)

- url 확인 ("/logout"이 맞는지)

Yes

LogoutHandler : 여러 역할의 Handler 존재
- 하나씩 돌면서 역할 수행
- SecurityConfig에서 addLogoutHandler를 추가했다면 해당 Handler도 포함하여 수행

LogoutSuccessHandler
- SecurityConfig에서 logoutSuccessHandler를 추가했다면 해당 Handler 수행

 

No

chain.doFilter

요청정보가 매칭되지 않으면 다음 필터로 패스

 

 

동작 과정

 

1. 로그아웃 요청 : GET  /logout

  • 스프링에서 기본으로 제공하는 Logout 페이지로 이동
  • Log Out 버튼을 누르면 POST  /logout으로 서버에 요청됨

2. Log Out 버튼 클릭

 

3. logoutSuccessUrl에 설정한 url이 있다면 해당 url로 리다이렉트