본문 바로가기

SpringSecurity

SpringSecurity(RemeberMe)

반응형

사용자의 세션이 만료 되었거나 더이상 세션안에서 시큐리티 컨텍스트를 찾지 못하고 존재하지 않으면 이말은 즉,

인증객체가 없는경우 RememberAuthenticationFIlter가 호출된다! 자 그러면 인증 객체는 어디 있을까? SecurityContext! 에 저장되어 진다.

만약 Authentication(인증객체)Null 이 아니라면 RememberAuthenticationFIlter가호출이 안된다!

왜냐면 이미 Authentication(인증객체)가 이미 인증을 받았고 인증객체가 존재하기 때문에 다시 인증을 받을 필요가 없기때문이다!

RememberMe는 TimeOut에 경우에 해당되기 때문에 Session이 만료되었거나 현재 사용중인 브라우저가 종료되었거나 세션이 더이상 활성화 되지 않아서 인증객체를 SecurityContext 에서 찾지 못할경우에 그사용자의 인증을 유지 하기 위해서

RememberAuthenticationFIlter가 사용자의 인증을 다시 받게 만들어서 인증이 유지된채로 서버에 접근이 가능하게 하는 기능이다.

1. 첫번째 조건이바로 인증객체가 바로 Null일 경우이다.

2. 최초의 사용자가 폼인증을 받을때 Remember Me 기능을 활성화 해서 쿠키를 발급 받은경우!

그사용자가 session 은 무효화 되었지만 다시금 서버에 접속할때 리퀘스트 헤더에 쿠키 값을 가지고 접속한 경우 그경우에 필터가 Rememberme쿠키를 사용하여 인증을 시도한다.

즉 첫번째와 두번째를 정리하면 인증객체가 없을경우 그리고 그사용자가 Remember Me 쿠키를 가지고 올경우!

자 그러면 흐름을 한번 보자!

RememberMe 기능을 사용하여 인증을 받았다고 가정하자!

1. 사용자가 요청을 하면서 세션이 만료되어고 RememberMe 쿠키를 가지고 있다.

그러면 요녀석이 호출된다!

자 그러면 RememberMeService(인터페이스)가 호출되는데 요놈은 구현채가 두개이다! 한번 보자!

실제로 RememberMe 인증처리를 하는 역활을 하는 클래스들이다.

실제로 메모리에서 토큰을 저장한 사용자가 요청하면서 들고온 쿠키와 비교해서인증 처리를 한다 기본적으로는 14일동안 만료기간이 주어진다

요놈은 앞에 Persistent만 봐도 영원히~~ 쭉~~~ 저장한다 어디에? DB에 인증토큰을 저장하고 클라이언트가 가져온 쿠키랑 DB에 저장된 토큰이랑 비교 하고 인증처리를 하게 되는 클래스이다.

토큰이 존재하게된다면 토큰의 포맷이 정상적으로 규칙을 지키고 있는 토큰인지 정상 유무를 판단하게된다. 정상이 아닐경우 예외를 발생한다

사용자가 들고온 토큰이 정상일경우 서버에 저장된 토큰의 값이 일치하는지 확인한다. 일치 하지 않으면 예외를 발생한다

토큰이 일치할경우에 현재 사용자의 쿠키 안에 있는 사용자의 계정과 서버에 저장된 유저의 정보를 조회해서 존재하는지 확인한다 .존재하지 않으면 예외를 발생한다

사용자의 토큰의 값이 모두 일치한다면 Authentication(인증객체) 새로운 인증객체를 생성한다

새로운 인증객체를 전달받아서 실질적으로 인증처리를 하게된다.

자 여기까지 흐름을 파악했다 그러면 코드를 통해서 한번더 확인하자!

Security기본 html

저기서 RememberMe 기능을 체크한 후에 쿠키를 발급받을수 있도록 했다.

현재 인증에 성공했다!

AbstractAuthenticationProcessingFilter.java

인증에 성공한 사용자에게 Remember Me 쿠키를 사용해서 최종 응답할때 Response에 RememberMe 쿠키를 담아서 응답을 하는과정이다.

AbstractRememberMeService.java

최종적으로는 쿠키값을 담아서 클라이언트에게 응답을 하게 된다.

EditThisCooki

여기서 생성된 세션아이디와 RememberMe 쿠키 정보를 알수 있다.

여기사 삭제를 하고 다시 접속 해보겠다.

그러면 다시 처음 접속한 사용자라고 인식을 하게 되는데 이사용자가 현재 RememberMe 쿠키값을 가지고 있기 때문에

SpringSecurity에서는 RememberAuthenticationFIlter에서 자동적으로 사용자의 인증을 시도하게된다.

RememberMeAuthenticationFilter.java

현재 SecurityContext에는 값이 널이다 왜냐 필자가 현재 접속한 쿠키값을 삭제했기 때문이다.

그러면 자동적으로

RememberMeAuthenticationFilter.java

요놈이 호출되어서 인증을 대신 처리하게된다. 그러면 요놈을 타고 들어가보자!

AbstractRememberMeService.java

요놈이 일단 RememberMe 쿠기 값이 있는지 확인을 한다! 보니까 쿠키 값이 있다! 그러면 현재 필자는 다시 인증처리를 받을수 있는 조건을 충족한다

AbstractRememberMeService.java

여기를 보면 RemeberMeAuthenticationToken에서 유저정보와 권한 정보까지 담아서 인증객체를 생성한다 그다음에

authenticationManager에게 전달하고 있다

그다음에는 SecurityContext 에 다시 저장을 하게된다

그러면 SpringSecurity는 인증 받은 사용자로 계속 인식을 하게되고 동일하게 서버자원에 접근이 가능하다.

여기까지가 SpringSecurity RememberMe 기능을 알수 있었다!

1일 1커밋을 하는게 목적이였지만..

현재 취업준비와 기술면접 준비하느라 시간이 없다

솔직히 이력서 쓰는데 시간을 엄청나게 소비하고 있다

다들 나와 같지 않을까? 하는 생각을 한다?ㅋㅋ

얼른 취업에 성공해서 마음놓고 공부하고 싶다

 

반응형