MSA환경에서 세션관리하기(Feat. Redis session clustering)

2024. 6. 19. 18:16spring/security

  • 단일 서버에서 세션을 관리한다면 아무런 문제가 없겠지만, 보통 스케일 아웃 등을 통해 분산된 서버 환경에서 세션을 관리할 때 세션 불일치 문제가 발생할 수 있다.
  • 이러한 문제를 해결하기 위해 Session Clustering, Sticky Session, Redis Session Clustering 등이 존재한다.

Sticky Session

  • 세션을 사용해 트래픽을 분산하는 기능으로, 특정 세션의 요청을 최초 처리한 서버로만 전송하는 것을 의미한다.
  • 예를 들어 회원 1이 서버A에서 세션을 생성한다면, 이후 회원1이 보내는 모든 요청은 서버A로만 전송하게 된다.
  • 이러한 Sticky Session은 아래와 같은 단점이 존재한다.
    • 동일한 세션은 동일한 서버로만 전송하기 때문에 특정 서버에 요청이 몰려 과부하가 발생할 수 있다.
    • 특정 서버에 장애가 발생할 시, 해당 서버에 연결되어 있는 세션들이 모두 소실될 수 있다.

Session Clustering

  • 여러 WAS가 세션을 공유하여 동일하게 세션을 관리하는 방식을 의미한다.
  • session clustering 방식은 sticky session에서 발생했던 특정 서버에만 트래픽이 발생하거나, 장애 발생시 세션 소실의 문제를 해결할 수 있다.
  • 이러한 Session Clustering은 아래와 같은 단점이 존재한다.
    • 세션 데이터가 생성될때마다 모든 서버에 세션정보를 추가해야하기 때문에 서버의 메모리에 상당히 부담이 된다는 치명적인 단점이 존재한다.

Redis Session Clustering

    • Redis를 이용한 세션 클러스터링 방식은 세션을 관리할 저장소를 Redis로 따로 두어 사용하는 방식이다.
    • 세션을 관리할 저장소를 RDB가 아닌 Redis를 사용하면 아래와 같은 장점이 존재한다.
      • 세션은 데이터 모델이 관계형 DB처럼 복잡하지 않다.
      • 세션은 보통 만료시간이 존재하기 때문에 영속성이 필요하지 않다.
      • 세션은 사용자가 로그인 후 요청을 할 때마다 확인이 필요하기 때문에 그만큼 I/O가 많이 발생하고 RDB를 사용하는 경우에는 디스크 I/O로 인해 성능이슈가 발생할 수 있다.
      • 따라서, Redis는 세션 저장소에 적합한 DB라고 할 수 있다.
    • 하지만 Redis Session Clustering은 아래와 같은 단점이 존재한다.
      • 매 요청마다 Session Storage(=Redis)와 통신이 필요하게 되고 트래픽이 몰리게 될 경우, IO병목현상을 일으키거나 SPOF가 될 수 있다.
      • 이러한 이유로, 프로덕션 환경에서 Session기반의 Security는 신경써야할 것이 많고, 여러 서비스를 독립적으로 운용해야하는 MSA환경에서 Session을 핸들링하는 코드의 중복이 여럿 생길 수 밖에 없다.

참고자료

'spring > security' 카테고리의 다른 글

법인/통합계정/본인인증 로그인  (0) 2024.06.18