세션은 서버에 저장되며, 해당 세션을 구분하기 위해 SESSIONID(JSp/Servlet에서는 JSESSIONID)는 쿠키를 통해 클라이언트인 브라우저에 저장된다. 그러나 사용자의 환경에 따라 쿠키가 차단되어 쿠키를 사용하지 못하는 경우가 있다.
따라서 브라우저의 요청 메시지에 SESSIONID 쿠키가 없으므로 요청시마다 매번 세션을 생성해야 한다.
이에 대한 해결책으로 URL rewrite(URL 재작성)
를 통해 세션 ID 값을 넘겨주는 방법이 있다. URL 재작성이란 요청하려는 HTTP URL 뒤에 ;(세미콜론)을 넣고 세션 ID 값을 넘겨주는 것을 말한다.
그러나 단점으로는 URL 상에 중요한 정보인 세션 ID가 노출된다는 것이다.
URL Rewrite하는 첫 번째 방법은 JSP나 서블릿에서 세션 ID를 구해 클라이언트 쪽으로 넘겨주어 스크립트나 JSP 자체적으로 URL에 SESSIONID를 넣는 방법이다.
아래의 소스코드를 보면 FORM 태그의 action의 주소 끝에 ;(세미콜론)을 붙이고 세션의 getId() 메서드를 통해 세션 ID를 넘겨주고 있다.
<%@ page contentType="text/html; charset=utf-8" session="true"%>
<html>
<head>
</head>
<body>
<h1>로그인 페이지</h1>
<%
session.setAttribute("isLogin", true);
%>
<form action="http://localhost/rewrite.jsp;JSESSIONID=<%= session.getId() %>" >
<input type="submit">
</form>
</body>
</html>
login.jsp 페이지를 호출해보면 기존의 jsp 페이지와 똑같이 출력되지만 DOM 요소검사를 통해 FORM의 action URL을 확인해보면 주소 끝에 ;(세미콜론) JESSONID=""가 포함되어 있음을 확인할 수 있다.
두번재 방법은 HttpServletResponse를 이용한 방법이다. HttpServletResponse 객체는 기본적으로 URL Rewrite 기능을 제공하고 있다. 위의 login.jsp의 FORM 태그 부분을 다음과 같이 수정할 수 있다.
<form action="<%=response.encodeURL("rewrite.jsp" %>">
<input type="submit">
</form>
encodeURL(String path) 메서드는 path값으로 경로를 지정해주어 URL Rewrite 경로로 변경해준다. 그러나 클라이언트로부터 전송된 HTTP Request 메시지의 헤더를 보고 쿠키가 있으면 경로를 그대로 반환하고 HTTP Request 메시지의 헤더에 쿠키가 없으면 URL Rewrite된 경로를 반환한다.
또한 현재 웹 어플리케이션의 URL이 아니라 다른 경로를 매개변수로 주었을 경우에도 매개변수로 넘겨준 경로를 그대로 반환한다.
만약 리다이렉션이 필요한 경우에 쿠키가 차단된 상태라면 다음과 같이 encodeRedirectURL() 메서드를 활용하여 URL Write된 경로로 리다이렉트하면 된다.
<%
String url = response.encodeRedirectURL("rewrite.jsp");
response.sendRirect(url);
%>
참고