Tomcat에서 jsessionid가 URL에 붙는것 비활성화 하기

프로그래밍/운영체제, 서버 2018. 9. 19. 23:52
반응형

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을 비활성화 하는 방법을 알아보았습니다.

반응형

댓글을 달아 주세요

  • 못된사람 2020.03.23 11:38  댓글주소  수정/삭제  댓글쓰기

    어차피 2번째 요청부터 url에 노출되지 않으면 꼭 비활성화하지 않아도 상관 없는건가요?
    어차피 로그인시 바로 쿠키를 만드는 페이지라서 성능적인 면이라던지 차이가 없다면 굳이 비활성화 하지 않아도 괜찮지 않을까 생각중인데 어떻게 생각하시는지 알고싶습니다.

    • pentode 2020.03.23 21:43 신고  댓글주소  수정/삭제

      네, 비활성화 하지 않아도 문제가 없다면 그대로 사용해도 되고 context path를 사용하는 방법을 사용해도 됩니다.

      하지만, 최초 요청은 무조건 쿠키가 없습니다. 첫 페이지에서 문제가 발생할 소지가 많죠. 또한, 테스트 환경에서는 문제가 없다가 프로덕션 환경에서는 문제가 발생할 수도 있습니다.

      세션 아이디가 인코딩 됨으로해서 문제가 발생할 수 있다는 것을 알고, 필요에 따라 대응할 수 있으면 되는것이겠죠.^^

      비활성화를 기본 스킴으로 가져가면 위 상황을 무시할 수 있으니까 프로덕션 환경에서 돌발상황을 줄일 수 있겠습니다.

      여러 사이트들을 다양한 WAS로 포팅하다보면 WAS별 OS별 기본 설정을 만들어 두고 적용하실 수 있을 겁니다.

      회사에는 아마도 이런것들이 되어 있을 가능성이 높을 겁니다.

      도움이 되셨으면 좋겠네요.^^