본문 바로가기
Spring

[Spring] Redis 세션 로그아웃, 만료시 관련 처리 작업하기

by 흑시바 2023. 4. 16.

✏️ 배경

프로젝트 진행 중 Redis 세션 로그아웃과 만료시 로그를 저장해야 하는 작업이 있었다. Redis 세션 로그아웃과 만료 관련 처리 작업을 하면서 알게 된 ApplicationListener과 Event를 활용해 처리하는 방법에 대해 공유하고자 한다.

 

📌 필수 등록

Session 관련 작업을 수행하기 위해서 pom.xml에 해당 Session Dependency를 추가해주어야 한다.

 

<dependency>
	<groupId>org.springframework.session</groupId>
	<artifactId>spring-session-data-redis</artifactId>
</dependency>

 

🔎 로그아웃

로그아웃할 때 무언가 처리해야 된다고 생각하면 일반적으로 Security의 LogoutHandler 또는 LogoutSuccessHandler를 구현하고 Security 설정 파일에 등록해서 사용할 것으로 생각한다.

 

충분히 좋은 방식이며 이미 구현되어 있다면 해당 방식으로 굳이 바꿀 필요는 없다.

* SessionDeletedEvent

@Component
public class SessionDeletedListener implements ApplicationListener<SessionDeletedEvent> {

    @Override
    public void onApplicationEvent(SessionDeletedEvent event) {
        // 관련 처리 작성
    }
}

 

해당 방식은 SessionDeletedEvent를 활용해서 이벤트 기반으로 처리하는 방법이다.

ApplicationListener에 SessionDeletedEvent를 등록하면 직접 로그아웃하는 경우에 관련 처리를 수행한다.

 

그렇다면 LogoutHandler, LogoutSuccessHandler, Event가 동시에 존재하는 경우 로그아웃시 어떤 순서로 수행될까? 🤔

 

 

해당 이벤트는 LogoutHandler 보다는 뒤, LogoutSuccessHandler 보다는 앞에서 처리한다.

 

🔎 타임아웃

* SessionExpiredEvent

@Component
public class SessionExpiredListener implements ApplicationListener<SessionExpiredEvent> {

    @Override
    public void onApplicationEvent(SessionExpiredEvent event) {
        // 관련 처리 작성
    }
}

 

해당 방식은 SessionExpiredEvent를 활용해서 이벤트 기반으로 처리하는 방법이다.
ApplicationListener에 SessionExpiredEvent를 등록하면 세션에 부여한 시간이 만료될 때 발생한다.

 

⛔️ 주의사항

SessionDeletedEvent, SessionExpiredEvent 모두 SessionDestroyedEvent을 상속받은 자식 객체이다.

 

 

따라서 SessionDestroyedEvent를 이벤트로 등록하는 경우 로그아웃(SessionDeletedEvent) 또는 타임아웃(SessionExpiredEvent) 이벤트 이후 추가적인 작업으로 수행될 수 있다.

 

다만, 이 부분은 서비스에서 활용하기 나름이라 로그아웃, 타임아웃 처리 이후 별도로 공통적인 무언가를 처리해야 한다면 이벤트로 등록해서 활용해 볼 수 있다.

댓글