본문 바로가기

SpringSecurity

SpringSecurity(Logout),LogoutFilter

반응형

스프링 시큐리티 로그아웃 처리 과정을 간단하게 살펴 보고 넘어가자!

클라이언트가 로그아웃 요청을 하면 스프링 시큐리티가 요청을 받고 로그아웃 처리를 하게 되는데

세션 무효화 인증토큰 삭제 , 쿠키정보 삭제, 로그인 페이지로 리다이렉트 하게끔 되어 있다.

 

 

 

 

 

 

.addLogoutHandler(logoutHandler()) 요놈을 잠깐 설명하고 넘어가자 !

이놈은 스프링시큐리티 에서 기본적으로 제공하는 로그아웃 핸들러 인데 실제로 세션을 무효화 하고 인증토큰을 삭제하고 별도의 어떤 처리를 하고 싶을때 로그아웃 핸들러를 인터페이스로 구현 해서 작업한 내용들을 처리 할수도 있다.

.logoutSuccessHandler(logoutSuccessHandler()) 로그아웃 성공했을때 후속 작업을 할수 있도록 한다 이놈도 똑같이 인터페이스를 구현해서 작업한 내용을들을 처리할수 있다.

이제 간단한 설명은 했으니 코드로 넘어가보자!

로그인 이랑 별다른게 없다

logoutUrl("/logout") 요놈은 기본값이 "logout" 이다

그리고 스프링 시큐리티는 원칙적으로Post 방식으로만 처리를한다 get방식으로 하게되면 오류를 발생하게된다.하지만 get 방식으로도 처리를 많이하기 때문에 그방법은 뒤에서 다시 알아보도록 하자! 원칙적으로는 post로 하는거 잊지말자!

logoutSuccessUrl("/login")로그아웃이 성공하면 로그인페이지로 이동하게끔 했다.

.addLogoutHandler(new LogoutHandler)

스프링 시큐리티에서 로그아웃 처리 할때 여러가지 핸들러가 있는데 앞서 말했던 별도로 내가 다른작업을 하고 싶을때 클래스를 따로 만들어서 구현 할수도 있다고 했다 ! 여기서는 구현한 클래스가 없기때문에 익명 클래스로 처리 하도록 했다.

session.invalidate(); 요놈으로 세션을 무효화 처리 한다.

logoutSuccessHandler(new LogoutSuccessHandler())

요놈을 사용해서 로그아웃 이후에 수행할 일들을 처리 할수 있는데 위에서 logoutUrl를 이용할수도 있지만 좀더 다양한 기능들을 구현하고 싶다면

요놈을 이용하면된다 .addLogoutHandler(new LogoutHandler) 요놈이랑 같다고 생각하면 될거 같다.

httpServletResponse.sendRedirect("/login"); 을 사용해서 로그인 페이지로 이동하겠다.

localhost를 이용해서 로그인 이후에 logout페이지로 이동했다 그러면 스프링 시큐리티에서 기본으로 제공하는

html을 확인할수 있다

자그러면 페이지 소스를 한번 확인해보자 아까 post방식으로 보낸다고 했다 소스 페이지는 어떻게 구성되어 있는지 확인해보자

post방식인걸 확인할수 있다.

그러면 소스코드를 정리 해보자!

 

 

 

 

 

 

스프링 시큐리티 로그아웃 처리 과정을 알아 보았다 그러면 필터를 한번 살펴보도록 하자 !

자세하게 필터를 알아보고 API를 공부하기에는 힘들지만 그래도 개념과 로직처리는 잡고 가야한다! 힘들지만 보고 가자!

로그아웃 요청을 하면 로그아웃 필터가 처리 를 한다. Request로 Post방식으로 요청한다

현재 사용자의 로그아웃 요청이 스프링 시큐리티에서 제공하는 로그아웃 정보와 일치한지 확인한다.

일치 하지 않으면 요녀석을 호출한다.

로그아웃 정보가 정상이면 필터가 SecurityContext 호출한다 요놈은 인증객체를 담고 있는데 인증객체를 호출하여

로그아웃 핸들러에게 전달한다

요놈은 세션을 무효화 하고 쿠키를 삭제 하고 SecurityContexHlder.clearContext() 요놈이 객체를(SecurityContext) 삭제한다

인증객체도 널로 초기화 한다.

마지막으로 요놈을 호출하여 로그인 페이지로 이동 하도록 처리한다.

자그러면 필터 소스코드를 한번 훓어보자!

LogoutFilter class

로그아웃을 하게 되면 Authentication auth = SecurityContextHlder.getContext().getAuthentication();

요기서 인증확인하고 인증 객체를 꺼내온다. 디버깅 콘솔을 확인하면 UsernamePasswordAuthenticationToken@이 확인된다.

그다음은 logout핸들러 호출해서 로그아웃 처리를 한다 여기서 로그아웃 핸드러는 compositeLogoutHandler이다

이놈은 5개의 핸들러를 가지고 있는데 스프링시큐리티에서 기본적으로 제공해준다.

 

 

자 그러면 compositeLogoutHandler 여기로 이동해보자

compositeLogoutHandler.class

기본적으로 제공하는 핸들러를 순회 하면서 로그아웃 처리를 한다. 여기서 자신이 직접 만든 핸들러 부터 선택되어서

HttpSession session = httpServletRequest.getSession(); 여기에서 처리하게 된다

디버깅을 확인해보면 SecurityContextLogoutHandler가 로그아웃 처리를 하고 있는데

한번 이동해보자 !

SecurityContextLogoutHandler.class

여기서 session.invalidate(); 무효화 ! 그래서 널이다

만약 아니라면 session.invalidate() 이놈을 통해서 무효화 된다.

무효화 된후에는 !

SecurityContextHolder.getContext();

요놈통해서 Authentication((Authentication)null);

널로 초기화 하고

요놈을 통해서 삭제를 한다!

자 오늘도 로그아웃 구현이랑 로그아웃 필터 api를 알아봤다

결과는 로그아웃이 되면 그만이지만 api들이 무슨일을 하고 로직처리 순서를

알아야 오류가 생기면 금방 해결할수 있을거 같아서 귀찮지만 기록을한다

앞으로 강의를 듣고 공부하면서 귀찮치만.. 꼭 남길거야.... 약속해본ㄷ ㅏ..

 

반응형

'SpringSecurity' 카테고리의 다른 글

SpringSecurity(AnonymousAuthenticationFilter)  (0) 2020.10.30
SpringSecurity(RemeberMe)  (0) 2020.10.30
SpringSecurity(LoginForm)인증  (0) 2020.10.30
SpringSecurity(보안기능구현)  (0) 2020.10.30
SpringSecurity(시작!)  (0) 2020.10.30