Exception loading sessions from persistent storage

LeeYulhee·2023년 7월 28일
0

👉 SpringBoot 실행 시, 정상 작동은 되는데 초반에 오류 로그가 종종 뜨면서 지나감


2023-07-26T14:53:41.427+09:00 ERROR 15140 --- [  restartedMain] o.a.catalina.session.StandardManager     : Exception loading sessions from persistent storage
java.io.StreamCorruptedException: invalid type code: 00

➡️위와 같은 오류로, 프로그램 자체는 문제 없이 실행됨



👉 해당 오류에 대해 조사


  • java.io.StreamCorruptedException: invalid type code: 00 오류는 Java에서 객체를 직렬화하거나 역직렬화할 때 발생하는 문제
    • 여기서 invalid type code: 00는 스트림이 손상되었거나 예상하지 못한 형태라는 것을 나타냄

  • 이 문제는 Tomcat이 웹 애플리케이션의 세션 상태를 저장하고 불러오는 과정에서 일어남
    • 웹 애플리케이션의 세션 데이터가 톰캣이 기대하는 형식과 다른 경우에 발생할 수 있음
    • Tomcat의 SESSIONS.ser 파일이 손상되었거나 예상하지 못한 데이터로 채워졌을 때 이 오류가 발생
      • 이 파일은 Tomcat이 애플리케이션 세션 상태를 저장하는데 사용


👉 Tomcat이란?


  • Tomcat은 웹 애플리케이션 서버(Web Application Server) 중 하나
    • 웹 애플리케이션 서버(WAS)는 Java 서버 페이지 기술을 실행하여 동적인 웹 페이지를 생성하고 관리하는 데 사용
    • 동적인 웹 페이지는 사용자의 요청에 따라 서버 측에서 동적으로 생성되거나 변경되는 웹 페이지로, 사용자와 상호작용하며 내용이 동적으로 바뀜

  • Tomcat은 Apache Software Foundation에서 개발하고 유지보수하는 오픈 소스 소프트웨어
    • 이는 Java 서버 페이지를 지원하기 위한 서블릿 컨테이너를 구현하고 있음
    • 서블릿 컨테이너는 웹 서버와 함께 동작하여 클라이언트로부터 요청이 오면 해당 요청을 처리하고 동적인 컨텐츠를 생성하는 역할을 담당

  • Spring에서는 Tomcat을 직접 적용해야 했지만, SpringBoot에서는 내장 Tomcat을 제공
    • SpringBoot 프로젝트 생성 시에 추가하는 의존성 중 implementation 'org.springframework.boot:spring-boot-starter-web 에 포함되어 있음



👉 오류 해결 방법


  • Tomcat의 파일 지우기
    • Tomcat 서버를 멈추고, work 디렉토리와 SESSIONS.ser 파일을 찾음
      • 일반적으로 이 파일은 ${CATALINA_BASE}/work/Catalina/localhost/ 경로에 위치
    • 이 디렉토리를 삭제하거나 SESSIONS.ser 파일을 삭제
    • Tomcat 서버를 재시작
      • ➡️Tomcat은 새 세션 저장소를 생성하고 SESSIONS.ser 파일도 새로 만들게 됨
      • ➡️이 방법은 세션 정보를 잃게 되므로, 애플리케이션이 이전 세션 상태에 의존하지 않는 경우에만 사용해야 함

  • Tomcat에서 세션 지속성 끄기
    • Tomcat의 context.xml 파일에서 <Manager> 태그를 찾아 pathname 속성을 ""로 설정
    <Manager pathname="" />
    • ➡️Tomcat의 세션 지속성을 끄면, 애플리케이션 재시작 또는 서버 재시작시에 세션 상태가 유지되지 않음

  • SpringBoot의 경우
    • 내장된 Tomcat의 context.xml 파일을 직접 수정하는 것은 어렵기 때문에 설정 파일에서 수정
      • 설정 파일
        • application.properties 파일에서 설정 추가
          server.servlet.session.persistent=false
        • application.yml 파일에서 설정 추가
          server:
            servlet:
              session:
                persistent: false


👉 세션 지속성이란?


  • 세션 지속성(persistent session)은 웹 서버가 다운되거나 재시작될 때 사용자 세션 정보를 유지하는 기능
    • 이를 통해 서버가 재시작된 후에도 사용자가 이전의 세션을 계속 사용할 수 있음
  • 세션 지속성을 '끈다'는 것은 이러한 세션 정보의 유지를 비활성화하는 것을 의미
    • 즉, 서버가 다운되거나 재시작되면 모든 사용자 세션 정보가 손실
    • 이 기능은 개발 과정에서 테스트나 디버깅을 쉽게 하기 위해 사용되곤 함
    • 그러나, 서비스의 안정성이나 사용자 경험을 위해서는 일반적으로 세션 지속성이 활성화되어 있는 것이 좋음
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글