본문 바로가기

Language/Spring Security

세션 생성 정책 - sessionManagement().sessionCreationPolicy()

개요

  • 스프링 시큐리티에서는 인증된 사용자에 대한 세션 생성 정책을 설정하여 어떻게 세션을 관리할지 결정 가능 → 이 정책은 SessionCreationPolicy로 설정

 

세션 생성 정책 전략

  • SessionCreationPolicy.ALWAYS
    • 인증 여부에 상관없이(익명 사용자) 항상 세션을 생성
    • ForceEagerSessionCreationFilter 클래스를 추가 구성 → 세션을 강제로 생성
  • SessionCreationPolicy.NEVER
    • 스프링 시큐리티가 세션을 생성하지 않지만 애플리케이션이 이미 생성한 세션은 사용 가능
      → 이미 생성한 세션 = WAS(Tomcat)
  • SessionCreationPolicy.IF_REQUIRED (기본값)
    • 필요한 경우에만 세션을 생성
    • 예를 들어 인증이 필요한 자원에 접근할 때 세션을 생성
  • SessionCreationPolicy.STATELESS
    • 세션을 생성하거나 사용하지 않음
    • 인증 필터는 인증 완료 후 SecurityContext를 세션에 저장하지 않으며 JWT 와 같이 세션을 사용하지 않는 방식으로 인증을 관리할 때 유용할 수 있음
    • SecurityContextHolderFilter는 세션 단위가 아닌 요청 단위로 항상 새로운 SecurityContext 객체를 생성하므로 컨텍스트 영속성이 유지되지 않음

sessionManagement() API -­ 세션 생성 정책

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

    http.sessionManagement(session -> session
	        .sessionCreationPolicy(SessionCreationPolicy.STALTELESS)
    );
    return http.build();
}

 

STATELESS 설정에도 세션 생성 가능

  • 스프링 시큐리티에서 CSRF 기능이 활성화 되어 있고 CSRF 기능이 수행 될 경우 사용자의 세션을 생성해서 CSRF 토큰을 저장
    STATELESS를 한다고 해서 CSRF 토큰을 세션에 저장하지 않는 것이 아님
  • 세션은 생성되지만 CSRF 기능을 위해서 사용될 뿐 인증 프로세스의 SecurityContext 영속성에 영향을 미치지 않음

SessionCreationPolicy.STATELESS 추가 정리

  • SecurityContextHolderFilter에서 사용하는 두 개의 저장소인 Session과 Request 중 Session을 사용하지 않고 무조건 Request에 저장하여 세션에 저장한 것이 아니기 때문에 영속성이 유지가 되지 않음
    → 세션이 필요 없는 인증 방식을 선택할 경우 해당 전략을 선택
  • STATELESS는 인증 관점에서 보아야 함
    → 인증에 관련된 작업에 한해서 세션을 생성하지 않거나 사용하지 않는다는 것
    → 즉, 인증과 관련 없는 곳에서 세션을 생성하거나 세션 관련된 작업은 가능
    → 정리 : 인증 관련해서만 세션을 사용하지 않음