안녕하세요.
다중서버 환경에서 세션이 was 안에서 관리가 되면 세션 간의 공유가 되지 않아
특정 서버가 다운 되었을때 해당 서버의 사용자들은 다른 서버로 접속경로가 바뀌어도
로그인을 다시 해야하는 불편함이 있습니다.
이를 위해 스프링 프로젝트에서 세션정보를 redis에 보내고 세션을 redis서버에서 관리하도록 해보겠습니다.
로컬에서 실서버까지 작업을 할 것이며 정확한 테스트를 위해 실제 로그인 인증권한 관리가 되고 있는 프로젝트에서도
진행을 할 것입니다.
내용이 길어 총 세편에 걸쳐 설명을 할 것이며
1편은 간단한 스프링부트 프로젝트를 통해 redis 서버에 세션정보를 보내는 것을 구현하고,
2편은 스프링시큐리티로 로그인 인증권한 관리가 되고 있는 스프링 프레임워크 프로젝트에서
redis서버에 세션 정보를 보내고 redis서버에서 세션이 관리되도록 구현하고,
3편에서는 실서버를 구축하여 실제 다중서버에서 세션 공유가 제대로 이루어도록 구현해볼 것입니다.
1,2편은 로컬 테스트 환경이며 3편은 aws ec2 실서버 환경입니다.
참고로 레디스와 세션 클러스터링에 대한 개념은 아래의 포스팅을 참조해주시기 바랍니다.
https://developer111.tistory.com/69
로컬환경
- 윈도우 OS
- 스프링부트 2.5.5
- 자바 8
- 레디스 3.2.100
스프링부트 프로젝트 소스는 아래 링크에서 받으실 수 있습니다.
https://github.com/yojic-jung/springBootRedisTest
레디스 설치 및 실행
https://github.com/microsoftarchive/redis/releases
위 링크에 접속하여 3.2.100버전 Redis-x64-3.2.100.zip파일은 다운받고 압축을 풀어주세요.
압축을 풀면 위와 같은 파일들이 생성될 것입니다.
먼저 비밀번호를 설정해보도록 하겠습니다.
redis.window-service.conf 파일을 메모장으로 열고
#requirepass foobared
위 라인을 주석해제하고
원하는 비밀번호를 설정합니다. 여기 실습에서는
requirepass abcd1234
라고 설정했습니다.
redis.window.conf 파일에도 똑같이 적용해주세요.
이제 cmd에서 redis를 사용하기위해 윈도우 redis 서비스 등록을 하겠습니다.
cmd 창을 열어 redis폴더로 이동해주세요.
redis-server --service-install redis.windows.conf --loglevel notice
위 명령어를 실행하여 윈도우에 redis를 서비스로 등록합니다.
레디스 서버 스타트 명령어와 스탑 명령어는 아래와 같습니다.
redis-server --service-start
redis-server --service-stop
redis-server --service-start 명령어를 실행하여 레디스 서버를 start 하겠습니다.
그런 다음 이제 cmd가 아닌 redis 폴더로 와서 redis-cli.exe 파일을 실행해주세요.
이전에 설정한 비밀번호 abcd1234 로 접속하여 정상적으로 실행됬는지 확인하기 위해 ping 명령어를 날려봅니다.
pong이라고 라인이 찍히면 정상적으로 실행된 것입니다.
스프링부트 설정
build.gradle 파일의 dependencies 설정
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.session:spring-session-data-redis'
application.properties
spring.session.store-type=redis
server.servlet.session.timeout=3600
spring.session.redis.namespace=spring:session
spring.redis.host=localhost
spring.redis.password=abcd1234
spring.redis.port=6379
첫번째 라인의 spring.session.store-type=redis 설정으로 스프링부트의 세션을 redis서버에 저장할 수 있습니다.
위 설정은 @EnableRedisHttpSession과 같은 효과로 아래처럼 설정할 수 도 있습니다.
@SpringBootApplication
@EnableRedisHttpSession
public class SpringBootRedisTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootRedisTestApplication.class, args);
}
}
그 다음 server.servlet.session.timeout=3600 설정은 초단위로 세션의 만료시간을 결정합니다.
spring.session.redis.namespace=spring:session는 레디스 저장공간 namespace의 이름을 spring:session으로 설정한 것입니다.
그다음 아래 설정은 redis경로와 redis에 접근하기 위한 비밀번호를 설정한 것입니다.
spring.redis.host=localhost
spring.redis.password=abcd1234
spring.redis.port=6379
TestController.java
@RestController
public class TestController {
@RequestMapping("test")
public String test1(HttpSession session) {
session.setAttribute("email","test");
return "test";
}
}
이제 테스트를 위해 임의로 세션을 생성해보겠습니다.
위와같이 자바파일을 만들고
스프링부트 프로젝트를 실행시켜 해당 /test url로 접속해보세요.
레디스 세션정보 확인하기
이전에 실행시킨 redis-cli.exe 파일에서 keys * 명령어를 날리면 아래와 같이 세션정보가 생성됨을 확인 할 수 있습니다.
type 명령어를 통해 각 라인의 저장정보가 어떤 타입으로 저장됬는지 확인합니다.
각각 string, set, hash 타입으로 저장됨을 확인할 수 있습니다.
라인별로 하나씩 값을 조회해보겠습니다.
String타입은 비어있고 set 타입은 조회가 불가능하여 조회하지 않았습니다.
hash타입을 조회해보니 4가지 속성이 조회되었습니다.
세션의 키값, 만료시간, 생성시각, 최근 접근시간에 대한 속성이 나와 있습니다.
우리가 설정한 세션의 키값 email이 들어있음 확인할 수 있습니다.
이 속성값을 가져와보면
위와 같이 email에 대한 value 값 test까지 redis 서버에 잘 저장됬음이 확인 되었습니다.
이렇게해서 스프링부트에서 생성된 세션정보를 redis서버에 저장 시켜보았습니다.
지금까지 한 과정은 단순 세션정보를 레디스에 저장시킨 것 뿐이며 실제 세션 클러스터링이 이루어진 작업은 아닙니다.
로그인 인증권한이 있는 프로젝트에서 세션 공유와 관리가 어떻게 이루어지는지,
로컬서버가 아닌 실서버에도 적용을 하고 싶으시다면 아래 포스팅을 참조해주시기 바랍니다.
https://developer111.tistory.com/73
출처
https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot-redis.html
https://docs.spring.io/spring-session/docs/current/reference/html5/
'AWS' 카테고리의 다른 글
스프링프레임워크&부트 aws redis 연동(로컬에서 실서버까지)[3] (0) | 2021.10.17 |
---|---|
스프링프레임워크&부트 redis 연동(로컬에서 실서버까지)[2] (0) | 2021.10.17 |
다중서버에서 세션 관리(Redis 세션 클러스터링, Sticky Session) (0) | 2021.07.24 |
스프링부트 aws ec2 리눅스 서버에 배포하기 (0) | 2021.05.23 |
아마존 RDS의 개념과 RDS와 EC2 연동하기 (4) | 2021.04.03 |