[ODOP] 73 일차 - Remember me 인증

[ODOP] 73 일차 - Remember me 인증
  • 세션이 만료되고 웹 브라우저가 종료된 후에도 애플리케이션이 사용자를 기억하는 기능
  • Remember-me 쿠키에 대한 Http 요청을 확인한 후 토큰 기반 인증을 사용해 유효성을 검사하고 토큰이 검증되면 사용자는 로그인된다
  • 사용자 라이프사이클
    - 인증 성공(Remember-Me 쿠키 설정)
    - 인증 실패(쿠키가 존재하면 쿠키 무효화)
    - 로그아웃(쿠키가 존재하면 쿠키 무효화)

설정

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

		@Override
		protected void configure(HttpSecurity http) throws Exception {
				rememberMeConfigure(http);
		}
		private void rememberMeConfigure(HttpSecurity http) throws Exception{
		    UserDetailsService userDetailsService = null;
		    http.rememberMe()
		        .rememberMeParameter("remember")        // 기본 파라미터 명은 remember-me
		        .tokenValiditySeconds(3600)             // default 는 14일
		        .alwaysRemember(true)                   // 리멤버 미 기능이 활성화 되지 않아도 항상 실행
		        .userDetailsService(userDetailsService);
		}
		private static class CustomUserDetailsService implements UserDetailsService {
		
		    @Override
		    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		        return null;
		    }
		}
}
  • rememberMeParameter(String) Default : remember-me
    rememberMe 데이터의 파라미터 명을 개발자가 정의 할 수 있다
    로그인 Form 에서 rememberMe 기능을 적용 할 체크 박스의 파라미터 명 과 맞춰야 한다
  • tokenValiditySeconds(int) Default : 1,210,000 (14일)
    기본 값은 14일(1,210,000)
    rememberMe 쿠키의 만료 시간. 초단위의 입력이 가능하다
  • alwaysRemember(boolean) Default : false
    rememberMe 의 기능을 항상 활성화 할 것인지에 대한 옵션
    true 로 설정 하면 Client 에서 rememberMe 체크박스를 체크하지 않더라도 rememberMe 가 항상 체크된것 처럼 동작한다
  • userDetailsService(UserDetailsService)
    rememberMe 동작 시 고객의 정보를 조회하는 서비스
    UserDetailsService 인터페이스를 구현한 구현체를 대입해주면 rememberMe 가 정상동작 하게 된다.

예제

기존의 로그인 방식에서는 로그인 후 새로고침을 해도 로그인이 유지된다.

이유는 JSESSIONID 라는 쿠키를 확인하여 현재 서버의 SecurityContext 에 저장된 세션의 ID와 비교하여 로그인 여부를 판단하기 때문이다.

만약 여기서 JSESSIONID 를 지우게 되면 마치 사용자는 로그인을 하지 않은 것 처럼 로그인 페이지로 리다이렉트 되게 된다.

하지만 만약 rememberMe 설정이 켜져있다면 이야기가 달라진다.

오른쪽의 이미지를 확인 해 보면 remember-me 라는 내용의 쿠키가 만들어진 것을 확인 할 수 있다.

이 상태에서는 JSESSIONID 를 삭제 하고 새로고침을 하더라도 계속해서 로그인이 유지되게 된다.

remember-me 쿠키는 서버에서 디코딩-파싱-추출 과정을 거쳐 서버에 저장하게 되고, 이 정보를 이용해 로그인을 성공으로 처리 하는 것

성공 처리 된 로그인 정보는 당연히 SecurityContext 에 저장 되며 이 정보를 SecurityContextHolder 를 통해 불러와 사용하는 것도 가능하다.