본문 바로가기

spring/security

[Spring security] Redis를 이용한 글로벌 세션 스토리지

시작글

 

Spring security는 Authentication 인증 객체를 세션에 보관하여 사용하는 것이 디폴트이다.

하지만 세션은 분산 컴퓨팅 환경에서 세션 또한 분산된다.

이점은 로그인 처리시에 로그인 상태를 확인하는 기능을 구현할 때 장애를 유발할 수 있다.

 

따라서 세션을 이용한 로그인 상태 처리 방식은 분산 환경에서 결함을 지니고 있다. 이를 해결하기 위한 방법은 in memory database를 이용하는 방법이다. 이런 DB 중에 하나가 Redis인데 이것을 이용하여 세션을 대체하는 방법을 적용해보자.

 

+) 처음에는 SecurityContextRepository와 SecurityContext를 커스텀해서 사용해야하나? 생각했는데 다행히 더 좋은 효과적인 방법이 있었다. 이 방법은 HttpSession을 대체하여 세션 자체를 커스텀하는 것 같다. 이에 관해서는 더 공부해야할 것 같다.

 

 

적용 스탭

1. redis 적용 라이브러리 추가

2. config 설정하기

 

 

1.  redis 적용 라이브러리 추가

//redis
implementation 'org.springframework.session:spring-session-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

처음 추가한 라이브러리는 세션 데이터를 redis로 연결하는 라이브러리

두번째 추가한 라이브러리는 redis 연결을 위한 라이브러리이다.

 

spring:
  redis:
    host: localhost
    port: 6379

그리고 application.yml에서 redis 서버에 관한 설정 정보를 입력한다.

 

 

2. config 설정하기

@Configuration
@EnableRedisHttpSession
public class RedisConfig {

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

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

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }

}

Redis에 접속한 커넥션을 만들어주는 Factory 객체를 빈으로 등록하면 Redis를 이용한 세션 처리를 구현이 완성된다.

Redis에 접속하는 클라이언트 라이브러리에 대한 성능 비교글을 보면 Lettuce의 성능이 좋아서 더 자주 선택되는 것 같다.

 

Jedis 보다 Lettuce 를 쓰자

Java의 Redis Client는 크게 2가지가 있습니다. Jedis Lettuce 둘 모두 몇천개의 Star를 가질만큼 유명한 오픈소스입니다. 이번 시간에는 둘 중 어떤것을 사용해야할지에 대해 성능 테스트 결과를 공유하

jojoldu.tistory.com

 

테스트

 

1. 다른 서버에서 로그인 처리되는지 확인

 

서로 다르게 구동된 서버에서 같은 세션 쿠키로 접근 제한 페이지 접근시 결과는 모두 성공했다.

 

2. Redis에 직렬화된 데이터 확인

어찌보면 당연한 결과이지만 redis에서 조회된 데이터 역시 직렬화된 데이터가 존재했으며 redis에 입력한 데이터는 SecurityContext 객체였다.

 

후기

스프링이 나온지 오래된 기술이고 그 동안 많이 발전이 있었던 만큼 이미 필요한 기능은 쉽게 구현할 수 있는 라이브러리가 많은 것을 느꼈다. 하지만 구현만 가능할 뿐 어떻게 동작하는지는 파악이 쉽지가 않았다. 다음으로는 Redis란 정확하게 무엇이기고 어떤 장점이 있는지 고려해야할 사항(trade off)가 무엇인지 등을 알아보고 Spring session에 대한 내용을 공부해 봐야겠다.