이 글은 정수원님의 Infrean 강의를 학습한 내용을 정리하여 작성합니다.
인증 API - Logout
http.logout() // 로그아웃 기능이 작동한다.
- 스프링 시큐리티는 기본적으로 POST 방식을 사용해 로그아웃을 수행한다.
실습
// 스프링 시큐리티는 원칙적으로 GET 방식으로 로그아웃을 수행한다.
http
.logout() // 로그아웃 처리
.logoutUrl("/logout") // 로그아웃 처리 URL
.logoutSuccessUrl("/login") // 로그아웃 성공 후 이동페이지
.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(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
response.sendRedirect("/login");
}
})
.deleteCookies("remember-me"); // 로그아웃 후 쿠키 삭제
실행
- 기본적으로 로그아웃이 POST 방식으로 수행되는 것을 확인할 수 있다.
- 정상적으로 로그아웃이 수행되고 로그인 페이지로 이동한다.
인증 API - LogoutFilter
- POST 방식으로 로그아웃을 요청한다.
- LogoutFilter는 로그아웃 요청이 '/logout' 인지 AntPathRequestMatcher가 검사한다.
- 일치하지 않으면 다음 필터 chain.doFilter가 실행되며 로그아웃을 수행하지 않는다.
- 일치하면 SecurityContext 객체로부터 인증 객체를 가져온다.
- LogoutHandler (SecurityContextLogoutHandler)에게 Authentication 객체를 전달한다.
- 세션 무효화
- 쿠키 삭제
- SecurityContextHolder.clearContext() 메소드를 수행해 SecurityContext 객체를 삭제한다.
- 또한, 인증 객체 또한 null로 초기화한다.
- SecurityContextLogoutHandler를 사용해 GET 방식으로 로그아웃 할 수 있다.
- 로그아웃 핸들러가 정상적으로 종료되면 SimpleUrlLogoutSuccessHandler 클래스를 호출해 로그인 페이지로 이동한다.
'스프링 시큐리티 > 스프링 시큐리티 기본 API 및 Filter 이해' 카테고리의 다른 글
Remember Me 인증 필터: RememberMeAuthenticationFilter (0) | 2023.01.10 |
---|---|
Remember Me 인증 (0) | 2023.01.10 |
FormLogin 인증 필터: UsernamePasswordAuthenticationFilter (0) | 2023.01.09 |
인증 API - Form 인증 (1) | 2023.01.09 |
HTTP Basic 인증, BasicAuthenticationFilter (0) | 2023.01.09 |