쿠키가 차단되는 환경일때 SESSIONID URL로 넘기기 (URL ReWrite)
잘 아시겠지만 세션은 서버(웹컨테이너)에 저장되며, 해당 세션을 구분하기 위한 SESSIONID(Jsp/Servlet에서는 기본적으로 JSESSIONID라고함) 는 쿠키를 통해 클라이언트인 브라우저에 저장됩니다. 그런데 사용자의 환경에 따라 쿠키가 차단되어 쿠키를 사용하지 못하는 경우가 있습니다.
서블릿컨테이너는 HTTP 요청 메시지의 JSESSIONID 쿠키값을 가지고 세션을 구분하는데 쿠키가 차단된 환경의 브라우저는 세션ID 쿠키값을 저장하지 않으므로 요청 메시지에는 JESSIONID 쿠키값이 존재하지 않으므로 요청시마다 매번 세션을 생성하게 됩니다. 그러므로 사용자의 로그인 정보등을 저장할 수 없게됩니다.
해결책으로는 URL rewrite(URL 재작성)을 통해 세션ID 값을 넘겨주는 방법이 있습니다. URL 재작성이란 요청하려는 HTTP URL 뒤에 ;(세미콜론)을 붙이고 세션ID값을 넘겨주는것을 말합니다. 그러나 단점으로는 URL상에 중요한 정보인 세션ID가 노출된다는 점이 있습니다.
세션ID를 URL로 넘기는 URL Rewrite 첫번째 방법
먼저 첫번째 방법으로는 JSP나 서블릿에서 세션ID를 구해 클라이언트측으로 넘겨주어 스크립트나 JSP 자체적으로 URL에 SESSIONID를 넣는 방법입니다.
아래 login.jsp 페이지 소스르 보면 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> |
cs |
login.jsp 페이지를 호출해보면 별 차이점이 없지만 리턴된 HTML을 요소검사 하면 다른점이 있습니다.
위 화면의 DOM 요소검사를 해보면 action의 URL이 다음과 같음을 알 수 있습니다.
이번에는 요청을 넘겨받은 rewrite.jsp 페이지입니다. 쿠키가 차단된 환경에서 URL rewrite를 통해 세션이 유지되어 지는지 확인하기 위한 페이지입니다.
<%@ page contentType="text/html; charset=utf-8" session="true"%>
<html>
<head>
</head>
<body>
<h1>URL 재작성 페이지</h1>
<%
session.setAttribute("isLogin", true);
%>
<h3><%= session.getAttribute("isLogin") %></h3>
<h3><%= session.getId() %></h3>
</body>
</html> |
cs |
주소창을 보면 URL에 세션ID가 넘겨진 것을 볼 수 있고 rewrite 페이지에서는 login.jsp페이지에서 생성되었던 세션이 그대로 유지됨을 알 수 있습니다.
URL Rewrite 두번째 방법
두번째 방법은 조금은 더 간단한 방법입니다. HttpServletResponse 를 이용한 방법인데, HttpServletResponse 객체는 기본적으로 URL Rewrite 기능을 제공하고 있습니다. 위에서 보았던 login.jsp 페이지의 FORM 태그 부분을 다음과 같이 수정할 수 있습니다.
<form action="<%= response.encodeURL("rewrite.jsp") %>" >
<input type="submit">
</form> |
cs |
encodeURL(String path) 메서드는 path 값으로 경로를 지정해 주어 URL Rewrite 경로로 변경해줍니다. 단 조건이 있습니다. 클라이언트로부터 날아온 HTTP request 메시지의 헤더를 보고 쿠키가 있으면 쿠키가 허용되는 환경인것으로 보고 경로를 그대로 반환합니다. 요청 메시지에 쿠키가 하나도 없다면 쿠키가 허용되지 않은 환경으로 보고 URL Rewrite 경로를 반환합니다.
또한 쿠키여부가 아닌 현재 웹어플리케이션의 URL이 아닌 다른 경로를 매개변수로 주었을 경우에도 매개변수로 넘겨준 경로를 그대로 반환합니다. 경로는 상대경로 또는 절대경로로 지정할 수 있습니다.
리다이렉트시에 URL Rewrite 사용하기
만약 리다이렉션이 필요한 경우에 사용자가 쿠키를 사용불가능한 상태라면 다음과 같이 encodeRedirectURL() 메서드를 사용하여 URL 재작성하여 반환된 URL로 리다이렉트 하면 됩니다.
<%
String url = response.encodeRedirectURL("rewrite.jsp");
response.sendRedirect(url);
%> |
cs |
'Servlet&Jsp' 카테고리의 다른 글
[서블릿/JSP] HttpServletResponse의 sendRedirect() 사용시 문제점 (0) | 2018.12.26 |
---|---|
[서블릿/JSP] 요청 파라미터 한글 인코딩 처리 필터(Filter) 구현하기 (1) | 2018.12.25 |
[서블릿/JSP] 세션(session)의 마지막 접근시간 및 유효시간에 대해 (0) | 2018.12.18 |
[서블릿/JSP] 세션(session)을 명시적으로 종료시키는 방법 (0) | 2018.12.18 |
[서블릿/JSP] Client IP를 알기 위해 request.getRemoteAddr() 사용시 127.0.0.1만 리턴되는 문제 (with Proxy Server) (0) | 2018.11.08 |