2013년 11월 3일 일요일

[JAVA,JSP,URL Rewrite, URL다시쓰기, Java Servlet, JSP강좌]


[JAVA,JSP,URL Rewrite, URL다시쓰기, Java Servlet, JSP강좌]
 
사용자가 웹브라우저에 쿠키를 사용하지 못하게 했을때 쿠키를 이용한 세션트래킹은 불가능, 이때 URL Rewriting을 이용한다.
 
Explorer : 도구/인터넷옵셥 메뉴에서 개인정보 부분...."쿠키사용하지않음"으로 설정
Netscape : Edit/Preference메뉴에서 Acvanced에서 Cookie부분을 Disable cookies로 setting
 
<Form> Tag을 기술하는 부분에 인코딩된 SessionID를 포함하는 Action URL을 설정해야 한다. 이때 HttpServletResponse의 encodeURL함수를 사용한다.

Session ID의 노출이라는 보안상의 위험이 있다.

- public class HttpServletResponse.encodeUrl(String Url)
 
    지정된 URL이 세션ID를 포함하도록 암호화한후 새로운 URL을 Return,암호화가 필요없거나 지원안한다면 URL은 변경되지 않는다. 서블릿에서 만들어 지는 모든 URL은 이 메소드를 통해 수행되어야 한다.

    예)res.encodeUrl(req.getRequestURI())
 
- public class HttpServletResponse.encodeRedirectUrl(String Url)
 
    지정된 URL이 세션ID를 포함하도록 암호화한후 새로운 URL을 Return,암호화가 필요없거나 지원안한다면 URL은 변경되지 않는다.HttpServletResponse의 sendRedirect() 메소드로 Return되는 모든 URL은 이 메소드로 수행되어야 한다.

   res.sendRedirect(res.encodeRedirectUrl (“/servlet/URLRedirect”))
 

[URLRewriting.html]
 
<html>
<body>
<font size=+1 color=blue><b>Login to the Personal Information Server</b></font>
<hr>
<form method=post action=http://localhost/servlet/URLRewriting>
<table border=0>
<tr><td>Your ID   </td><td><input type=text name=USER></td></tr>
<tr><td>Password  </td><td><input type=password name=PASSWORD></td></tr>
<tr><td colospan=2><input type=submit value=Login></td></tr>
</table>
</form>
</body>
</html>

[URLRewriting.java]
 
//Other Page를 누를때 URL이 어떻게 넘어 가는지 Test하는 예제
//웹브라우저에 쿠키를 받게 Setting되어 있다면 Cookie를 통해서 Session ID등이
//전송되나 쿠키를 안받게 Setting되어 있다면 URL뒤에 sesison ID등이 붙어서 넘어가제 되어있다.
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class URLRewriting extends HttpServlet {

 public void doGet(HttpServletRequest req, HttpServletResponse res)
  throws ServletException,IOException {
  doPost(req,res);
 }
 public void doPost(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException { 
  res.setContentType("text/html; charset=euc-kr");
  PrintWriter out = res.getWriter(); 
  //세션을 생성, 없으면 새로만듬
  HttpSession sess = req.getSession();
  String user=req.getParameter("USER");
  String pWord=req.getParameter("PASSWORD");
 
  //세션에 데이터 Put
  sess.putValue(user,pWord);
  out.println("<body><head><title>URLRewriting Servlet</title></head><body>");
  out.println("<font size=+1 color=blue><b>URLRewriting Servlet</b></font>");
  out.println("<hr>");
                 out.println("Session ID : " + sess.getId()+"<br>");
  out.println("Creation Time : "+ new Date(sess.getCreationTime())+"<br>");
  out.println("Last Accessed Time : "+new Date(sess.getLastAccessedTime())+"<br>");  out.println("isRequestedSessionIdFromUrl : "+req.isRequestedSessionIdFromUrl()+"<br>”);  out.println("isRequestedSessionIdFromCookie : "+req.isRequestedSessionIdFromCookie()+"<br>");
  out.println("<hr><p>");
  out.println("<b>Login Information</b><br>");
  out.println("Your id : "+ user+"<br>");
  out.println("Your password : "+pWord+"<br>"); 
  out.println("<p><br>"); 
        //일반적인 URL 링크
  out.println("1. <a href=http://localhost/servlet/OtherPage>OtherPage(일반적인  URL링크)></a><br>");
                 //encodeURL() URL에 SesisonID를 덧붙여전송
  //(쿠키를 안받게 브라우저를 Setting시 URL뒤에 session id를 붙여넘김)
  out.println("2. <a href="+res.encodeURL("OtherPage")+">OtherPage(encodeUrl)</a><br>");
  //encodeRedirectURL() 괄호안에 sendRedirect(Url)이나 절대URL경로를 기술
  //(쿠키를 안받게 브라우저를 Setting시 URL뒤에 session id를 붙여넘김)
  out.println("3. <a href="+res.encodeRedirectUrl("http://localhost/servlet/OtherPage")+">Other Page(encodedRdirectUrl)</a><br>");
  //session.getId() method로 URL뒤에 임의로 Session ID를 붙임
  out.println("4. <a href=http://localhost/servlet/OtherPage;$sessionid$"+sess.getId()+">Other Page(일반적인 URL링크+session ID)</a><br>");
  out.println("</body></html>");
  out.close();
 }
};
 
[OtherPage.java]
 
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class OtherPage extends HttpServlet {

 public void doGet(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
  res.setContentType("text/html; charset=euc-kr");
  PrintWriter out = res.getWriter();
 
  //세션생성 있으면 그세션을 넘기고, 없으면 Null을 넘김
  HttpSession sess = req.getSession(false);
                  out.println("<html><head><title>OtherPage Servlet</title></head><body>");
  out.println("<font size=+1 color=blue><b>OtherPage Servlet</b></font><hr>");
                 if(sess==null) {
                   //세션이 성립되어 있지 않은 경우
   out.println("<font size=-1 color=blue>먼저 LogIn을 하세요(세션이 성립되어 있지 않습니다.)</font><br>");
  } else {
   out.println("Session ID : "+sess.getId()+"<br>");
   String key[]=sess.getValueNames();  
   out.println(key[0]+"!!! Welcome to my site.");
   out.println("<br>session # : "+key.length+"<br>");
  }  out.println("isRequestedSessionIdFromUrl : "+req.isRequestedSessionIdFromUrl()+"<br>");       out.println("isRequestedSessionIdFromCookie : "+req.isRequestedSessionIdFromCookie()+"<br>");
 }
};
 
 




댓글 없음:

댓글 쓰기