Remember Me 기능..?
Remember Me 기능을 활성화하면 Spirng Security 는 세션이 만료되거나 브라우저가 종료된 뒤에도 어플리케이션이 사용자를 기억하게끔한다.
-
Remeber Me 기능을 활성화 한 상태에서 사용자의 요청
-
Spring Security는 Remember-Me 쿠키에 대한 Http 요청을 확인 후 토큰 기반 인증을 사용하여 유효성을 검사, 검증이 되면 자동으로 로그인 됨
사용자 요청의 라이프사이클
-
인증성공 : Remember-Me 쿠키 설정
-
인증실패 : 쿠키 존재시 무효화
-
로그아웃 : 쿠키 존재시 무효화
Remember Me 기능을 위한 API들
http.rememberMe() : rememberMe 기능이 작동
rememberMe() 의 하위 API들
-
rememberMeParameter("remember) : 체크박스 파라미터 설정, default = remember-me
-
tokenValiditySeconds(3600s) : 쿠키의 생명기간, default = 14일
-
alwaysRemember(false) : 인증시 리멤버 미 기능이 활성화 되지않아도 항상 실행, default = false
-
userDetailsService(userDetailsService) : rememberMe 기능을 수행할 때 시스템에있는 사용자계정정보를 조회하는 과정에 필요한클래스가 UserDetailsService 이다, 필수사항
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService; // rememberMe 기능의 시스템사용자정보 조회를 위해 UserDetailsService 주입
@Override
protected void configure(HttpSecurity http) throws Exception {
http//인가
.authorizeRequests() //요청들에 대한
.anyRequest().authenticated();//어느 요청이든. 인증을한다.
http//인증
.formLogin();//폼로그인 방식으로 인증작업을 하겠다.
http//로그아웃
.logout() // 로그아웃 기능을 활성화
.logoutUrl("/logout") // form[action=/logout] 원칙적으로 POST방식
.logoutSuccessUrl("/login") // 로그아웃 성공시 이동할 Url
.addLogoutHandler(new LogoutHandler() { // 로그아웃처리에 작업이 필요할 경우
@Override
public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
HttpSession httpSession = request.getSession();
httpSession.invalidate();
}
})
.logoutSuccessHandler(new LogoutSuccessHandler() { // 로그아웃 성공 후 작업이 필요할 경우
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
response.sendRedirect("/login");
}
})
.and()//다른 기능 추가
.rememberMe()// 리멤버미 기능 추가
.rememberMeParameter("remember") // checkbox[name=]
.tokenValiditySeconds(3600) // Remember-Me 쿠키의 생명기한, seconds 단위
.userDetailsService(userDetailsService); // rememberMe 기능 수행 시 시스템에 있는 사용자정보를 조회하는 과정에서 필수적으로 필요한 클래스.
;
}
}
인증이 되었다는 의미
즉 SpringSecurity 에서 사용자의 Session이 생겨났다는 것이며 그 Session이 사용자의 Authentication 객체를 담은 SecurityContext를 담고있다는 것을 뜻한다.
또한 Server 에서 JSESSIONID 를 응답헤더에 보낸것을 의미한다.
다시 Client 가 접근하면 Client 가 가져온 JSESSIONID와 매칭되는 SESSION을 꺼내 SecurityContext , Authentication 객체를 가지고 인증여부를 판단 하게 된다.
JSESSIONID 쿠키를 지우게 되면, Server는 JSESSIONID 에 맞는 세션정보를 찾지못해 처음 접속하는 사용자로 판단해 로그인페이지로 리다이렉트 시킨다.
Rememeber Me 기능을 적용했다면,
Remeber-Me 쿠키의 문자열은 인증당시 사용했던 username 과 password, 만료일 등이 담겨져있다.
-
Remember Me 기능에 체크 후 인증 했다면 JSESSIONID 를 삭제해도 내부적으로 인증을 진행
-
SpringSecurity 는 JSESSIONID 가 없다라도 Remember-Me 쿠키를 Client가 가지고 있다면 RememberMeAuthenticationFilter 를 이용함
-
Remember-Me 쿠키의 값을 파싱하고 디코드해서 User객체를 만들어 내부적으로 인증을 시도한다.
즉, Remember-Me 쿠키를 가지고 있다면, SpringSecurity 는 그 값을 가지고 인증작업을 해서 자동로그인 기능을 구현하는 것이다.
'springframework > 시작하자SpringSecurity' 카테고리의 다른 글
8.AnonymousAuthenticationFilter (0) | 2020.09.21 |
---|---|
7.RememberMeAuthenticationFilter (0) | 2020.09.19 |
5.LogoutFilter (0) | 2020.09.19 |
4.UsernamePasswordAuthenticationFilter (0) | 2020.09.19 |
3.Form Login 인증 (0) | 2020.09.19 |