개요
- 스프링 시큐리티에서는 인증된 사용자에 대한 세션 생성 정책을 설정하여 어떻게 세션을 관리할지 결정 가능 → 이 정책은 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는 인증 관점에서 보아야 함
→ 인증에 관련된 작업에 한해서 세션을 생성하지 않거나 사용하지 않는다는 것
→ 즉, 인증과 관련 없는 곳에서 세션을 생성하거나 세션 관련된 작업은 가능
→ 정리 : 인증 관련해서만 세션을 사용하지 않음
'Language > Spring Security' 카테고리의 다른 글
예외 처리 - ExceptionHandling() (0) | 2024.07.29 |
---|---|
SessionManagementFilter / ConcurrentSessionFilter (0) | 2024.07.26 |
세션 고정 보호 - sessionManagement().sessionFixation() (0) | 2024.07.26 |
동시 세션 제어 - sessionManagement().maximumSessions() (0) | 2024.07.26 |
SecurityContextRepository / SecurityContextHolderFilter (0) | 2024.07.25 |