본문 바로가기

네트워크보안/asp

URL에 자동으로 세션(Session) ID 달고 다니기

세션 ID는 쿠키에 임시로 저장되거나, URL 뒤에 ID를 붙여서 다닌다고 세션의 처음 부분에서 말씀드렸습니다. 보통 우리가 사용하는 방식은 첫번째 방식으로 세션 ID를 쿠키에 임시저장해서 세션 ID를 서버에 전송합니다. 하지만, 사용자가 쿠키를 사용하지 않는다고 브라우저를 설정할 때는 그 성격이 달라집니다. Internet Explorer에서의 쿠키설정의 예를 보면 다음과 같습니다.

그림 6-9 Internet Explorer의 쿠키 설정

보통의 경우는 위와같이 세션 단위의 쿠키와 컴퓨터 저장 쿠키를 허용하고 브라우저를 사용합니다. 그러나 보안등의 이유로 컴퓨터 저장 쿠키를 허용하지 않는 사용자가 있습니다. 여기까지는 쿠키를 이용한 세션체크에는 문제가 되지 않지만, 속된 말로 미친척하고 첫번째의 세션단위 임시 쿠키허용까지 사용안한다고 체크한다면, 비로소 여러분이 구현한 사이트의 세션체크 부분에서 문제가 나타나기 시작할 것입니다.

쿠키를 사용하지 않으면 URL에 자동으로 세션 ID를 붙여서 다닌다고 했는데 무슨 문제가 일어날까요? 이미 당해보신 분들은 알겠지만, 쿠키를 사용하지 않을때 세션이 제대로 먹지 않는 페이지가 종종 있을 것입니다. 그런 일은 URL을 자동으로 재작성할 때 세션 ID가 URL을 통해서 제대로 넘어가지 않기 때문에 나타나는데 그것은 두가지 경우에서 볼 수 있습니다.

URL재작성에서 세션이 적용되지 않는 경우

n 서블릿에 의해 생성된 웹페이지에 내장된 URL

n sendRedirect 메서드로 호출되는 URL

JSP에서의 페이지 이동은 대부분 위와 같은 경우이니, URL 재작성을 사용하려면 URL에 주소를 직접 출력하지 말고 javax.servlet.http에 있는 HttpServletRequest 인터페이스의 encodeURL 메서드를 사용하여 생성된 URL을 클라이언트로 전송하면 됩니다.

그럼 정말 위와 같은 페이지 이동에서 세션이 제대로 작동하지 않는지 예제를 통해 증명해 보고 또 encdeURL 메서드를 통해서 이것이 해결되는지 알아보겠습니다. 먼저 여러분은 웹 브라우저의 보안 설정 옵션에서 쿠키를 모두 사용하지 않음으로 체크해 두시기 바랍니다.

다음의 예제는 웹 브라우저에서 쿠키의 사용을 안한다고 설정하고, 세션 생성후 페이지를 이동함으로서 URL Rewriting이 어떻게 설정되고 또 URL Encoding에 따라서 어떻게 달라지는지를 테스트하는 예제입니다.

urlSession.html

Session URL Rewriting의 예제

<html>

<body>

<h2>Session생성 Test</h2>

<form action="urlSession.jsp" method="post">

id : <input type="text" name="id">

<input type="submit"value="확인">

</form>

</body>

</html>

urlSession.jsp

Session URL Rewriting의 예제

<%@page contentType="text/html;charset=euc-kr" session="true"%>
<html>
<body>
<h3>Session URL Rewriting Test</h3>
<%
String id=request.getParameter(
"id");
if(id.equals("")){
response.sendRedirect(
"sessionLogin.html");
}
session.setAttribute(
"id",id);
String url = response.encodeURL(
"urlSessionResult.jsp");
%>
세션ID:<%=session.getId()%><br>
I D : <%= (String)session.getAttribute(
"id") %>
<hr>
<a href =
'<%=url%>'Test1>Test1</a><br>
<a href =
"urlSessionResult.jsp">Test2</a><br>
</html>
</body>

urlSessionResult.jsp

Session URL Rewriting의 예제

<%@page contentType="text/html;charset=euc-kr" session="true"%>

<html>

<body>

<h3>Session URL Rewriting Result</h3>

세션ID:<%=session.getId()%><br>

I D : <%= (String)session.getAttribute("id")%>

</html>

</body>

Test1 클릭 est2 클릭

먼저 결과를 보며 설명드리면, 두번째 그림에서 Test1을 클릭한 것은 URL Encoding을 통해서 URL Rewriting이 이루어져 세번째 그림으로 나타납니다. 즉, 세션이 유지되고 따라서 세션에 저장한 jabook이란 ID 값도 추출됨을 볼 수 있습니다. 또한 URL 창에 세션 ID가 출력되는 것도 확인할 수 있을 것입니다. 하지만, Test2를 클릭해서 URL Encoding을 통하지 않고 호출되는 경우에는 네번째 그림처럼 세션이 유지되지 않아 새로운 세션 ID가 생성되고, 따라서 세션에 삽입한 ID 값도 값을 추출하지 못하고 있습니다.

그럼 소스를 보겠습니다. urlSession.jsp에서 내장객체 session을 이용해서 Form으로 넘어온 id 값을 세션에 저장합니다.

n session.setAttribute("id",id);

링크로 이어지는 주소를 URL Encoding 합니다.

n String url = response.encodeURL("urlSessionResult.jsp");

같은 주소를 URL Encoding을 하고 하지 않은 것으로 분리해 링크를 걸어줍니다.

n <a href = '<%=url%>'Test1>Test1</a><br>

n <a href = "urlSessionResult.jsp">Test2</a><br>

urlSessionResult.jsp 페이지에서는 세션의 ID와 값을 출력하여 같은 세션이 이어지는지 확인합니다.

n 세션 ID : <%=session.getId()%><br>

n ID : <%= (String)session.getAttribute("id")%>

이렇게 URL Encoding을 통한 URL의 재작성은 사용자가 쿠키를 전혀 사용하지 않는 경우를 대비하여 작성해 놓아야 하는 것입니다. 하지만, 그 모양이 매끄럽지 않고, 또 URL로 나타나는 만큼 정보유출의 우려도 있기 때문에 사용자에게 되도록이면 세션을 임시로 저장하는 쿠키라도 쓰라고 권장하는게 좋을 것입니다.


'네트워크보안 > asp' 카테고리의 다른 글

세션(Session)과 쿠키(Cookie) 혼합해서 쓰기.  (0) 2012.02.15
세션(session) 종료하기  (0) 2012.02.15
세션(Session) 값 얻기  (0) 2012.02.15
세션(Session) 값 설정  (0) 2012.02.15
세션(Session)이란?  (0) 2012.02.15