Tomcat서버에서 스프링 프레임웍의 <c:url> 태그를 사용할 경우 최초 호출시 URL에 jsessionid 가 붙여지게 됩니다. 이것은 버그가 아니고 의도적으로 설계된 것입니다.
새 세션이 만들어지면 클라이언트가 쿠키를 지원하는지 여부를 서버가 알 수 없으므로 쿠키와 URL에 모두 jsessionid 가 만들어 집니다. 클라이언트가 두 번째 요청부터 세션 쿠키를 보내오면 URL에 jsessionid를 붙이지 않고, 쿠키가 없으면 계속 URL에 jsessionid 를 붙이게 됩니다.
- 최초로 호출되는 index.jsp 파일
<script type="text/javaScript">
document.location.href = "<c:url value='/cmm/main/mainPage.do'/>";
</script>
- 호출된 URL
http://localhost:8080/sht_webapp/cmm/main/mainPage.do;jsessionid=1B7613A3D23C36061FD53EB9C81CBE2A
여기에는 문제점이 있는데 <c:url> 태그를 잘못 사용하게 되면 필요한 자원이 제대로 다운로드 되지 않는경우가 발생합니다.
컨텍스트 패스를 붙이기 위해서 사용된 <c:url> 태그 입니다.
<img src="<c:url value='/'/>/images/logo.png" />
실제로 생성된 URL 입니다.
<img src="/sht_webapp;jesssionid=1B7613A3D23C36061FD53EB9C81CBE2A/images/logo.png" />
코드상에서의 해결책은 다음과 같이 바꿔서 쓰는 방법이 있겠습니다.
<img src="${pageContext.request.contextPath}/images/logo.png" />
다른 방법은 Tomcat 서버의 설정을 변경하여 jsessionid 의 URL rewriting을 아예 비활성화 하는 방법이 있습니다.
Tomcat 6.0.30 이상에서 사용할 수 있는 방법으로 server.xml 파일의 <Context> 설정에 disableURLRewriting 속성에 true를 사용하는 방법입니다.
<Context docBase="simple_home" path="/sht_webapp" disableURLRewriting="true" reloadable="true" />
Tomcat 7 과 Tomcat 8에서 Servlet 3.0 스펙 이상을 사용한다면 각 웹애플리케이션의 web.xml 파일의 <session-config> 태그에서 비활성화 할 수 있습니다. <tracking-mode>COOKIE</tracking-mode> 를 사용합니다.
<session-config>
<session-timeout>600</session-timeout>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
Tomcat 서버에서 jsessionid 의 URL Rewriting을 비활성화 하는 방법을 알아보았습니다.
댓글을 달아 주세요
어차피 2번째 요청부터 url에 노출되지 않으면 꼭 비활성화하지 않아도 상관 없는건가요?
어차피 로그인시 바로 쿠키를 만드는 페이지라서 성능적인 면이라던지 차이가 없다면 굳이 비활성화 하지 않아도 괜찮지 않을까 생각중인데 어떻게 생각하시는지 알고싶습니다.
네, 비활성화 하지 않아도 문제가 없다면 그대로 사용해도 되고 context path를 사용하는 방법을 사용해도 됩니다.
하지만, 최초 요청은 무조건 쿠키가 없습니다. 첫 페이지에서 문제가 발생할 소지가 많죠. 또한, 테스트 환경에서는 문제가 없다가 프로덕션 환경에서는 문제가 발생할 수도 있습니다.
세션 아이디가 인코딩 됨으로해서 문제가 발생할 수 있다는 것을 알고, 필요에 따라 대응할 수 있으면 되는것이겠죠.^^
비활성화를 기본 스킴으로 가져가면 위 상황을 무시할 수 있으니까 프로덕션 환경에서 돌발상황을 줄일 수 있겠습니다.
여러 사이트들을 다양한 WAS로 포팅하다보면 WAS별 OS별 기본 설정을 만들어 두고 적용하실 수 있을 겁니다.
회사에는 아마도 이런것들이 되어 있을 가능성이 높을 겁니다.
도움이 되셨으면 좋겠네요.^^