세션 기반 인증 수행시 세션에 관한 정보는 서버 메모리에 저장된다.
때문에 다중 서버 환경에서는 서버 간 세션을 공유 또는 동기화를 수행해주어야 한다.
세션 동기화를 위한 대표적인 방법 중 하나인 Redis를 이용한 세션 클러스터링을 구현해보도록 한다.
본 게시물은 구글링을 통한 몇몇 블로그와 아래 문서를 참조하였습니다.
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 |