본문 바로가기
Framework/Spring Framework

[Spring Boot] Spring Security 로그아웃 처리

by 원동호 2021. 5. 2.
반응형

HttpSecurity

@Override
protected void configure(HttpSecurity http) throws Exception {
    protected void configure(HttpSecurity http) throws Exception {
    http.logout() // 로그아웃 처리
        .logoutUrl("/logout") // 로그아웃 처리 URL
        .logoutSuccessUrl("/login") // 로그아웃 성공 후 이동 URL
        .deleteCookies(" JESSIONID", " remember-me ") // 로그아웃 후 쿠키 삭제
        .addLogoutHandler(logoutHandler()) // 로그아웃 후 핸들러
        .logoutSuccessHandler(logoutSuccessHandler()); // 로그아웃 성공 후 핸들러
}

원칙적으로 로그아웃 처리 시 POST 방식으로만 처리된다.

로그아웃 처리 시 여러개의 로그아웃 핸들러가 있는데 그 중에서 세션에서 무효화 시키는 등 별도의 핸들러가 존재하지만 별도로 커스텀 로그아웃 핸들러 인터페이스를 구현해서 처리하고 싶으면 addLogoutHandler()에 method명을 적어주면 된다.

 

처리 PROCESS

 

1. LogoutFilter

→ POST 방식으로 로그아웃 요청을 받는다.

 

2. AntPathRequestMatcher(/logout)

→ 요청 정보 URL(Form tag의 action)이 매칭 되는지 확인한다. ( default는 logout이다.)

 

3. Authentication

→ LogoutFilter가 SecurityContext객체로 부터 인증 객체를 가져와서 SecurityContextLogoutHandler로 전달한다.

 

4. SecurityContextLogoutHandler

  • 세션무효화
  • 쿠키삭제
  • SecurityContextHolder.clearContext()

위 handler를 이용하면 GET방식으로도 로그아웃을 처리할 수 있음.

 

5. SimpleUrlLogoutSuccessHandler

→ LogoutFilter가 성공적으로 로그아웃을 처리하면 해당 클래스를 호출해서 로그인 페이지로 이동 시킨다.

 

로그아웃 PROCESS

LogoutFilter.java

private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
	if (requiresLogout(request, response)) {
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		if (this.logger.isDebugEnabled()) {
			this.logger.debug(LogMessage.format("Logging out [%s]", auth));
		}
		//spring security에서는 logout handler가 기본적으로 4가지 구현되어있음.
		this.handler.logout(request, response, auth);
		this.logoutSuccessHandler.onLogoutSuccess(request, response, auth);
		return;
	}
	chain.doFilter(request, response);
}

0번은 본인이 구현한 Config 설정이며 1~4번이 기본적으로 Spring Security에서 제공하는 Handler이다.

반응형

댓글