새소식

반응형
Java/Spring

Spring Security SessionRegistry, SpringSessionBackedSessionRegistry<S extends Session>

  • -
반응형

SpringSessionBackedSessionRegistry<S extends Session> 이란?

Spring Security  의 동시 세션 제어 기능 및 Spring Session 을 사용하여 분산 환경(다중 서버)에서도

동작하게 만들어주는 구현체입니다.

 

SessionRegistry 란?

Spring Security 의 SessionRegistry 인터페이스란 현재 로그인한 사용자의 세션 목록을 관리하고

동시 세션 개수를 제어하는데 사용된다.

 

public interface SessionRegistry {
    List<Object> getAllPrincipals();
    List<SessionInformation> getAllSessions(Object principal, boolean includeExpiredSessions);
    SessionInformation getSessionInformation(String sessionId);
    void registerNewSession(String sessionId, Object principal);
    void removeSessionInformation(String sessionId);
}

 

SessionRegistry 인터페이스의 기본 구현체인 SessionRegistryImpl 은 서버 메모리에만 세션 정보를 저장하므로,

서버가 여러대일 경우 세션 동기화가 안된다.

 

다중 서버에서 Spring Session 을 사용하여 세션 정보를 저장할 경우 Redis 나 JDBC 로 동기화를 할 수 있다.

이때 SessionRegistry 를 Redis 기반 세션 저장소와 연결해주는 구현체가 바로

SpringSessionBackedSessionRegistry 다.

 

제네릭 <S extends Session> 의미

  • S 는 Spring Session 의 세션 타입을 의미한다.
    • Redis 를 쓰면 MapSession
    • JDBC 를 쓰면 JdbcSession
  • 어떤 Session 저장소를 사용하든 SpringSessionBackedSessionRegistry 는 해당 세션 타입과 연동된다.

 

동작 방식

SpringSessionBackedSessionRegistry 는 Spring Session 이 관리하는 세션 저장소(예:redis)에

직접 접근하여 SessionRegistry가 필요로 하는 기능을 제공한다.

 

  • 등록(registerNewSession) : Redis에 해당 세션ID 와 principal 저장
  • 조회(getAllSessions) : redis에서 principal에 해당하는 모든 세션 ID 읽어오기
  • 삭제(removeSessionInformation) : Redis 에서 해당 세션 삭제

 

사용 예시

동시 세션 제어를 Spring Session + Redis 에서 하고싶을때의 예시이다.

 

@Configuration
@EnableWebSecurity
public class SecurityConfig {
	@Bean
    public SpringSessionBackedSessionRegistry<? extends Session> sessionRegistry(
            FindByIndexNameSessionRepository<? extends Session> sessionRepository) {
        return new SpringSessionBackedSessionRegistry<>(sessionRepository);
    }
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http,
                                           SpringSessionBackedSessionRegistry<? extends Session> sessionRegistry) throws Exception {
        http
            .sessionManagement(session -> session
                .maximumSessions(1)  // 최대 1개 세션만 허용
                .maxSessionsPreventsLogin(true) // true면 기존 세션 유지, false면 기존 세션 만료
                .sessionRegistry(sessionRegistry)
            );
        return http.build();
    }
}

 

SpringSessionBackedSessionRegistry 구현체를 사용하여 Redis 기반 다중 서버 환경에서 Spring Session 동기화를 한다.

  • 사용자가 새로 로그인할 때 Redis 기반으로 현재 로그인 세션 목록을 조회
  • 기존 세션이 1개 이상이면 정책에 따라 새 로그인 차단 또는 기존 세션 만료
  • 서버 인스턴스 수와 상관없이 세션 동기화 가능

 

핵심 요약

  • Spring Security SessionRegistry 의 Spring Session 기반 구현체
  • Redis / JDBC 등 중앙 세션 저장소에서 세션을 관리하여 분산 환경 동시 세션 제어
  • HttpSecurity.sessionManagement().maximumSessions() 설정
  • 서버 메모리에 의존하지 않고 다중 서버 동일 세션 제어 가능

 

 

 

 

 

반응형
Contents