본문 바로가기

Spring Boot/Security 쿠키,세션 기반 인증,인가

세션 관리 설정과 커스터마이징 : 세션 타임아웃 설정

 - 세션 타임아웃의 개념, 필요성

 - 서버 단에서 세션 타임아웃을 설정하는 방법

 - Spring Security 환경에서 세션 만료 이벤트를 처리하는 방법

 - 세션 타임아웃을 비즈니스 요구사항에 맞게 커스터마이징 하는 방법

 - 실무에서 자주 발생하는 세션 타임아웃 관련 이슈들


세션 타임아웃 설정

세션 타임아웃(Session Timeout) 이란
사용자가 일정 시간 동안 활동하지 않았을 때 보안 강화를 위해 자동으로 세션을 종료하는 기능임

불필요한 서버 자원 사용을 줄이고, 보안 사고를 예방하는 중요한 전략이다

 

1. 서버 설정(application.yml)

Spring Boot에서의 세션 타임아웃 설정은 일반적으로 application.yml 또는 application.properties 에서 할 수 있다

https://b1uffer.tistory.com/439 참고

 

server:
  servlet:
    session:
      timeout: 30m # 30분동안 활동이 없으면, 세션 종료
      
# application.properties
# server.servlet.session.timeout=30m

 

위 설정은 Tomcat 같은 서블릿 컨테이너 수준에서 세션 타임아웃을 관리한다

 

 

2. 세션 만료 이벤트 처리

Spring은 세션 만료시 HttpSessionEvent 를 발생시킴

이를 활용해서 로그아웃 로그 저장, 알림 전송 등 후처리를 할 수 있음

import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class SessionTimeoutListener implements HttpSessionListener {
    private static final Logger log = LoggerFactory.getLogger(SessionTimeoutListener.class);

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        log.info("세션 생성됨 : {}", se.getSession().getId());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        log.info("세션 만료됨 : {}", se.getSession().getId());
        // 만료 메서드에서 DB 로그 기록, 알림 전송 등을 수행할 수 있다
    }
}

 

SessionTimeoutListener 클래스에서 세션이 만료될 때 sessionDestroyed 메서드가 호출되어 로그를 남기거나 후속 조치를 실행할 수 있다

 

 

 

3. 세션 타임아웃 커스터마이징

비즈니스 요구에 따라 세션 타임아웃을 사용자별로 다르게 적용하거나 특정 요청마다 연장할 수 있다

세션은 사실 리스너랑 FilterChain의 sessionManagement가 전부 아닌가??

 

    @Bean
    @Order(1)
    public SecurityFilterChain meFilterChain(HttpSecurity http) throws Exception {
        http
                .securityMatcher("/me/**")
                .csrf(csrf -> csrf.disable())
                .sessionManagement(session -> session
                        //세션 생성 정책 설정하기
                        .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // REST API, JWT일 때
                        
                        // 이 부분
                        .invalidSessionUrl("/session-expired") // 사용할 수 없는 세션 사용시 이동할 URL
                        
                        .maximumSessions(1) // 최대 1개의 세션만 허용하기
                        
                        //이 부분도
                        .expiredUrl("/auths/login-form") // 세션 만료시 이동할 URL, 로그인 다시 하세요
                )

 

세션이 만료되면 /auth/login-form 으로 리다이렉트된다. 페이지를 만들었다면 로그인 다시해야됨

 


  • 금융 서비스나 보안이 중요한 서비는 짧은 타임아웃(예 : 10분)을 설정하는 것이 일반적이다
  • 반대로 쇼핑몰처럼 사용자 경험이 중요한 경우, 긴 타임아웃(예 : 1~2시간)을 설정할 수 있다
  • 사용자 행동(클릭, AJAX 요청 등)이 발생할 때마다 세션을 연장하도록 클라이언트와 서버 로직을 조정할 수 있다
  • 세션 만료 처리를 UI 단(프론트엔드)에서도 감지하여 사용자에게 안내 메시지를 보여주는 것이 좋다

정리

구분 설명 예시
기본 설정 application.yml 에서 설정함 server:servlet:session:timeout: 30m
이벤트 처리 HttpSessionListener 활용 세션 만료 로그 기록
커스터마이징 SecurityConfig에서
invalidSessionUrl 등 설정하기
/session-expired 리다이렉트