본문 바로가기
Spring

[Session] Redis 세션 클러스터링

by hseong 2023. 4. 15.

세션 기반 인증 수행시 세션에 관한 정보는 서버 메모리에 저장된다.

때문에 다중 서버 환경에서는 서버 간 세션을 공유 또는 동기화를 수행해주어야 한다.

세션 동기화를 위한 대표적인 방법 중 하나인 Redis를 이용한 세션 클러스터링을 구현해보도록 한다.

 

본 게시물은 구글링을 통한 몇몇 블로그와 아래 문서를 참조하였습니다.

 

Spring Session - Spring Boot :: Spring Session

After adding the required dependencies, we can create our Spring Boot configuration. Thanks to first-class auto configuration support, setting up Spring Session backed by Redis is as simple as adding a single configuration property to your application.prop

docs.spring.io

 

1. Redis 설치

$ docker container run -d -p 3679:3679 --name redis redis

Docker를 이용하여 Redis를 실행한다.

2. 의존성 추가

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

3. application.yml 설정 추가

spring:
  session:
    store-type: redis
  data:
    redis:
      host: localhost
      port: 6379

 

Spring Boot를 이용하는 경우 위 설정을 추가해주는 것만으로도 Redis를 이용한 세션 설정이 완료된다.

Spring 공식 문서에 따르면 @EnableRedisHttpSession 어노테이션을 수동으로 추가하는 것과 동일한 구성을 적용한다고 한다.

springSessionRepositoryFilter라는 이름의 Spring 빈이 생성되며, 해당 필터가 HttpSession의 구현을 담당하게 된다.

4. 테스트 컨트롤러 구현

@RestController
public class LoginController {
    
    private final List<Member> members = new ArrayList<>();
    
    @Data
    static class Member {
        private Long id;

        public Member(Long id) {
            this.id = id;
        }
    }
    
    @GetMapping("/members")
    public Long addMember() {
        Member member = new Member((long) members.size());
        members.add(member);
        
        return member.getId();
    }

    @GetMapping("/login")
    public String login(HttpServletRequest request, @RequestParam Integer memberId) {
        HttpSession session = request.getSession();

        Member member = members.get(memberId);
        session.setAttribute("LoginMember", member.getId());

        return "login";
    }

    @GetMapping("/is-login")
    public Long isLogin(@SessionAttribute(name = "LoginMember") Long loginMemberId) {
        return loginMemberId;
    }

    @GetMapping("/logout")
    public String logout(HttpServletRequest request,
                         @SessionAttribute(name = "LoginMember") Long loginMemberId) {
        HttpSession session = request.getSession(false);
        session.invalidate();

        return "logout";
    }
}

회원 생성, 로그인, 로그아웃을 위한 간단한 컨트롤러이다. 편의상 HTTP method는 모두 GET으로 하였다.

5. 검증

 

docker exec -it redis bash
redis-cli
keys *

redis cli에 접속한 후, keys * 명령어를 통해  세션이 정상적으로 저장되었음을 확인할 수 있다.

 

'Spring' 카테고리의 다른 글

스프링과 웹소켓  (0) 2023.05.01
@Scheduled 어노테이션을 이용한 스케줄링  (0) 2023.04.30
[Spring REST Docs] 활용하기  (0) 2023.04.10
[Spring REST Docs][오류] urlTemplate not found.  (0) 2023.03.26
[Spring REST Docs] 맛보기  (0) 2023.03.23