Spring/spring security
Spring Security - LogoutFilter 란
개발 N년차
2021. 9. 10. 00:32
반응형
- LogoutFilter 란-
LogoutFilter란 로그아웃에 대한 처리를 담당하는 필터로 사용자가 로그아웃 요청을 했을 경우에만 적용되는 필터이다.
LogoutFilter는 세션 무효화, 인증 토큰 삭제, SecurityContext에서 해당 토큰 삭제, 쿠키 삭제 및 로그인 페이지로 리다이렉트를 시켜주는 기능이 있다.
LogoutFilter의 필터 기능이 구현된 코드를 보면 아래와 같다.
private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
if (this.requiresLogout(request, response)) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (this.logger.isDebugEnabled()) {
this.logger.debug(LogMessage.format("Logging out [%s]", auth));
}
this.handler.logout(request, response, auth);
this.logoutSuccessHandler.onLogoutSuccess(request, response, auth);
} else {
chain.doFilter(request, response);
}
}
우선 requiresLogout를 호출해서 해당 요청이 로그아웃에 대한 요청인지를 판단 한다.
그 후 SecurityContext 안에 저장되어 있는 인증 객체를 가져온 후 logout handler를 통해 로그아웃 로직을 진행 후 로그아웃에 이상이 없다면 LogoutSuccessHandler를 통하여 로그아웃 성공 시 일어나는 이벤트를 실행한다.
LogoutFilter에 logout handler는 기본적으로 CompositeLogoutHandler 클래스가 기본으로 들어가는데 이 클래스는 생성자를 통해 생성될 때 LogoutHandler라는 인터페이스를 구현한 객체를 List형태로 받아 저장하고 있다가 logout 메소드를 호출 시 iterator를 통하여 모든 구현된 객체의 logout 메소드를 실행 시켜준다.
public final class CompositeLogoutHandler implements LogoutHandler {
private final List<LogoutHandler> logoutHandlers;
public CompositeLogoutHandler(LogoutHandler... logoutHandlers) {
Assert.notEmpty(logoutHandlers, "LogoutHandlers are required");
this.logoutHandlers = Arrays.asList(logoutHandlers);
}
// ....
// 생략
// ....
public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
Iterator var4 = this.logoutHandlers.iterator();
while(var4.hasNext()) {
LogoutHandler handler = (LogoutHandler)var4.next();
handler.logout(request, response, authentication);
}
}
}
반응형