text/Java

springboot 에 redis 세션 서버 사용

hoonzii 2024. 9. 1. 11:31
반응형

 

회사에서 지금 웹 서비스 중에 하나, 서버 이중화 한다고 세션 이중화 방안에 대해 알아보라고 하셔서...

팀 내 공유하려고 정리한 사항 블로그에도 살짝. 

 

문제 상황

  • 이중화 시 서버별 세션정보 불일치로 로그인 불가

해결 방안

  1. sticky session
    1. 웹 서비스 서버가 여러 대 있을 경우, 접속 시 세션이 생성된 서버로만 요청을 보내게끔 구성
    2. 단점) 여러대의 서버를 둬도 하나의 서버로만 몰릴 가능성 존재
  2. session clustering
    1. 여러 대의 서버의 세션 저장소를 하나로 관리
      1. 한 서버에 생성된 세션을 다른 서버 세션 저장소에도 복제
      2. 단점) 세션 생성 시마다 다른 서버에 복제, 메모리 필요, 성능저하 가능성 존재
    2. tomcat all-to-all session replication
      1. tomcat 내 delta manager, backup manager 존재
      2. delta manager -> 클러스터에 속한 다른 was에 세션을 전부 복제
      3. backup manager -> 클러스터 내 자신의 backup was 에게만 세션을 복제
  3. session server
    1. 세션 정보만 관리하는 별도의 서버 구성 (ex. redis, memcached)
    2. 단점) 해당 서버가 죽을 경우, 세션 정보 전부 사라짐

 

적용 방안 결론! ⇒ redis session server 방법 사용 (spring boot 관련 설정 편의)

 

적용 방법

- redis 설치 (default port : 6379)

    - ref)

             window 레디스 설치 https://ittrue.tistory.com/318

             linux 레디스 설치 https://log4day.tistory.com/6

 

프로젝트 설정 (spring boot 2.7.x / java 1.8 기준)

 

1. pom.xml 설정

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
cs
 
2. application.properties 설정
1
2
3
4
5
6
# redis 
spring.session.store-type=redis
spring.redis.host=localhost
spring.redis.password=
spring.redis.port=6379 
spring.session.redis.namespace=spring:jsession 
#redis 키로 들어갈 네임스페이스 설정 default는 spring:session
cs
 
3. xxxApplication.java 설정
1
2
3
4
5
6
7
8
9
10
//어노테이션 추가 
@SpringBootApplication
@EnableRedisHttpSession(redisNamespace = "${spring.session.redis.namespace}")
public class RedisClusteringDemoApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(RedisClusteringDemoApplication.class, args);
    }
 
}
cs
 

4.spring Security 설정

    - 로그인, 로그아웃시 spring에서 알아서 session 등록/제거 진행 

 

 

한다고 예고 받아서 간략정리했고, 나중에 실제로 하게 되면 뭐 또~ 그때 가서 추가적으로 진행하는 걸로~

 

참고 url

반응형