스프링 시큐리티에서 Redis를 이용해 세션을 공유하는 방법

스프링 시큐리티에서 Redis를 이용해 세션을 공유하는 방법은 Spring Session이라는 별도의 프로젝트를 활용하는 것이 보편적입니다. Spring Session은 HttpSession을 Redis 같은 외부 저장소에 저장하여 여러 WAS 간 세션을 공유할 수 있게 하며, 스프링 시큐리티와도 통합되어 인증 세션을 안정적으로 관리할 수 있습니다.

Redis와 Spring Session 구성 방법

  • @EnableRedisHttpSession 애노테이션을 사용해 Redis 기반 세션 저장소를 활성화한다.

  • Redis 서버와 연결하기 위한 RedisConnectionFactory를 설정한다.

  • Redis에 저장되는 세션의 키와 값을 적절히 직렬화하기 위해 RedisTemplate을 구성한다.

  • 이렇게 설정하면 스프링 시큐리티가 기본적으로 사용하는 HttpSession을 Redis-backed 세션으로 대체한다.

스프링 시큐리티와 세션 공유

  • Spring Security는 SecurityContext를 HttpSession에 저장하는데, Spring Session과 연동하면 이 데이터가 Redis에 저장된다.

  • 여러 대의 WAS가 동일 Redis DB를 참조하므로 세션 공유가 가능해지고, 분산 환경에서도 동시성 제어 및 세션 관리가 가능하다.

  • 스프링 시큐리티의 동시 세션 제어(concurrent session control)도 Redis 세션 저장소와 통합해 정상 작동한다.

세션 공유 설정 예시

java
@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {

@Bean
public RedisConnectionFactory redisConnectionFactory() {
// Redis 서버 연결 설정 (localhost, 포트 6379 예시)
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379));
}

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}

스프링 시큐리티 설정에서 세션 관리

java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Autowired
private FindByIndexNameSessionRepository<?> sessionRepository;

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.sessionManagement(session -> session
.maximumSessions(1)
.sessionRegistry(sessionRegistry())
)
.build();
}

@Bean
public SpringSessionBackedSessionRegistry<?> sessionRegistry() {
return new SpringSessionBackedSessionRegistry<>(sessionRepository);
}
}

이렇게 하면 Redis에 세션이 저장되어 여러 개의 서버가 동일 Redis를 연결할 때 세션이 공유됩니다. 인증 정보도 Redis에 저장되어 세션을 불러오는 어떤 서버에서든 인증 상태 유지가 가능합니다.​

요약하면, 스프링 시큐리티에서 RADIUS 인증과 Redis 세션 공유 시 RADIUS 인증 결과를 스프링 시큐리티 인증 컨텍스트에 적용하고, 세션 저장소는 Spring Session + Redis를 이용해 여러 서버 간 공유하는 방식으로 구성구성합니다.