본문 바로가기

Spring/spring security

Spring Security - RememberMeAuthenticationFilter 란

반응형

- RememberMeAuthenticationFilter 란 -

 

스프링 시큐리티에서는 RememberMe라는 기능을 지원해준다.

 

이 RememberMe라는 기능은 세션이 만료된 뒤에도 서버에서 클라이언트의 인증 값을 기억하고 있어 주는 기능이다.

보통 cookie에 Remember Me 기능을 해줄 수 있는 특정한 쿠키 키-값을 세팅해서 구현을 한다.

 

이 복잡한 과정을 시큐리티에서는 간단한 설정으로 제공을 해주며 해당 기능을 사용하기 위해서는 해당 기능을 아래와 같은 형태로 활성화시켜야 한다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.formLogin();
    http.rememberMe();
}

 

위와 같이 RememberMe 기능을 활성화시키면 기본적으로 RememberMeConfigurer 클래스가 생성이 되며 init 메서드를 통해 초기화가 된다.

 

    public void init(H http) throws Exception {
        this.validateInput();
        String key = this.getKey();
        RememberMeServices rememberMeServices = this.getRememberMeServices(http, key);
        http.setSharedObject(RememberMeServices.class, rememberMeServices);
        LogoutConfigurer<H> logoutConfigurer = (LogoutConfigurer)http.getConfigurer(LogoutConfigurer.class);
        if (logoutConfigurer != null && this.logoutHandler != null) {
            logoutConfigurer.addLogoutHandler(this.logoutHandler);
        }

        RememberMeAuthenticationProvider authenticationProvider = new RememberMeAuthenticationProvider(key);
        authenticationProvider = (RememberMeAuthenticationProvider)this.postProcess(authenticationProvider);
        http.authenticationProvider(authenticationProvider);
        this.initDefaultLoginFilter(http);
    }

 

RememberMe 기능을 구현하는 방법에는 Token 기반의 구현 방법과 DB 기반의 구현 방법이 있는데 Spring Security의 RememberMe 기능의 디폴트는 Token 기반의 기능 구현이다.

 

위의 init 메서드를 살펴보면 getRememberMeService에서 rememberMe 를 위한 Repository 객체가 없다면 토큰 기반의 TokenBasedRememberMeServices를 불러오게 되고 Repository가 있다면 DB 기반의 PersistentTokenBasedRememberMeServices를 생성 후 불러오게 된다.

 

RememberMe 기능은 기본으로 등록되는 기능이 아니기에  init 함수를 사용하면 해당 필터의 기능을 사용할 준비만 되어 있을 뿐 아직 해당 필터를 사용하겠다는 것은 아니다. 따라서 configure 메서드가 호출될 때 필터에 추가가 된다.

    public void configure(H http) {
        RememberMeAuthenticationFilter rememberMeFilter = new RememberMeAuthenticationFilter((AuthenticationManager)http.getSharedObject(AuthenticationManager.class), this.rememberMeServices);
        if (this.authenticationSuccessHandler != null) {
            rememberMeFilter.setAuthenticationSuccessHandler(this.authenticationSuccessHandler);
        }

        rememberMeFilter = (RememberMeAuthenticationFilter)this.postProcess(rememberMeFilter);
        http.addFilter(rememberMeFilter);
    }

 

RememberMe 기능을 사용자가 사용해서 로그인을 하게 되면 AbstractRememberMeServices를 상속받은 TokenBasedRememberMeServices 혹은 PersistentTokenBasedRememberMeServices에서는 autoLogin 메서드를 사용하여 로그인 프로세스를 진행한다. 해당 과정에서 RememberMe 기능을 위해 세팅해둔 특정한 쿠키 키-값을 사용해 인증 권한을 가져온다.

 

 

반응형