이 글은 정수원님의 Infrean 강의를 학습한 내용을 정리하여 작성합니다.
인증 API - Remember Me 인증
- 세션이 만료되고 웹 브라우저가 종료된 후에도 애플리케이션이 사용자를 기억하는 기능이다.
- Remember-Me 쿠키에 대한 Http 요청을 확인한 후 토큰 기반 인증을 사용해 유효성을 검사하고 토큰이 검증되면 사용자는 로그인 된다.
- 사용자 라이프 사이클
- 인증 성공 (Remember-Me 쿠키 설정)
- 인증 실패 (쿠키가 존재하면 쿠키 무효화)
- 로그아웃 (쿠키가 존재하면 쿠키 무효화)
http.rememberMe(); // rememberMe 기능이 작동한다.
실습
@Configuration
public class SecurityConfig {
@Autowired
UserDetailsService userDetailsService;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
...
http
.rememberMe() // rememberMe 기능이 작동한다.
.rememberMeParameter("remember") // 기본 파라미터명: remember-me
.tokenValiditySeconds(3600) // 기본 값은 14일
.alwaysRemember(false) // rememberMe 기능이 활성화되지 않아도 항상 실행한다.
.userDetailsService(userDetailsService); // 스프링 시큐리티에서 유저 정보를 가져오기 위해 사용한다.
return http.build();
}
}
- userDetailsService() 메소드를 호출하기 위해서는 미리 UserDetailsService 객체를 @Autowired 어노테이션을 사용해 생성해야 한다.
실행
복습
사용자가 로그인을 수행해 인증되면 사용자의 세션이 생성되며 서버는 응답 필드에 JESESSIONID를 포함해 클라이언트에게 보낸다.
클라이언트는 세션이 사용자의 인증 객체 (Authentication)를 가진다.
그 상태로 클라이언트가 서버에 재접속하면 인증을 다시 받지 않아도 된다.
이러한 이유는 서버가 클라이언트의 JESSESSIONID와 매칭되는 세션을 검사해 SecurityContext를 찾고 SecurityContext 내부에 인증 객체 (Authentication) 정보로 인증된 사용자인지 검사한다.
참고: EditThisCookie 플러그인
EditThisCookie 플러그인을 사용하면 쿠키 정보를 확인할 수 있다.
쿠키를 삭제한 뒤 서버에 재접속하면 다음과 같다.
사용자는 이미 인증을 받았음에도 불구하고 로그인 페이지로 이동하게 된다.
- Remember-Me 기능을 체크하고 로그인을 수행한다.
- 이전과 달리 remember-me 라는 이름을 가진 쿠키가 추가로 존재하는 것을 확인 가능하다.
- 해당 쿠키의 인코딩된 문자열은 인증 당시 사용한 인증 ID와 패스워드, 쿠키 만료일을 의미한다.
- remember-me 쿠키는 남겨두고 JSESSIONID 쿠키만 삭제 후 서버에 재접속하면 결과는 다음과 같다.
- 인증을 다시 받지 않아도 페이지에 접속 가능하다.
- 이유는 JESESSIONID가 없다 하더라도 스프링 시큐리티가 remember-me 쿠키를 체크해 인코딩된 인증ID와 패스워드 값을 디코딩, 파싱, 추출하여 유저 (User) 계정을 얻고 인증을 시도한다.
'스프링 시큐리티 > 스프링 시큐리티 기본 API 및 Filter 이해' 카테고리의 다른 글
익명 사용자 인증 필터: AnonymousAuthenticationFilter (0) | 2023.01.11 |
---|---|
Remember Me 인증 필터: RememberMeAuthenticationFilter (0) | 2023.01.10 |
Logout 처리, LogoutFilter (1) | 2023.01.10 |
FormLogin 인증 필터: UsernamePasswordAuthenticationFilter (0) | 2023.01.09 |
인증 API - Form 인증 (1) | 2023.01.09 |