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);
        }

    }
}

 

 

반응형