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