- 로그아웃 요청을 보냄
- Spring Security 가 다음 작업을 진행한다.
- 세션을 무효화
- 인증 토큰을 삭제 - SecurityContext
- 쿠키 정보 삭제
- 로그인 페이지로 리다이렉트 처리
http.logout() // 로그아웃 기능이 작동
.logoutUrl("/logout") // UI
.logoutSuccessUrl("/login") // 로그아웃 성공 후 이동 페이지
.deleteCookies("JSESSIONID", "remember-me") // 로그아웃 후 삭제할 쿠키 설정
// 로그아웃이 수행될 때, 세션 무효화/인증 토큰 삭제 등을 기본적으로 제공하지만 사용자 정의로 작업할 내용이 있을 경우 설정
.addLogoutHandler(new LogoutHandler() {
@Override
public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
HttpSession session = request.getSession();
session.invalidate(); // 세션 무효화
}
})
// 로그아웃이 성공했을 때 작업 설정
.logoutSuccessHandler(new LogoutSuccessHandler() {
@Override
public void onLogoutSuccess(HttpServeletRequest request, HttpServletResponse, Authentication authentication) throws Exception {
response.sendRedirect("/login");
}
});
기본적으로 Security 가 로그아웃을 처리할 때는 기본적으로 POST 방식으로 처리되지만 GET 방식으로 설정할 수 있다.
- 로그아웃을 요청한다.
- 로그아웃 필터가 요청을 받아 해당 요청이 /logout 인지 체크한다.
- 일치하지 않으면 로그아웃 처리하지 않고 그 다음 필터로 이동한다.
- 일치하면 로그아웃필터가 시큐리티 컨텍스트로부터 Authentication 객체를 꺼내와서 로그아웃 핸들러에게 전달한다.
- 로그아웃 필터는 여러 개의 로그아웃 핸들러를 가지고 있는 데 그 중에 SecurityContextLogoutHandler 가 세션을 무효화하고, 쿠키를 삭제하고, 시큐리티 컨텍스트 객체를 삭제하고, 인증 객체도 null 로 초기화 한다.
- 로그아웃 필터가 성공적으로 종료되면 SimpleUrlLogoutSuccessHandler을 호출해서 로그인 페이지로 이동하도록 처리한다.