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 |