프로젝트에서 배포된 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)
'Framework > Spring Boot' 카테고리의 다른 글
[Spring Boot] Spring AOP를 활용한 Logging (0) | 2024.04.21 |
---|---|
[Spring Boot] 자주 쓰이는 Spring Boot Annotation (Controller, Service, Model) (0) | 2024.04.21 |
[Spring Boot] @ExceptionHandler, @ControllerAdvice (Exception 공통 처리) (0) | 2024.03.09 |
[Spring Boot] Filter, Interceptor, AOP 차이 및 정리 (0) | 2024.03.08 |