Java/Spring Boot
HttpSessionListener를 이용한 중복 로그인 방지
요술공주밍키
2024. 4. 30. 14:41
프로젝트를 간단하게 진행하다 보니 중복 로그인에 관한 내용을 신경 쓰지 않고 있었다.
Spring Security를 이용하면 수월하다고 하던데
프로젝트에 Spring Security를 적용하지 않아서 급한대로
HttpSessionListener를 이용하여 중복 로그인을 방지해 보았다.
✅ SessionConfig
@Slf4j
@WebListener
public class SessionConfig implements HttpSessionListener {
private static final Map<String, HttpSession> sessions = new ConcurrentHashMap<>();
//중복로그인 지우기
public static boolean loginSessionidCheck(HttpSession session, String userId){
HttpSession currentSession = sessions.putIfAbsent(userId, session);
if (currentSession != null) {
// 이미 로그인된 세션이 있다면 그 세션을 무효화
if (!currentSession.getId().equals(session.getId())) {
currentSession.invalidate();
sessions.put(userId, session); // 새 세션을 저장
return true;
} else {
// 동일 세션 로그인 시도 (정상 로그인)
return false;
}
}
return true;
}
@Override
public void sessionCreated(HttpSessionEvent se) {
log.info("Session Event: {}", se);
sessions.put(se.getSession().getId(), se.getSession());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
if(sessions.get(se.getSession().getId()) != null){
sessions.get(se.getSession().getId()).invalidate();
sessions.remove(se.getSession().getId());
}
}
}
이렇게만 해두어도 정상적으로 작동하기는 하는데 기존에 로그인되어있던 PC에서는 아무런 알림도 없이
session이 없어져버려서 알림을 넣는 방법도 생각해 봐야겠다.