프로젝트를 진행하면서 비로그인자가 로그인 페이지 이외에 접속할 수 없게


인터셉터를 생성하고 preHandle 메서드에서 로그인 페이지 이외에는 세션을 검증하도록 설계했었다.

 

문제는 특정 브라우저에서 첫번쨰 로그인을 무조건 실패하는 경우가 생겼다.

 

크롬에서는 부분적으로 일어나서 개발 기간에는 비밀번호를 잘못 쳤나 보다 하고 넘기는 경우가 있었다.

 

임시 오픈 상태가 들어서면서 다양한 브라우저와 다른 환경에서 접속하다보니 문제가 발생했다.

몇 가지 확인을 해보니 최초로 로그인이 실패되는 상황에 URL이 이상한 파라미터가 붙어서 온다는 것을 확인했다.

 

JSESSIONID라는 파라미터가 담겨 온 것이다. 구글링을 해보니까 해당 내용의 블로그를 찾을 수 있었다.

offbyone.tistory.com/339

 

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

Tomcat서버에서 스프링 프레임웍의 태그를 사용할 경우 최초 호출시 URL에 jsessionid 가 붙여지게 됩니다. 이것은 버그가 아니고 의도적으로 설계된 것입니다. 새 세션이 만들어지면 클라이언트가

offbyone.tistory.com

블로그에서 얘기하길 Tomcat서버에서 스프링 <c:url> 태그를 사용 할 경우 최초 호출 시 URL에

JSESSIONID가 붙여지게 된다는 것이며. 이것은 버그가 아니고 의도적으로 설계된 것이라고 한다.

새로운 세션이 만들어지면 접속자(클라이언트)가 쿠키를 지원하는지 여부를 서버가 알수 없기 때문에

쿠키와 URL 모두 JSESSIONID를 담는다고한다. 그 이후 두 번째 요청부터 세션 쿠키를 보내오면 URL을 붙이지 않고

쿠키가 없다면 JSESSIONID를 계속 붙이게 된다.

 

이것을 해결하기위해 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>