본문 바로가기

카테고리 없음

[스프링 시큐리티] 기본 API & Filter 이해(5) Remember Me 인증

Remember me 옵션을 활성화하면 스프링 시큐리티가 다음 기능을 제공한다.

  • 세션이 만료되고 웹 브라우저가 종료된 후에도 어플리케이션이 사용자를 기억하는 기능이다.
  • JSESSIONID 쿠키가 없더라도 리멤버미 쿠키가 있다면 인증된 상태로 처리된다.
  • 리멤버 미 쿠키에 대한 http 요청을 확인한 후 토큰 기반 인증을 사용해 유효성을 검사하고 토큰이 검증되면 사용자는 로그인 된다.
  • 사용자 라이프 사이클
    • 인증 성공하면, 해당 사용자에게 리멤버미 쿠키가 발급된다.
    • 인증 실패하면, 리멤버미 쿠키가 존재한다면 쿠키를 무효화한다.
    • 로그아웃할 때도, 리멤버미 쿠키가 존재한다면 쿠키를 무효화한다.
http.rememberMe()
		.rememberMeParameter("remember") // 기본 파라미터 명 remember-me
		.tokenValiditySeconds(3600) // 쿠키 만료 시간. 기본 14일
		.alwaysRemember(true) // true 면 리멤버 미 기능이 활성화되지 않아도 항상 실행된다.
		.useDetailService(useDetailService) // 리멤버미 기능이 활성화 되었을 때 해당 사용자의 정보를 조회할 때 사용하는 기능

 

🌿 Remember Me 인증 필터

  • RememberMeAuthenticationFilter 가 사용자의 요청을 받아서 처리하는 조건이 있다.
    • 조건 1. Authentication 인증 객체가 null 일 경우. 즉 시큐리티 컨텍스트에 존재하지 않는 경우
      • 세션이 만료되어 더 이상 세션 안에서 시큐리티 컨텍스트를 찾지 못하는 경우
      • 브라우저가 종료되어 세션이 끊긴 경우
    • 조건 2. 폼로그인 리멤버 미 기능을 통해 쿠키를 발급 받아 서버에 재 접속한 경우
      • 해당 쿠키를 가지고 위 필터가 동작하게 된다.

  1. 가정 : 사용자의 세션은 만료된 상태 + 이전 로그인 시 리멤버 미&폼 로그인으로 인증을 받았다. (리멤버 미 쿠키있음)
  2. 두 조건을 만족하므로 리멤버미 필터가 동작하고 리멤버미 서비스(인터페이스)가 동작한다.
    1. tokenBasedRememberMeServices : 메모리에 저장된 토큰과 사용자가 요청에서 가져온 토큰을 비교해서 인증 처리를 한다. 기본적으로 14일 만료 기간이 있다.
    2. persistentTokenBasedRememberMeServices : 영구적인 방법이다. db 에 토큰을 저장하고 사용자가 요청에서 가져온 토큰을 비교하여 인증 처리한다.
    2.1 토큰을 추출한다.2.3 존재하지 않으면 그 다음 필터로 이동한다.
  3. 2.4 존재하면 토큰의 포맷이 규칙을 지키고 있는지 판단(정상 유무 판단)하여 정상이 아니면 예외를 발생시키고, 정상이면 사용자의 토큰 내용과 서버에 저장된 토큰의 값이 일치하는지 체크한다. 그리고 토큰의 유저 정보가 서버 db 에 존재하는 지 체크하여 해당 계정에 대해 새로운 authentication 인증 객체를 생성하여 authenticationManager 에게 전달한다.
  4. 2.2 사용자가 가지고 있는 토큰이 리멤버 미 라는 이름인지 검사한다. 이 토큰이 존재하는지 체크한다.