Redis

[Redis] 분산 서버 환경에서의 세션 클러스터링(session clustering)

코푸딩 2023. 3. 23. 17:02
728x90

분산 서버 환경에서의 세션 사용 문제점

세션은 대표적인 로그인(회원 인증) 방식 중 하나이다.

로그인 시 서버에서 클라이언트로 세션 쿠키를 발급해주는데 분산 서버 환경에서는 이 세션에 대한 정보를 모든 서버가 공유할 수 있는 방법이 필요하다.

제대로 공유가 되지 않으면 로그인한 회원이 로그인한 서버 외의 서버에 접근할 경우 로그인이 안 된 것으로 식별되기 때문이다.

이런 문제를 해결하는 방법으로 Redis에 세션 정보를 저장하여 공유하는 방법이 있다.

단일 서버에서의 세션을 이용한 로그인
분산 서버 환경에서의 세션 공유 필요성

 

 

Redis를 이용한 세션 공유

구별된 인스턴스에서 Redis를 공유하기 위해서 아래의 설정이 필요하다.

//build.gradle에 redis, session 관련 의존성 추가
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'org.springframework.session:spring-session-data-redis'
    }

 

//application.yml 파일에 설정 추가. session.storage-type을 redis로 해두면 세션이 redis에 저장된다.
spring:
  redis:
    host: localhost
    port: 6379
  session:
    storage-type: redis

 

이제 세션에 데이터를 저장하는 코드를 작성해보자

간단한 구현을 위해 클라이언트에서 userId를 보내면 세션을 발급해주는 방식으로 구현한다.

//userId를 key-value 구조로 저장해 세션과 매칭한다. 아래에선 간단하게 name으로 저장
@PostMapping("/login")
    public void login(HttpSession session, @RequestParam String userId) {
        session.setAttribute("name", userId);
    }
    
//세션의 저장된 userId를 불러오는 코드
@GetMapping("/name")
    public String returnName(HttpSession session) {
        String name = (String)session.getAttribute("name");

        return name;
    }

 

'/login' 으로 userId를 보내면 쿠키가 발급되는 것을 확인할 수 있다.

 

728x90