Framework/Spring Boot

[Spring Boot] 정적 파일 로드 시 URL에 Jsessionid 붙는 경우 해결

꽁치_로그 2023. 11. 2. 16:00

프로젝트에서 배포된 QA 환경의 로그인 화면이 최초 로딩 시에 화면 깨짐 현상이 발생했다.

새로고침이나 재접속할 경우에는 정상적으로 로딩이 되는 이상한 현상이 지속됐다.

 

1. 원인 파악 😵

처음에는 css의 경로가 문제라 판단되어 절대경로로도 바꾸고 '/'을 붙여도 보며 시도해보았으나 현상은 동일했다.

한 시간동안 삽질한 끝에 원인을 파악했는데, 개발자 도구 (F12)로 HTML의 Element를 보니 URL 뒤에 jsessionid가 붙어있었다!!

<img src="/images/manu01.jpg;jsessionid=2E90711AE88783488E5BFEB476B1B9AF.smisSvr11">

 

이는 Tomcat 서버에서 Spring Framework에서 <c:url>태그를 사용할 경우 최초 호출시 URL에 Jsessionid가 붙여지는 현상 때문이였다. 이는 버그가 아닌 의도적으로 설계된 것이다. (Tymeleaf 템플릿 엔진을 사용중이였다) 

그럼 왜 이렇게 설계 되었는가?

서버 입장에서는 웹 브라우저의 쿠키 지원 유무를 모르기 때문에 쿠키값도 전달하고 URL에 Jsessionid도 함께 전달하는 것이다.

(웹 브라우저가 쿠키를 지원하지 않을 때 쿠키 대신 URL을 통해서 세션을 유지하기 위한 방법)

그러므로 초기에는 URL에 Jsessionid가 붙어 CSS 깨지는 현상이 발생했고, 두 번째 요청부터 세션 쿠키를 클라이언트에서 보내오기 때문에 URL에 Jsessionid를 붙이지 않아 CSS 깨짐 현상 없이 잘 보이는 것이었다!

 

3. 해결 방법 😄

URL 전달 방식을 끄고 항상 쿠키를 통해서만 세션을 유지하고 싶으면 application.properties에 설정을 해주면 된다.

1) Spring MVC

# web.xml

<session-config>

           <tracking-mode>COOKIE</tracking-mode>
</session-config>

2) Spring Boot

# application.properties

server.servlet.session.tracking-modes=cookie


# application.yml

server:
  servlet:
    session:
      tracking-modes: cookie    

 

참고. 

Tomcat에서 jsessionid가 URL에 붙는것 비활성화 하기 (tistory.com)

[Spring] 정적 파일 로드시 URL에 jsessionid가 붙는 경우 해결 :: 노력의 천재 (tistory.com)

https://kimjingyu.tistory.com/entry/Tracking-Modes

반응형