본문 바로가기

Tech/spring-session-data-redis

Spring 라이브러리를 이용한 세션 관리



Spring 라이브러리를 이용한 세션 관리



웹 서비스에서 세션 관리를 위해 "spring-session-data-redis"를 사용해 보았다. 보통 부하분산을 위해 여러대의 WAS를 사용하게되는데 로그인과 같이 세션 정보를 사용할 경우 각 WAS에 저장되는 세션을 관리해줄 필요가 있다.


만약, 로드밸런서에서 클라이언트 요청을 RR (Round Robin) 방식으로 분배해줄 경우, 첫번째 요청은 로그인 정보를 가지고 첫번째 WAS에서 처리될 수 있지만 두번째 요청이 두번째 WAS로 갈 경우 해당 WAS에는 세션정보가 없으므로 로그인이 해제될 수 있다.


내가 생각한 세션 관리 조건은 아래와 같다.



세션 관리 조건

- non-sticky

> 클라이언트의 각 요청은 항상 RR (Round Robin) 방식으로 WAS로 분배된다. 이는 세션 서버를 생성하였을 때 장점을 극대화 하기 위함이다.

- 매 요청시 WAS는 세션 서버로부터 항상 최신의 세션 데이터를 조회해야 한다.

> 특정 WAS가 세션 정보를 들고있다고 하여도, 세션 서버내의 데이터와 동기화 문제가 발생할 수 있다.

- 매 요청시 세션 서버의 세션의 TTL (Time to Live) 은 갱신되어야 한다.

> TTL이 만료되면 해당 세션 데이터는 제거되어야 한다.



세션 서버로 사용할 수 있는 서비스로는 Redis, Memcache, DynamoDB, MongoDB 등이 있다. 최근 AWS에서 DynamoDB 서비스를 제공하면서 Tomcat <> DynamoDB 간 세션을 처리할 수 있는 라이브러리 또한 제공하고 있었다. 하지만 DynamoDB, MongoDB는 세션 데이터가 많아졌을 때 스와핑에 따른 속도 저하가 있지 않을까 하여 메모리 기반의 DB를 사용하려고 하였는데, 요즘 한창 대세인것 같은 Redis를 사용하게 되었다. 그리고 이 글에서 사용할 Spring 라이브러리 또한 Redis를 타겟으로 만들어졌기 때문에... :)


이제 직접 설정을 해보자. 웹 서비스를 위해 Spring MVC 프로젝트를 사용하고 있으며 JDK1.8.0_121, Tomcat8.5.14를 사용했다.



spring-session-data-redis

- 참조

http://docs.spring.io/spring-session/docs/current/reference/html5/#httpsession

> http://arahansa.github.io/docs_spring/session.html


- 개요

> Spring session은 HttpSession과의 통합을 제공한다.

> 특정 Container에 구애받지 않고 clustered session을 지원한다.

> 즉, Tomcat 버전, JDK 버전에 크게 구애받지 않는 것 같다.

> 구글 계정과 같이 하나의 브라우저에서 multiple user's serssion을 지원한다.

> Spring (Application) 레벨에서 세션을 관리한다. 즉, Tomcat 매니저에는 세션이 관리되지 않는다.



- pom.xml 설정


		org.springframework.session
		spring-session-data-redis
		1.3.1.RELEASE
		pom


		biz.paluch.redis
		lettuce
		3.5.0.Final


		org.springframework
		spring-web
		4.3.4.RELEASE



	org.springframework
	spring-core
	4.3.8.RELEASE

 



- context 파일 설정 (spring/session-context.xml)




	
	
	
	

	
	
	
	

 

Redis 연결을 위한 Lettuce 관련 빈과 Redis 세션 설정을 위한 빈이 선언되는데 attr을 통해 필요한 값들을 설정해줄 수 있다. 예를들면 Redis host, port, database, Redis에 저장되는 데이터의 만료기간 등.


- web.xml


	contextConfigLocation
	
		classpath:/spring/*-context.xml
	



	springSessionRepositoryFilter
	org.springframework.web.filter.DelegatingFilterProxy


	springSessionRepositoryFilter
	/*
	REQUEST
	ERROR

 

web.xml에서 추가한 session-context.xml을 읽도록 설정하고 관련 필터를 추가한다.



마무리

- 컨테이너 및 자바 버전에 구애받지 않음.

JDK7, JDK8, Tomcat7, Tomcat8에서 테스트 해본 결과 큰 문제 없음.

- 매 요청마다 세션 서버를 참조하여 최신 세션을 조회함

- 세션 데이터 저장시 만료시간을 설정할 수 있는데, 설정한 만료시간에 + 5분이 된다. 이는 세션이 만료될 때 데이터를 보장하기 위함?이라고 한다.