springframework/시작하자SpringSecurity

5.LogoutFilter

Jungsoomin :) 2020. 9. 19. 18:33

Spring Security 의 로그아웃 과정

 

  1. 유저가 request("로그아웃경로") 요청

  2. SpringSecurity 가 세션을 무효화(SESSIONID 삭제, Invalidate) , 인증토큰삭제(UsernamePasswordAthenticationToken), 관련된 쿠키(remeber-me 등)를 제거.

  3. 지정한 경로로 Redirect 시킴.


로그아웃 처리를 위한 API들

        http.logout() : 로그아웃 처리를 담당

 

Logout 처리를 위한 하위 API

  • logoutUrl(url) : 로그아웃 처리 url을 지정, default = /logout

  • logoutSuccessUrl(url) : 로그아웃 성공시 이동 경로, default = /login

  • deleteCookies(cookieName...) : 해당 쿠키들을 삭제

  • addLogoutHandler(LogoutHandler) : 로그아웃시 스프링시큐리티가 기본적으로 제공하는 LogoutHandler 구현체에서 세션을 무효화, 인증토큰을 무효화 , 쿠키삭제 등을 처리함 , 이를 구현하여 원하는 부가처리를 함

  • addLogoutSuccessHandler(LogoutSuccessHandler) : 로그아웃 성공시 후속 작업을 위한 LogoutSuccessHandler 구현체를 등록

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http//인가
                .authorizeRequests() //요청들에 대한
                .anyRequest().authenticated();//어느 요청이든. 인증을한다.
        http//인증
                .formLogin();//폼로그인 방식으로 인증작업을 하겠다.

        http//로그아웃
                .logout() // 로그아웃 기능을 활성화
                .logoutUrl("/logout") // form[action=/logout] 원칙적으로 POST방식
                .logoutSuccessUrl("/login") // 로그아웃 성공시 이동할 Url
                .addLogoutHandler(new LogoutHandler() { // 로그아웃처리에 작업이 필요할 경우
                    @Override
                    public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
                        HttpSession httpSession = request.getSession();
                        httpSession.invalidate();
                    }
                })
                .logoutSuccessHandler(new LogoutSuccessHandler() { // 로그아웃 성공 후 작업이 필요할 경우
                    @Override
                    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
                        response.sendRedirect("/login");
                    }
                })
                .deleteCookies("remember-me"); // 해당 이름의 쿠키를 삭제한다.
        ;
    }
}

 

SpringSecurity원칙적으로 POST 방식의 로그아웃을 체제를 가진다. GET 방식으로 요청하면 에러가 발생하며 GET 방식으로도 구현가능하나 원칙적으로 POST 방식임을 기억해야만한다.


LogoutFilter의 작동

 

  1. 로그아웃 요청이 오면 LogoutFilter 가 요청을 받음

  2. LogoutFilter는 사용자의 요청이 지정한 Url 인지 판단을 위해 AntPathRequestMatcher에게 검증을 시킴

  3. AntPathRequestMatcher는 로그아웃 Url이 맞지않으면 다른 필터로 chain.doFilter()

  4. 알맞다면 LogoutFilterSession 에서 SecurityContext를 가져와 Authentication 객체를 꺼내어 LogoutHandler에게 넘긴다.

  5. LogoutFilter 가 가진 여러 핸들러 중에 SecurityContextLogoutHandler 이를 넘겨받는다.

  6. SecurityContextLogoutHandlerSession을 Invalidate, Cookies를 제거(setMaxAge) , SecurityContextHolder.clearContext() 를 작동하여 SecurityContext를 삭제, Authentication 객체에 null 값을 지정함.

  7. SecurityContextLogoutHandler 가 작업을 마치면 LogoutFilterSimpleUrlLogoutSuccessHandler 를 호출

  8. SimpleUrlLogoutSuccessHandler로그인 경로로 Redirect .

 

 

 

'springframework > 시작하자SpringSecurity' 카테고리의 다른 글

7.RememberMeAuthenticationFilter  (0) 2020.09.19
6.Remember Me 인증  (0) 2020.09.19
4.UsernamePasswordAuthenticationFilter  (0) 2020.09.19
3.Form Login 인증  (0) 2020.09.19
2.사용자 정의 보안 구현  (0) 2020.09.18