경주장

[인증 API]로그아웃과 LogoutFilter 본문

스프링/스프링 시큐리티

[인증 API]로그아웃과 LogoutFilter

달리는치타 2022. 2. 2. 20:54

로그아웃은

1. 세션 무효화

2. 인증 토큰 삭제

3. 쿠키 정보 삭제

4. 로그인 페이지로 리디렉트

의 순서로 이루어 진다.

 

http.logout(): 로그아웃 기능이 작동한다

http.logout()
        .logoutUrl("/logout")                       //로그아웃 처리URL
        .logoutSuccessUrl("/login")                 //로그아웃 성공 후 이동 페이지
        .deleteCookies("JSESSIONID", "remember-me") //로그아웃 후 삭제 쿠키 이름
        .addLogoutHandler(logoutHandler())          //로그아웃 핸들러
        .logoutSuccessHandler(logoutSuccessHandler());  //로그아웃 성공 핸들러

 

다른 기능들은 직관적이지만 

logoutHandler와 logoutSuccesshandler의 두가지 핸들러가 하는 역할이 꽤 모호하다.

http.logout()
        .logoutUrl("/logout")                       //로그아웃 처리URL
        .logoutSuccessUrl("/login")                 //로그아웃 성공 후 이동 페이지
        .deleteCookies("JSESSIONID", "remember-me") //로그아웃 후 삭제 쿠키 이름
        .addLogoutHandler((request, response, authentication) -> request.getSession().invalidate())          //로그아웃 핸들러
        .logoutSuccessHandler((request, response, authentication) -> response.sendRedirect("/login"));  //로그아웃 성공 핸들러

위와 같은 활용예시에서도 심지어 받는 인자까지 모두 일치하는 것을 확인 할 수 있다.

 

익명클래스로 풀고 조금 살펴보니 SuccessHandler의 경우 Exception을 던질 수 있지만 그냥 logoutHandler의 경우 exception을 던질 수 없는 차이가 있다. 그래서 예외가 발생할 수 있는 sendRedirect와 같은 구문은 logoutHandler에서 수행 될수 없는 차이가 있는 것을 알 수 있었다.

 

1. 요청 url이 logoutProcessingUrl인지 확인 일치하지 않으면 다음 filter호출

2. SecrutiyContext로 부터 Authentication객체를 꺼내와 LogoutHandler에게 전달한다.

3. LogoutHandler는 세션무효화, 쿠키 삭제, clearContext()와 같은 역할을 수행한다.

4. Handler의 호출까지 완료가 되면 필터는 LogoutSuccessHandler를 통해 redirection과 같은 후속 처리를 한다.