← 이슈 기록 목록

세션이 사라지지 않고 계속 쌓이던 이유

JavaSpringSession

01이슈 및 현상

같은 계정으로 다른 브라우저에서 로그인하면 기존 사용자가 아무 안내 없이 로그인 화면으로 튕겨나갔고, 활성 세션을 관리하는 맵은 계속 커졌습니다.

02원인 파악

sessionDestroyed()가 세션 속성 "user_id"를 읽었지만 실제 저장 키는 "session_user"(SessionUser 객체)였습니다. userId가 항상 null이라 활성 세션 맵에서 세션이 제거되지 않고 무한 누적됐고, null 체크 덕분에 예외조차 나지 않았습니다.

03해결 방안

속성 키를 실제 저장 키에 맞춰 SessionUser에서 user_id를 꺼내도록 정정하고, '조회→비교→삭제' 복합 연산을 synchronized로 묶어 원자성을 확보했습니다. 중복 로그인으로 끊긴 세션 ID·시각을 별도 맵에 기록해 인터셉터에서 조회, 사용자에게 사유 안내 팝업을 띄우도록 했습니다. 같은 커밋에서 DBCP 커넥션 풀 설정도 정비했습니다.

04결과 및 성과

세션이 종료 시 맵에서 제대로 제거되어 누수가 멈췄고, 사용자는 왜 로그아웃됐는지 안내받게 됐습니다. '자원이 회수되지 않는' 세션 누적과 커넥션 누수를 한 번에 정리했습니다.