스프링 시큐리티 레디스 세션

김동영·2024년 4월 25일
1

전제조건 - 스프링 시큐리티가 적용된 경우에 한함
그 외에도 동작할 수 있으나 확인하지 않음

이슈 설명

  • 기존 스프링 시큐리티 적용된 서버로 로그인이 구현되어 있었음.
  • 이후 k8s HPA 적용으로 파드가 최소 2개로 변경되면서 각 파드 당 세션을 공통으로 관리해야되는 이슈가 발생함.
  • 이를 해결하기 위해 스프링 레디스 세션 도입

도입 이유

  • 기존 스프링 세션을 필터단계에서 후킹하여 레디스에 저장하고 관리하도록 하는 방식
  • 이로 인해 레디스 및 관련 설정만 추가하면 바로 동작하여 기존 코드를 해치지 않음.
  • 따라서 러닝커브 및 협업에 있어서 불필요한 정보를 교육하지 않아도 되기 때문에 선택함.

적용 방법

1. 디펜던시 추가

// Redis & Spring session data redis - for k8s HPA
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.session:spring-session-data-redis'

2. 레디스 관련 yaml 추가

spring:
  session:
    store-type: redis
  redis:
    host: host-domain
    port: 6379
    password: redis-password

3. 레디스 세션 컨피그 추가

@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 600) // sec
public class RedisSessionConfig {

    @Value("${spring.redis.host}") private String host;

    @Value("${spring.redis.port}") private String port;

    @Value("${spring.redis.password}") private String password;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        var redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setPort(Integer.parseInt(port));
        redisStandaloneConfiguration.setPassword(password);
        return new LettuceConnectionFactory(redisStandaloneConfiguration);
    }
}

4. UserDetails 구현체 수정

Serializable 을 추가하여 동시성을 보장해야 한다.(TODO: 정확한 이유를 확인해야 함.

// 구현체에 Serializable implements 추가
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class UserDetailsImpl implements UserDetails, Serializable {
...
}
profile
k8s, 프레임워크와 함께하는 백엔드 개발자입니다.

0개의 댓글