본문 바로가기

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

세션 관리 설정, 커스터마이징 : 세션 생성 정책 설정

 - Spring Security 에서 제공하는 세션 생성 정책(SessionCreationPolicy) 의 개념

 - ALWAYS, IF_REQUIRED, NEVER, STATELESS 의 차이 명확하게 구분하기

 - 실제 비즈니스 요구사항에 맞추어 적절한 정책 선택법

 - 코드 설정법, 실무에서 자주 발생하는 문제

 - 세션 관리 정책과 REST API 설계의 관계


세션 생성 정책(SessionCreationPolicy)

Spring Security 는 인증 / 인가를 처리할 때 세션을 어떻게 생성하고 활용할 지 결정할 수 있는

SessionCreationPolicy 를 제공하고 있다

 

1. 기본 개념

  • HTTP는 본질적으로 무상태성(Stateless) 프로토콜이다
  • 하지만 로그인 유지, 사용자 상태 저장 등의 이유로 서버는 세션을 활용한다
  • Spring Security는 기본적으로 필요할때만 세션을 생성하여 활용함

SessionCreationPolicy

 

 

 

2. SessionCreationPolicy 의 종류

정책 설명 사용 예시
ALWAYS 요청이 올때마다 세션을 항상 생성한다 테스트 환경
세션 기반 상태 추적이 필수인 시스템
IF_REQUIRED 필요한 경우에만 세션을 생성한다
(Security 기본값임)
일반적인 웹 애플리케이션
NEVER Spring Security는 세션을 생성하지 않지만,
기존 세션이 있다면 사용한다
외부 시스템이 세션을 관리하는 경우
STATELESS 세션을 전혀 생성하지 않으며,
기존 세션도 사용하지 않는다
REST API, JWT 기반 인증
(세션이 필요없음)

 

 

 

3. 코드 설정 예시

Spring Security에서는 HttpSecurity 객체를 통해 설정한다

 import org.springframework.security.config.http.SessionCreationPolicy;
 
    @Bean
    @Order(1)
    public SecurityFilterChain meFilterChain(HttpSecurity http) throws Exception {
        http
        //세션 생성 정책 설정하기
                .sessionManagement(session -> session
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)); // REST API, JWT 일때
        return http.build();
    }

 

 

 

4. 정책 선택 기준

  • 세션 기반 웹 애플리케이션 : IF_REQUIRED (로그인시 세션 생성, 일반적으로 가장 많이 사용함)
  • API 서버(JWT, OAuth2 등 토큰 기반 인증) : STATELESS (모든 요청을 독립적으로 처리함)
  • 외부 세션 관리 시스템 존재 : NEVER
  • 테스트 환경, 강제 세션 추적 필요 : ALWAYS

  • STATELESS 정책에서는 반드시 JWT, API key 등 별도의 인증 수단을 도입해야한다
  • 만에 하나라도 세션 기반 인증과 토큰 기반 인증을 혼합하는 경우, 정책을 신중히 선택해야한다
  • 로드 밸런서나 서버 확장 환경에서는 세션 클러스터링 문제를 고려해야함
  • 보안 로그 추적이 필요한 경우 ALWAYS는 과도하게 세션을 생성할 수 있으므로 피해야한다고 함

정리

구분 특징 주요 사용 사례
ALWAYS 무조건 세션을 생성함 세션 추적 강제 필요
IF_REQUIRED 필요할때 세션을 생성함(기본값) 전통적 웹 애플리케이션
NEVER 세션 생성은 하지 않지만 기존 세션은 사용 외부 세션 관리 시스템
STATELESS 세션을 전혀 사용하지 않음 REST API, JWT 기반 인증