3. Logout 처리 > LogoutFilter

| Logout 처리

http.logout() : 로그아웃 기능 작동

http.logout()                        // 로그아웃 처리
    .logoutUrl("/logout")                // 로그아웃 처리 URL
    .logoutSuccessUrl("/login")            // 로그아웃 성공 후 이동페이지
    .deleteCookies("JSESSIONID“, "remember-me")     // 로그아웃 후 쿠키 삭제
    .addLogoutHandler(logoutHandler())                 // 로그아웃 핸들러
    .logoutSuccessHandler(logoutSuccessHandler()) // 로그아웃 성공 후 핸들러

LogoutFilter

  • POST방식으로 처리한다
  • AutPathRequestMatcher(/logout) 로 logout 링크와 일치하지 않으면 다음 필더 진행
  • 링크가 맞으면 SecurityContext로 부터 Authentication객체를 꺼내온다
  • SecurityCotextLogoutHandler가 세션무효화, 쿠키삭제 등의 처리를 한다
  • 모든 처리를 마치고 SimpleUrlLogoutSuccssHandler를 호출해 login페이지로 간다.

 

💻 LogoutFilter.java

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

 

3. 디버그로 분석

package kyh.security.basicsecurity;


@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //인가 정책
        http
                .authorizeRequests()
                .anyRequest().authenticated();

        //인증 정책
        http
                .formLogin()
                ;

        http
                .logout()
                .logoutUrl("/logout")
                .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");
                
                
    }
}

 

댓글

Designed by JB FACTORY