굉장히 흥미로운 필터이다. 기능으로 설명해보자면 우리가 로그인을 할때 로그인유지하기 라는 칸을 본적이 있을것이다. 여기서 사용하는 능력이라고 볼수 있다. 그리고 우리가 어떤 페이지를 들어갈때 오늘 하루 해당 광고 보지 않기 라는 말을 본적이 있을것이다. 그것또한 이것과 비슷하다
- 세션이 만료되고 웹 브라우저가 종료된 후에도 어플리케이션이 사용자를 기억하는 기능이다.
- Remember-Me 쿠키에 대한 Http 요청을 확인한 후 토큰 기반 인증을 사용하여 유효성을 검사하고 토큰이 검증되면 사용자는 로그인 된다.
- 사용자의 라이프 사이클
- 인증 성공(Remember-Me 쿠키 설정)
- 인증 실패(쿠키가 존재한다면 쿠키 무효화)
- 로그 아웃(쿠키가 존재한다면 쿠키 무효화)
코드를 작성하는 요령은 이러하다.
- rememberMeParameter 는 Login에 있는 Parameter 설정과 같다 html의 name값을 변경해준다
- tokenValiditySeconds = 해당 remember-me값의 만료 기한을 설정한다. 1000 이 1초이다.
- 맨 마지막에 userDetailsService 를 넣어놨는데 이 뜻은 현재 시스템에서 계정을 조회하는 처리과정에 필요한 설정이다. 꼭 넣어주어야한다.
- 해당 사진엔 없지만 alwaysRemember 라는 것도 존재한다. 이 기능은 rememberMe를 사용자가 선택하는것이 아닌 서버에서 강제로 적용하는것이라고 생각하면 좋다!
그러면 이번엔 RememberMeAuthenticationFilter의 처리 과정을 알아보자
모든 요청은 모든 필터를 거친다. 중요한것은 요청의 의도를 필터가 알아차리고 서버가 원하는 처리를 잘해주어야 하는것이다. 해당 필터도 마찬가지이다
- Authentication 객체가 null 일때 : 인증 객체가 null 이라는것은 securityContext에 담겨있지 않다는 뜻이다. 담겨있지 않다는건 세션의 만료나 끊김때문에 영향이 있는것이다.
- 사용자가 최초의 인증을 받을 당시에 rememberme버튼을 눌러 쿠키 값을 받을때이다.
이 두가지의 경우 해당 필터가 진행된다. 그럼 이제 순서에 따른 흐름을 알아보자
- 세션이 만료된 사용자는 어떠한 요청을 하고 있다.. 이 요청이 인증이 필요한 요청이라고 생각해보자
- 그러면 해당 filter 가 동작을 시작하고 RememberMeServices가 실행된다. 해당 클래스는 두가지의 구현체가 존재하는데 이 구현체가 rememberMe를 실제로 처리하는 역할이다.
- TokenBasedRememberMeServices
메모리에서 저장한 토큰과 사용자가 들고 온 토큰을 비교하여 인증을 처리한다. 기본적인 만료일자는 14일이다. - PersistentTokenBasedRememberMeServices
DB에 토큰을 저장하고 토큰을 가지고 온 사용자의 토큰값과 비교를 한다. 이는 영구적인 방법이 된다.
※JWT 토큰을 사용할때 RefreshToken을 사용해 remember를 시키는것과 같다
- TokenBasedRememberMeServices
- 토큰을 추출하고 비교한다
- Token Cookie 를 추출한다.
- Token이 존재하는지 확인한다.
- No = 다음 필터로 이동한다
- Yes = Decode token에서 정상 유무를 판단하고, Token이 서로 일치하는지 확인하고, User를 떼어 계정이 존재하는지 확인하고 새로운 Authentication을 생성하여 AuthenticationManager인증처리를 진행하고 새로운 세션을 발급하고 Context에 다시 담는다. 만약 하나의 과정이라도 어긋난다면 Exception을 발생시킨다.
정리
우리가 언젠가부터 당연히 있었다는 듯이 존재하는 rememberMe 는 쿠키값을 설정하고 그것을 저장되어있는 것과 비교하여 사용하는것을 확인했다. 기존의 시큐리티를 이용해서 세션을 통한 통신을 할때는 token을 재조정하는것까지 굉장히 치밀하게 만들었다는것을 알수 있다.
JWT 토큰을 이용해서 만들때도 시큐리티의 기본적인 기능을 최대한 많이 접목시킬수 있도록 해볼것이다.
'Spring > 👨💻 SpringSecurity' 카테고리의 다른 글
권한 설정 (0) | 2023.06.26 |
---|---|
AnonymousAuthenticationFilter (0) | 2023.06.26 |
CuncurrentSesseionFilter (0) | 2023.06.26 |
SessionManagementFilter(동시 세션 제어 / 세션 고정 보호 / 세션 정책) (0) | 2023.06.26 |
Logout (0) | 2023.06.26 |