Logout 처리
클라이언트가 로그아웃 요청을 보내면 request(/logout) 스프링 시큐리티가 그 요청을 받고 로그아웃처리를 합니다
로그아웃 처리는 세션을 무효화하고, 인증 토큰 삭제(Security Context 삭제) , 쿠키 정보 삭제, 로그아웃이 성공하면 로그인 페이지로 이동하도록 처리하고 있습니다.
로그아웃을 하려면 다음과 같은 api를 사용해야 합니다.
protected void configure(HttpSecurity http) throws Exception {
http.logout() // 로그아웃 처리
.logoutUrl("/logout") // 로그아웃 처리 URL
.logoutSuccessUrl("/login") // 로그아웃 성공 후 이동페이지
.deleteCookies("JSESSIONID“, "remember-me") // 로그아웃 후 쿠키 삭제
.addLogoutHandler(logoutHandler()) // 로그아웃 핸들러
.logoutSuccessHandler(logoutSuccessHandler()) // 로그아웃 성공 후 핸들러
}
- http.logout() : 로그아웃 기능이 작동함
- . logoutUrl("/logout") : 로그아웃 처리 URL 이걸 변경하면 UI 쪽에서 요청 보내는 경로도 변경해주어야 한다.
- . logoutSuccessUrl("/login") : 로그아웃 성공 후 이동 페이지
- . deleteCookies("JSESSIONID “, "remember-me") : 로그아웃 후 쿠키 삭제
- . addLogoutHandler(logoutHandler()) : 로그아웃 핸들러, 로그아웃할 때 무슨 일을 처리하고 싶을 때 핸들러를 구현하면 된다.
- . logoutSuccessHandler(logoutSuccessHandler()) : 로그아웃 성공 후 핸들러, 성공 후 처리하고 싶은걸 logoutSuccessHandler을 구현하면 된다.
서버를 켜고 로그인을 한 후에 /logout으로 요청을 보내면 위와 같이 post방식의 logout 페이지를 제공해줍니다. 로그아웃을 해봅시다.
로그아웃을 하게 되면 위와 같이 브레이크 포인트를 걸고 디버그 모드로 실행하면 세션도 넘어온 후에 성공하고 /login페이지로 다시 돌아가는 것을 볼 수 있습니다.
Logout Filter
POST방식으로 해야 된다. GET방식으로 하면 메서드 오류를 내뱉는다.
그러면 LogoutFilter가 요청을 받아서 로그아웃 요청은 defalut가 /logout입니다. 요청이 맞는지 AntPathRequestMatcher가 검사를 합니다.
만약에 일치하지 않으면 그다음 필터로 이동해 다른 경로에 맞는 요청을 찾습니다.
Authentication은 인증된 사용자가 담겨있는 인증 객체입니다.
SecurityContext는 인증 객체가 담겨있는 저장소입니다. SecurityContext에서 Authentication(인증 객체)를 꺼내와서 로그아웃 핸들러(SecurityContextLogoutHandelr) 에게 전달합니다.
이 핸들러가 세션 무효화, 쿠키 삭제, 인증 객체를 초기화를 합니다.
이렇게 해서 성공이 되면 필터가 SimpleUrlLogoutSuccessHandler를 호출해서 로그인 페이지로 이동하도록 처리하고 있습니다.
'Spring Boot > Spring Security' 카테고리의 다른 글
[Spring Security] 동시 세션제어, 세션 고정 보호, 세션정책 (0) | 2022.06.29 |
---|---|
[Spring Security] Remember Me 인증, RememberMeAuthenticationFilter (0) | 2022.06.29 |
[Spring Security] Form Login 인증 필터 (0) | 2022.06.29 |
[Spring Security] Form Login 인증 (0) | 2022.06.29 |
[Spring Security] 프로젝트 생성 (0) | 2022.06.25 |
댓글