- 세션 타임아웃의 개념, 필요성
- 서버 단에서 세션 타임아웃을 설정하는 방법
- 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 리다이렉트 |
'Spring Boot > Security 쿠키,세션 기반 인증,인가' 카테고리의 다른 글
| 동시 세션 제어와 세션 고정 보호 : 동시 세션 제어 (0) | 2026.05.10 |
|---|---|
| 세션 관리 설정과 커스터마이징 : 세션 만료 후 처리 전략 (0) | 2026.05.08 |
| 세션 관리 설정, 커스터마이징 : 세션 생성 정책 설정 (0) | 2026.05.07 |
| 세션 관리 핵심 컴포넌트 : 세션 이벤트와 리스너 (0) | 2026.05.07 |
| 세션 관리 핵심 컴포넌트 : 세션 관리 필터 (0) | 2026.05.06 |