Session Store

이정원·2024년 11월 2일
post-thumbnail

Spring frame work에선 http 세션 정보를 저장하고 관련 기능을 제공하는 Spring session이 있다. 세션 정보를 Redis 데이터베이스에 적재하고 활용하는 방법을 알아보자.

Session

세션(Session)은 클라이언트와 서버 간의 상호작용을 위해 유지되는 상태 데이터를 의미한다. 세션을 통해 이전 요청에서 생성된 데이터를 이후 요청에서도 사용할 수 있게 된다. 일반적으로 세션은 HTTP 세션을 가리키지만, TCP 세션, HTTP 세션, WebSocket 세션 등 여러 방식으로 분류되고 식별될 수 있다.

Spring Session은 웹 애플리케이션에서 세션 관리를 위한 표준 인터페이스와 다양한 세션 저장소를 제공한다. Spring Session은 Redis 외에도 JDBC, Hazelcast, MongoDB 등 여러 저장소와 연동할 수 있다. Dependencies에서 Spring Data Redis를 추가할 경우, 기본적으로 포함된 spring-session-core가 제외되고 필요한 Redis 관련 종속성이 추가된다.

 implementation 'org.springframework.session:spring-session-data-redis'

간단한 세션 관련 코드를 짜보면,

컨트롤러

@GetMapping("/")
	public void home(HttpSession session){
		Integer visitCounter = (Integer)session.getAttribute("visits");
		if(visitCounter==null){
			visitCounter=0;
		}
		session.setAttribute("visits",++visitCounter);
		log.info("session={}",session);
	}

해당 "/"로 접속을 하게 되면 session의 visits 속성을 가져오고 항상 visitcount를 증가한 상태로 session에 저장한다.

Spring 로깅 결과

Redis Monitor 결과

session.getAttribute -> Redis 명령어

  • HGETALL: Redis의 해시(Hash)구조에서 세션 ID와 관련된 모든 데이터를 가져온다.

session.setAttribute -> Redis 명령어

  • HMSET: 세션이 마지막으로 접근된 시간을 여러 필드에 저장한다.

  • PEXPIREAT: 세션의 만료 시간을 밀리초 단위로 설정한다.

  • EXISTS: Redis에서 지정된 키가 존재하는지 확인하는 명령이다.


Redis는 분산 환경에서도 세션 데이터를 일관되게 저장하고 관리할 수 있는 중앙 집중형 세션 저장소로 작동한다. 따라서 여러 개의 웹 애플리케이션 인스턴스가 Redis를 통해 동일한 세션 정보를 공유할 수 있다. 아래 실험에서는 동일한 Redis 서버를 사용하여 포트가 다른 두 개의 Spring 애플리케이션 서버를 실행하고, 두 인스턴스 간에 세션 데이터가 일관되게 공유되는지 확인해본다.
# 컴파일 빌드
./gradlew build
# CMD(1)
java -jar build/libs/session-0.0.1-SNAPSHOT.jar
# CMD(2)
java -Dserver.port=8090 -jar build/libs/session-0.0.1-SNAPSHOT.jar

포트를 8080,8090으로 2개의 웹 어플리케이션 서버를 구동하고 각각 접속해보았다.

다음과 같이 순차적으로 접속을 했을때 일관되게 VisitCount값이 증가하는 것을 확인할 수 있다. 따라서 분산된 환경에서도 세션 정보를 공유할 수 있는 안정적인 세션 저장소로 동작함을 확인하였다.

0개의 댓글