Remember Me 란?
JSESSIONID가 만료되거나 Cookie가 없어도 웹 브라우저가 종료된 이후에도 어플리케이션이 사용자를 기억하는 기능을 말한다. 쉽게 말해 자동 로그인 기능에 사용하는 것이다.
* JSESSIONID ?
- Tomcat 컨테이너에서 세션을 유지하기 위해 발급하는 키로, HTTP 프로토콜은 stateless하다. 요청시마다 새로운 연결이 생성되고, 응답 후에 연결은 끊기게 되므로 상태를 유지할 수 없게 된다.
예를 들어, 사용자가 페이지에서 로그인할 때, 하단에 '로그인 유지' 체크박스를 체크한 후 로그인 하면 Remember Me 기능을 활성화 시키는 경우이다. 해당 기능을 활성화 시킬 경우, 서버에서는 Remember Me 쿠키를 생성하게 된다. 그 후, 로그인을 할 때마다 어플리케이션에 저장되어 있는 Remember Me 쿠키를 HTTP header에 쿠키를 담아서 request를 보내게 되며, 서버는 HTTP header를 확인 한 후에 Token 기반 인증을 통해 validation을 하고 로그인 승인을 하게된다.
사용자의 Life Cycle은 다음과 같다.
- 인증(로그인) 성공 (Remember Me 쿠키 설정)
- 인증(로그인) 실패 (쿠키가 존재하면 쿠키 무효화)
- 로그아웃 (쿠키가 존재하면 쿠키 무효화)
동작 원리 + 순서
- RememberMeAuthenticationFilter는 Session에 SecurityContext가 Null일 때(인증 객체가 없는 경우), 또는 사용자의 Request HTTP header에 Remember Me 쿠키가 있는 경우에 동작한다.
- RememberMeService는 인터페이스로 TokenBasedRememberMeServices와 PersistentTokenBasedRememberMeServices 구현체가 존재한다. 해당 구현체들이 실제로 Remember Me 인증 처리를 담당하는 구현체들이다.
- TokenBasedRememberMeServices는 메모리에 있는 Token과 사용자가 Request header에 담아서 보낸 Token을 비교하여 인증한다.
- PersistentTokenBasedRememberMeServices는 DB에 저장된 Token과 사용자가 Request header에 담아서 보낸 Token을 비교하여 인증한다.
- Request에서 Token을 추출한다.
- Token이 존재하는지 확인 후, Token이 존재하지 않는다면 다음 Filter로 넘겨준다.
- Token이 올바른 형태이고, 해당 Token 값과 Server의 값이 비교하여 일치하고, 사용자의 정보가 일치하는지 확인 후, 일치한다면 Authentication을 생성하고 AuthenticationManager를 통해 인증처리를 한다.
Remember Me Token 초기화 시점
Remember Me Token은 새롭게 로그인 인증을 받는 경우에 초기화 된다. 다시말하면, Remember Me 쿠키로 인증을 해서 로그인이 될 경우, JSESSIONID는 초기화되지만, Remember Me Token은 초기화되지 않는다. 두 Token은 별개이다.
참고
https://prodo-developer.tistory.com/50
https://velog.io/@seongwon97/Spring-Security-Remember-Me
https://velog.io/@gmtmoney2357/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0-Remember-Me-%EA%B8%B0%EB%8A%A5
https://coder-in-war.tistory.com/entry/Spring-Security-01-Remember-Me-%EC%9D%B8%EC%A6%9D%EC%9D%B4%EB%9E%80