✏️ 배경
현재 진행 중인 프로젝트는 운영 중인 서버에서 세션을 별도 레디스를 설치해서 관리하고 있다.
업무 수행 중 Spring Redis Session에 접근해서 세션 별로 분류해서 어떤 작업을 할 필요가 생기게 되었다. 그래서 Spring Redis Session 데이터를 조회하는 방법을 찾게 되었고 해당 과정을 통해서 어떻게 접근하고 데이터를 가지고 오는지 알게 되어 해당 내용을 공유해 본다. 😀
🔎 Redis Session 설정
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
세션을 레디스로 관리하기 위해서는 spring-session-data-redis 의존성을 받아야 한다.
해당 의존성을 받으면 별도의 설정 없이도 기본 설정이 Redis가 세션을 받도록 설정된다.
세션을 톰캣으로 관리하고 싶다면 설정 파일에서 sprign.session.store-type을 none으로 변경하면 된다.
spring:
session:
store-type: none
🔎 Redis Session 특징
Redis로 세션을 사용하면 기존의 내장 톰캣 방식과는 몇 가지 차이점이 있다.
1) 쿠키 이름이 JESSIONID가 아닌 SESSION이라는 이름으로 생성된다.
스프링 시큐리티 설정 후 로그인해서 세션을 쿠키로 받은 뒤, 확인해 보면 기존 방식인 JESSIONID와 다르게 쿠키의 이름이 SESSION으로 되어 있는 것을 확인할 수 있다.
2) 애플리케이션에서는 Redis 세션 ID를 사용한다.
기존 세션 방식의 경우, 쿠키에 있는 값을 기반으로 Session Id를 사용했다면 Redis 세션은 브라우저에 내보낸 쿠키 값과 다른 세션 키로 관리하게 된다. 간단하게 필터를 이용해서 확인해 보자.
@Component
public class RedisSessionFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
System.out.println(request.getSession().getId());
}
}
콘솔에 HttpServletRequest 세션 ID를 확인해 보면 다음과 같이 다른 세션 ID를 사용하는 것을 알 수 있다.
실제로 Redis를 확인해보면 브라우저 쿠키의 값이 아닌 Redis의 세션 ID를 이용하는 것을 확인할 수 있다.
레디스에서는 별도 설정이 없으면 기본적으로 spring:session prefix를 기본으로 설정하고 있다.
스프링 레디스의 기본 세션 설정은 RedisSessionProperties 파일을 확인해 보면 알 수 있다.
🔎 Redis Session 조회
Redis 세션은 5개의 데이터 값을 가지고 있다.
- lastAccessedTime
- maxInactiveInterval
- creationTime
- sessionAttr:SPRING_SECURITY_LAST_EXCEPTION
- sessionAttr:SPRING_SECURITY_CONTEXT
해당 값들은 request.getSession() 메서드에 접근해서 가져올 수 있다.
request.getSession()에서 이전 Redis 세션에서 볼 수 있던 정보를 모두 담고 있는 것을 알 수 있다.
기본적으로 HttpSession에서 조회 메서드를 지원해 주기 때문에 기본 설정 값들은 getter 메서드로 접근이 가능하다.
그렇다면 세션과 연관된 Security 정보는 어떻게 얻을 수 있을까?
세션에서 getAttribute() 메서드 파라미터로 SPRING_SECURITY_CONTEXT를 넣으면 Security 정보를 얻을 수 있다.
SecurityContext securityContext = (SecurityContext) session.getAttribute("SPRING_SECURITY_CONTEXT");
Authentication authentication = securityContext.getAuthentication();
User user = (User) authentication.getPrincipal();
System.out.println(user.getUsername());
'Spring' 카테고리의 다른 글
ObjectMapper 사용할 때 Validator 활용하기 (0) | 2023.05.01 |
---|---|
[Spring] Redis 세션 로그아웃, 만료시 관련 처리 작업하기 (0) | 2023.04.16 |
[Spring] 데이터와 연관된 파일 데이터(multipart)를 목록으로 받기 (0) | 2023.04.02 |
Spring으로 네이버 비로그인 방식 오픈 API 사용해보기 (0) | 2023.03.26 |
[Spring] Filter에서 ExceptionHandler 예외 메시지 전달하기 (0) | 2023.03.26 |
댓글