Spring Security

[Security] Remember Me 인증 필터 (RememberMeAuthenticationFilter)

cornarong 2021. 10. 5. 14:26

rememberMe기능을 활성화하여 로그인할 경우 사용자는 인증 객체를 담은 session과 함께 remember-me 쿠키를 받아 자원에 접근하게 된다.

rememberMe 활성화된 코드
* rememberMe의 다양한 설정의 api들은 차후에 다뤄보자.

 

이후로 사용자의 세션이 만료되거나 사용자 브라우저 종료로 인하여 세션이 끊긴 경우 즉, 세션이 활성화되지 않아 인증 객체를 SecurityContext에서 찾지 못하는 경우 자동적으로 사용자의 인증을 유지하기 위하여  RememberMeAuthenticationFilter가 실행된다. 

 

즉, 정리해보면 다음과 같이 2가지 조건이 충족해야 RememberMeAuthenticationFilter가 실행된다.

 

* 필터가 작동하는 경우

1. Authentication 객체가 null일 경우. (세션 비활성화 상태)

2. 사용자가 remember-me쿠키를 가지고 오는 경우.

 

그럼 전체적인 remember-me 인증 필터의 처리 흐름을 살펴보자.

Form인증을 받을 당시 Remember Me 기능을 활성화 한 사용자가 세션이 비활성화된 상태로 요청을 한다.

request 헤더의 remeber-me쿠키의 유무를 확인하여 RememberMeAuthenticationFilter가 실행된다.

 

RememberMeServices는 인터페이스로 remember-me인증을 처리하는 구현체가 존재한다.

1. TokenBasedRememberMeServices

메모리에 저장된 토큰과 클라이언트가 들고 온 토큰을 비교해서 인증처리를 한다.

2. PersistentTokenBasedRememberMeServices

DB에 클라이언트에 발급해준 토큰을 저장하고, 클라이언트가 가져온 토큰 값을 비교하여 인증 처리를 한다.

 

RememberMeServices에서 토큰을 추출하고 아래와 같은 순서로 진행하게 된다.

조건에 부합할 경우 Exception을 반환한다.

1. 클라이언트가 가져온 헤더의 remember-me토큰의 존재 유무를 확인한다.

2. 토큰의 형식이 정상적인 규칙을 지키고 있는지 판단한다.

3. 클라이언트가 가져온 토큰의 값과 서버에 저장된 토큰의 값이 서로 일치하는지 확인한다.

4. 토큰에 포함된 user 정보가 DB에 존재하는지 확인한다.

 

정상적으로 위의 과정을 지나게 되면 새로운 Authentication객체(인증 객체)를 생성하고 이 인증 객체를 AuthenticationManager로 전달하여 인증처리를 하게 된다.