모르지 않다는 것은 아는것과 다르다.

Spring Security

RememberMeAuthenticationFilter

채마스 2022. 2. 28. 20:48

Remember Me?

  • 보통 로그인 폼 밑에 보면 아이디, 비밀번호 저장 체크박스를 볼 수 있다. -> 이것이 Remember Me 와 관련이 있다.
  • 체크 박스를 체크하고 로그인 하는 순간 remember-me 라는 쿠키가 생성된다.
  • 체크 박스
    • 체크 : JSESSIONID, remember-me 모두 존재
    • 체크 안함 : JSESSIONID 만 존재
  • 강제로 JSESSION 를 삭제한다면?
    • 체크 : 인증을 다시 받을 필요가 없다.
    • 체크 안함 : 인증을 다시 받아야 한다.






RememberMeAuthenticationFilter

  • Spring Security 에서 제공하는 15개의 필터 외에 RememberMeAuthenticationFilter 가 있다.
  • Authentication 객체가 null 이고, 사용자가 remember-me 쿠키를 가지고 있을때 동작하는 필터이다.
  • 세션이 만료되고 웹 브라우저가 종료된 후애도 어플리케이션이 사용자를 기억하는 기능이다.
  • Remember-Me 쿠키에 대한 Http 요청을 확인한 후 토큰 기반 인증을 사용해 유효성을 검사하고 토큰이 검증되면 사용자는 로그인 된다.
  • 라이프 사이클
    • 인증 성공 -> Remember-Me 쿠키 설정
    • 인증 실패 -> 쿠키가 존재하면 쿠키 무효화
    • 로그아웃 -> 쿠키가 존재하면 쿠키 무효화
  • 토큰기반 인증 필터이다.
  • 세션 보다 수명이 길다.
    • Session의 세션 만료 시간은 기본 설정이 30분이지만 RememberMeAuthenticationFilter의 기본 설정은 2주 입니다.
  • remember-me 라는 쿠키를 생성하고, 토큰을 저장한다.
  • 세션 정보를 삭제해도 쿠키에 저장된 토큰으로 인증처리를 하고 인증된 후, SecurityContextHolder 에 넣어준다.





Remember Me 인증 과정

  • 만약 사용자의 세션이 만료되어서 Authentication 객체가 null 이고, 사용자가 remember-me 쿠키를 가지고 있다면 RememberMeAuthenticationFilter 가 동작한다.
  • RememeberMeServices 는 두개의 구현체가 있는데, 여기서 RememberMeAuthenticationToken 을 생성해서 넘겨준다.
  • 쿠키에서 토큰값을 가져와서 토큰값을 검증하고 새로운 Authentication 객체를 만들어 AuthenticationManager 에게 전달해 준다.
  • 최종적으로 SecurityContextHolder 에 담긴다. -> JSESSIONID 가 새로 발급된 것을 확인할 수 있다.
  • 주의사항
    • 서버가 내려가면 remember me 쿠키도 재발급 받아야 한다.

 

코드 예시

  • 아래와 같이 설정할 수 있다.
protected void configure(HttpSecurity http) throws Exception {
    http.rememberMe()
        .rememberMeParameter("remember") // 기본 파라미터명은 remember-me
        .tokenValiditySeconds(3600)      // Default 는 14일
        .alwaysRemember(true) // 리멤버 미 기능이 활성화되지 않아도 항상 실행
        .userDetailsService(userDetailsService)
}




REFERENCES

  • 정수원님의 스프링 시큐리티
  • 안성훈님의 스프링 시큐리티

'Spring Security' 카테고리의 다른 글

Ajax 인증처이  (0) 2022.02.28
Custom Filter  (0) 2022.02.28
AccessDesicionManager 와 AccessDecisionVoter  (0) 2022.02.28
ExceptionTranslationFilter,RequestCacheAwareFilter  (0) 2022.02.28
Security Filter  (0) 2022.02.28