RememberMeAuthenticationFilter

이 필터는 SecurityContextHolderAuthentication 인증 객체다. 인증 객체가 포함되지 않은 경우에 실행되는 필터라 되어있다. 이 의미는 우리가 폼 인증 또는 Basic 인증을 통해 성공하게 되면 인증 성공한 그 이후의 처리 과정 속에서 반드시 어떤 과정이 있었냐면 SecurityContext 안에 Authentication 을 세션에 저장하든지 아니면 요청 객체에 저장하든지 반드시 저장했다. 그 이유는 인증 상태를 세션 범위 또는 요청 범위 안에서 유지하기 위해서이다. 그래서 인증이 유지된다는 말은 이미 인증을 받았다는 말로, 기억하기 인증은 인증을 받지 않는 경우, 인증이 지금 처리되지 않는 경우에 자동으로 인증을 해주기 위해 필요한 거지 인증을 이미 받았으면 이 기능은 필요가 없다. 그렇게 때문에 AuthenticationSecurityContext 안에 있다는 말은 이미 현재 사용자는 인증된 상태로 존재해있다. 이 말이기에 굳이 기억하기 인증을 통해 자동 인증할 필요가 없으며, 필요한 경우는 AuthenticationSecurityContext 에 없는 경우, 즉 인증 상태가 아닌 경우에만 이 필터가 작동하겠다는 의미로 해석하면 된다.

그렇기 때문에 세션이 만료되었거나 어플리케이션 종료로 인해 인증 상태가 아예 소멸되는 경우 토큰 기반 인증을 사용해 유효성을 검사하고 토큰이 검증되면 자동 로그인 처리를 수행하게 된다.

스크린샷 2025-02-02 오후 4.55.37.png

그림을 보면 클라이언트가 GET 방식으로 임의의 요청을 하고 있다. 그리고 RememberMeAuthenticationFilter 가 요청을 받고 있다. Authentication 객체가 null 인지 아닌지 본다. null 이면 인증을 받지 못한 것이기에 인증을 받을 수 있도록 자동 로그인을 처리하는 것이고 null 이 아니면 인증 상태이기에 바로 pass 해버린다. 그래서 만약 null 이라면 RememberMeServices.autologin() 자동 로그인 메소드를 호출해 자동 로그인 처리를 한다. 그래서 들어가보면 이 안에서 RememberMeAuthenticationToken , 인증 객체 토큰으로 이 안에 사용자 정보와 권한 정보를 넣는다. 폼 인증과의 다른 점은 폼 인증에서는 사용자의 id 와 password 를 넣어 인증을 처리한다면 여기선 사용자의 정보(객체 정보와 권한 정보)를 가져와 이곳에 저장한 다음 이 저장한 토큰을 갖고 인증 처리를 수행한다.

이 토큰을 AuthenticationManager 에게 전달해 이 AuthenticationManager 가 인증처리를 하는 것. 이후의 과정은 폼 인증과 거의 동일.

성공했을 경우엔 RememberMeAuthenticationToken 을 통해서 SecurityContext 에 저장해야 한다. 그런데 폼 인증 때와 동일하게 RememberMe 같은 경우에도 인증 상태를 계속 유지해야 하기 때문에 세션에 이 Context 를 저장한다. 이후 이벤트를 게시한다. 이 부분은 폼 인증과 동일.

실패했을 시에는 한가지 일만 한다. rememberMeServices.loginFail() 에서 로그인에 실패했기에 그 이전에 쿠키가 가지고 있던 모든 정보를 버려야 할 것.

이 인증이 이루어지기 전 토큰을 생성하고 쿠키가 클라이언트에 보내는 인증 과정은 이 필터가 하는 게 아닌 UserNamePasswordAuthenticationFilter 필터가 인증 처리 과정 속에서 한다.