springframework/시작하자SpringSecurity

6.Remember Me 인증

Jungsoomin :) 2020. 9. 19. 20:10

Remember Me 기능..?

 

Remember Me 기능을 활성화하면 Spirng Security세션이 만료되거나 브라우저가 종료된 뒤에도 어플리케이션이 사용자를 기억하게끔한다.

 

  1. Remeber Me 기능을 활성화 한 상태에서 사용자의 요청

  2. Spring Security는 Remember-Me 쿠키에 대한 Http 요청을 확인 후 토큰 기반 인증을 사용하여 유효성을 검사, 검증이 되면 자동으로 로그인 됨 


사용자 요청의 라이프사이클

  1. 인증성공 : Remember-Me 쿠키 설정

  2. 인증실패 : 쿠키 존재시 무효화

  3. 로그아웃 : 쿠키 존재시 무효화


Remember Me 기능을 위한 API들

     http.rememberMe() : rememberMe 기능이 작동

 

             rememberMe() 의 하위 API

  1. rememberMeParameter("remember) : 체크박스 파라미터 설정, default = remember-me

  2. tokenValiditySeconds(3600s) : 쿠키의 생명기간, default = 14일

  3.  alwaysRemember(false) : 인증시 리멤버 미 기능이 활성화 되지않아도 항상 실행, default = false

  4. 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 쿠키를 지우게 되면,  ServerJSESSIONID 에 맞는 세션정보를 찾지못해 처음 접속하는 사용자로 판단해 로그인페이지로 리다이렉트 시킨다.


Rememeber Me 기능을 적용했다면,

 

Remeber-Me 쿠키의 문자열은 인증당시 사용했던 username 과 password, 만료일 등이 담겨져있다.

  • Remember Me 기능에 체크 후 인증 했다면 JSESSIONID 를 삭제해도 내부적으로 인증을 진행

  • SpringSecurityJSESSIONID 가 없다라도 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