[java] Spring Session을 사용한 분산 세션 관리 방법

웹 애플리케이션에서 세션은 사용자의 상태와 인증 정보를 유지하는 중요한 요소입니다. 그러나 세션을 단일 서버에 저장하는 경우 서버 장애로 인해 세션 정보가 유실될 수 있습니다. 이를 방지하기 위해 Spring Session을 사용하여 세션을 분산 관리하는 방법을 알아보겠습니다.

1. Spring Session이란?

Spring Session은 Spring 기반 웹 애플리케이션에서 세션을 관리하기 위한 프레임워크입니다. 기존 HttpSession 인터페이스를 대체하여 세션을 분산 저장소에 저장하고, 다양한 세션 관리 기능을 제공합니다.

2. 분산 세션 관리 설정

Spring Session을 사용하여 분산 세션 관리를 구현하기 위해서는 몇 가지 설정이 필요합니다.

2.1. 의존성 추가

먼저, 프로젝트의 의존성에 Spring Session을 추가해주어야 합니다. Maven을 사용하는 경우, pom.xml 파일에 다음과 같이 의존성을 추가합니다.

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-core</artifactId>
    <version>2.4.0</version>
</dependency>

2.2. Redis 설정

Redis는 대표적인 분산 세션 저장소입니다. Spring Session을 사용하여 분산 세션 관리를 구현하려면 Redis 서버가 필요합니다. Redis 서버를 사용하기 위해 spring-data-redis 의존성을 추가하고, Redis 연결 설정을 해야 합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

분산 세션 관리를 위한 Redis 설정은 application.properties 파일에 아래와 같이 추가합니다.

spring.redis.host=localhost
spring.redis.port=6379

2.3. Spring Session 활성화

Spring Boot 애플리케이션의 메인 클래스에 @EnableRedisHttpSession 어노테이션을 추가하여 Spring Session을 활성화합니다. 이를 통해 Redis를 사용하여 세션을 관리하도록 설정됩니다.

@SpringBootApplication
@EnableRedisHttpSession
public class Application {
    // ...
}

3. 세션 유지 및 조회하기

Spring Session을 사용하여 세션을 유지하고 조회하는 방법은 기존 HttpSession 인터페이스와 매우 유사합니다. Spring Session은 HttpSession 인터페이스의 구현체이므로, HttpSession과 동일한 메서드를 활용할 수 있습니다.

@Controller
public class MyController {
    
    @GetMapping("/login")
    public String login(HttpSession session) {
        session.setAttribute("user", "John");
        return "home";
    }
    
    @GetMapping("/home")
    public String home(HttpSession session) {
        String user = (String) session.getAttribute("user");
        // ...
        return "home";
    }
}

위의 예제에서는 login 메서드에서 HttpSession을 사용하여 사용자 정보를 세션에 저장하고, home 메서드에서 세션에서 사용자 정보를 읽어옵니다.

4. 세션 타임아웃 설정

Spring Session은 server.servlet.session.timeout 프로퍼티를 사용하여 세션의 타임아웃을 설정할 수 있습니다.

# 세션 타임아웃을 30분으로 설정
server.servlet.session.timeout=30m

5. 참고 자료