Spring/Spring Security

[Spring Security] Remember Me

제우제우 2024. 9. 2. 20:16

설정 코드 

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
    return http
            .authorizeHttpRequests(
                    authorize -> authorize
                    .requestMatchers("/auth/login").permitAll()
                    .anyRequest().authenticated())
            .csrf(AbstractHttpConfigurer::disable)
            .formLogin(login -> login
                    .loginPage("/auth/login")
                    .loginProcessingUrl("/auth/login")
                    .usernameParameter("username")
                    .passwordParameter("password")
                    .defaultSuccessUrl("/")
            )
            .userDetailsService(userDetailService())
            .rememberMe(rm -> rm 
                    .rememberMeParameter("remember")
                    .alwaysRemember(false) 
                    .tokenValiditySeconds(2592000)
            )
            .build();
}

 

.rememberMe(rm -> rm // remember me 기능 작동  
        .rememberMeParameter("remember") // default: remember-me, checkbox 이름과 동일 해야함 
        .alwaysRemember(false) // default: false 사용자가 체크박스를 활성화하지 않아도 항상 실행
        .tokenValiditySeconds(2592000) // remember-me 쿠키 만료기간 default 14일 
)

 

 

상세 설명 

rememberMe()

Spring Security에서 Remember Me 기능을 활성화

사용자가 애플리케이션에 로그인할 때 선택적으로 자신의 인증 상태를 기억하도록 할 수 있다. 

즉 세션 만료 기간이 지나도 Remember Me 쿠키가 존재하면 재로그인을 하지 않고 새로운 세션을 만들어준다. 

자동 갱신 느낌 

 

rememberMeParameter("remember")

Remember Me 기능을 활성화하는 파라미터의 이름을 설정

기본적으로 이 파라미터의 이름은 remember-me

 

check box 예시 

<input type="checkbox" name="remember"> Remember Me

 

alwaysRemember(false)

Remember Me 기능이 항상 작동할지 여부를 결정

기본값은 false이며, 사용자가 로그인 폼에서 Remember Me 체크박스를 선택한 경우에만 작동

만약 true로 설정하면, 사용자가 체크박스를 선택하지 않더라도 Remember Me 기능이 항상 활성화

 

tokenValiditySeconds(2592000)

Remember Me 쿠키의 유효 기간을 초(second) 단위로 설정

기본 유효 기간은 14일이지만, 이 설정을 통해 30일 동안 로그인 상태를 유지하도록 변경

 

Remember Me 기능의 동작 방식

1. 로그인 이후 remember-me 쿠키 저장 

사용자가 로그인 폼에서 Remember Me 체크박스를 선택하고 로그인할 때, 서버는 remember-me 쿠키를 클라이언트 브라우저에 저장

 

2. 다음 방문 시

쿠키가 여전히 유효하다면(설정된 만료 기간 내에 있다면), 사용자는 자동으로 로그인

 

3. 세션 만료와 독립적

Remember Me 기능은 브라우저가 닫히거나 서버의 세션이 만료되더라도, 쿠키가 만료되지 않았다면 사용자를 인증할 수 있다. 이는 사용자 경험(UX)을 향상시켜준다. 

 

Remember Me  테스트 

로그인 +  Remember me 체크 

### 로그인

POST http://localhost:8080/auth/login
Content-Type: application/x-www-form-urlencoded

username=baejeu&password=1234&remember=1

 

로그인 결과 + 쿠키 확인 

메인 페이지

# domain	path	name	value	date
localhost	/	SESSION	ZGUyMGQyM2MtMDMxZi00Yjk4LWFlYzUtODVkOTg2NWFhNDU4	Mon, 02-Sep-2024 12:12:16
localhost	/	remember-me	YmFlamV1OjE3Mjc4Njc1MzYxNTA6U0hBMjU2OmY5NmI2NDI1ZDVlYTFjNGMyNDgxNGZhZDE0ODQ0YTQzZGFmNDA4NzQyYjJiNDc0MGYyMjY1NmRlYmQ4NDlmNjM	Wed, 02-Oct-2024 11:12:16

 

세션 쿠키뿐만 아니라 remember-me 쿠키가 추가로 생성되어 있다. 

세션 쿠키를 삭제하고 인가가 필요한 페이지에 요청해도 remember-me 쿠키 덕분에 정상적으로 요청이 되고 세션 쿠키 또한 새롭게 갱신된다.