Spring Security 의 로그아웃 과정
-
유저가 request("로그아웃경로") 요청
-
SpringSecurity 가 세션을 무효화(SESSIONID 삭제, Invalidate) , 인증토큰삭제(UsernamePasswordAthenticationToken), 관련된 쿠키(remeber-me 등)를 제거.
-
지정한 경로로 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의 작동
-
로그아웃 요청이 오면 LogoutFilter 가 요청을 받음
-
LogoutFilter는 사용자의 요청이 지정한 Url 인지 판단을 위해 AntPathRequestMatcher에게 검증을 시킴
-
AntPathRequestMatcher는 로그아웃 Url이 맞지않으면 다른 필터로 chain.doFilter()
-
알맞다면 LogoutFilter는 Session 에서 SecurityContext를 가져와 Authentication 객체를 꺼내어 LogoutHandler에게 넘긴다.
-
LogoutFilter 가 가진 여러 핸들러 중에 SecurityContextLogoutHandler 가 이를 넘겨받는다.
-
SecurityContextLogoutHandler 는 Session을 Invalidate, Cookies를 제거(setMaxAge) , SecurityContextHolder.clearContext() 를 작동하여 SecurityContext를 삭제, Authentication 객체에 null 값을 지정함.
-
SecurityContextLogoutHandler 가 작업을 마치면 LogoutFilter는 SimpleUrlLogoutSuccessHandler 를 호출
-
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 |