0+ 스프링/0+ 스프링 Security

[스프링 시큐리티] 2. 기본 API 및 Filter 이해(Remember-me + JSESSIONID)

힘들면힘을내는쿼카 2022. 12. 25. 20:43
728x90
반응형

[스프링 시큐리티] 2. 기본 API 및 Filter 이해(Remember-me + JSESSIONID)

해당 포스팅은 인프런에서 스프링 시큐리티 정수원님의 강의를 참고하여 작성했습니다.
스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security - 인프런 | 강의

 

스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security - 인프런 | 강의

초급에서 중.고급에 이르기까지 스프링 시큐리티의 기본 개념부터 API 사용법과 내부 아키텍처를 학습하게 되고 이를 바탕으로 실전 프로젝트를 완성해 나감으로써 스프링 시큐리티의 인증과

www.inflearn.com

JSESSIONID

JSESSIONID

잠깐! 스프링 시큐리티 Remember-me에 관한 포스팅 아닌가요?!
맞습니다.!

Remember-me를 알기 위해서 간략하게 JSESSIONID의 개념에 대해서 알아봅시다

스프링 부트는 내장 톰캣을 사용하는 것 알고 계신가요?!
JSESSIONID톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키 입니다.
즉, 세션에서 사용되는 쿠키 이름입니다.

  1. 클라이언트가 서버에 요청 합니다.
  2. 클라이언트가 최초 요청했다고 판단하면 TomcatJSESSIONID를 발급 합니다.
  3. 클라이언트로 전달된 JSESSIONID값은 쿠키 형태로 사용자의 매번 요청 때마다 서버에 전달 됩니다.
  4. 서버는 해당 JSESSIONID값으로 동일한 사용자의 요청인지 판단하여 사용자 정보를 유지합니다.

Remember-me 인증

혹시 로그인 창에서 자동 로그인 체크박스를 경험하신적 있나요?
자동 로그인에 해당하는 부분이 바로 Remember-me 입니다.
스프링 시큐리티는 어떻게 제공하는지 알아봅시다.!

간략하게 Remember-me 기능을 소개하겠습니다.

  • 세션이 만료되고 웹 브라우저가 종료된 후에도 어플리케이션이 사용자를 기억하는 기능
  • Remember-me 쿠키에 대한 Http 요청을 확인한 후 토큰 기반 인증을 사용해 유효성을 검사하고 토큰이 검증되면 사용자는 로그인 됩니다.
  • 사용자 라이프 사이클
    • 인증 성공(Remember-me 쿠키 설정)
    • 인증 실패(쿠키가 존재하면 쿠키 무효화)
    • 로그아웃(쿠키가 존재하면 쿠키 무효화)

SecurityConfig

@Configuration
@EnableWebSecurity // 웹 보안 활성화
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final UserDetailsService userDetailsService;

    @overide
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .anyRequest().authenticated();

        http
        .formLogin();

        http
        .rememberMe() // remember-me 기능 동작
        .rememberMeParameter("remember") //기본 파라미터명은 remember-me
        .tokenValiditySeconds(3600) // default는 14일
        .alwaysRemember(false) // true: remember-me 기능이 활성화 되지 않아도 항상 실행(default false)
        .userDetailsService(userDetailsService);

    }
}

MySecurityController

@RestController
public class MySecurityController {

    @GetMapping("/")
    public String index() {
        return "home";
    }
}

Remember-me 테스트

Remember-me를 테스트 해봅시다.

  1. Remember-me를 체크하고 로그인 합니다.
  1. EditThisCookie 를 통해 쿠키를 확인합니다.
    1. EditThisCookie - Chrome 웹 스토어
  1. JSESSIONID 쿠키를 삭제 합니다.
  1. GET localhost:8080 후에 쿠키를 확인합니다.
  1. Remember-me 쿠키로 JSESSIONID가 생성된것을 확인합니다.
    1. 과거에 인증을 받은 사용자임을 인식!
  2. JSESSIONID, Remember-me 쿠키를 모두 삭제 합니다.
  3. GET localhost:8080 을 실행합니다.
  4. 로그인 페이지로 이동하는 것을 확인 할 수 있습니다.
  5. Remember-me를 체크하지 않고 로그인 합니다.
  1. Remember-me 쿠키가 생성되지 않는 것을 확인 할 수 있습니다.
    1. 새롭게 인증을 받아 JSESSIONID이 생성!
  1. JSESSIONID 쿠키를 삭제 합니다.
  1. GET localhost:8080 을 실행합니다.
  2. 로그인 페이지로 이동하는 것을 확인 할 수 있습니다.

Remember-me 인증 과정

테스트 해보셨나요?!
🧙 스프링 시큐리티는 어떤 마법으로 remember-me 처리하는지 알아봅시다!

먼저 SecurityContext에 저장되어 있는 인증객체가 NULL인 경우 RememberMeAuthenticationFilter가 동작합니다.

 

 

 

728x90
반응형