본문 바로가기
Back/Servlet

쿠키와 세션 - <hidden> 태그와 URL Rewriting 을 이용해 웹페이지 연동

by Hyeon_ 2021. 12. 29.

쿠키와 세션 - <hidden> 태그와 URL Rewriting을 이용해 웹페이지 연동하기

클라이언트와 서버 간에 정보를 교환하는데 클라이언트 PC 또는 서버의 메모리에 저장해 두고 사용하면 프로그램의 속도를 향상시킬 수 있다.

 

쇼핑몰을 이용할 때 메인 페이지에서 미리 로그인한 후 다른 웹 페이지에서 상품에 관한 댓글을 다는 경우가 있다. 글쓰기 창에서는 따로 로그인하지 않아도 된다. 하지만, 로그인을 하지 않았을 경우에는 '로그인 후 이용하세요'라는 메시지가 나타난다.

 이 기능은 쇼핑몰을 이용하는 사람들은 다 알지만 실제 HTTP 프로토콜 방식으로 통신하는 웹페이지는 서로 어떤 정보도 공유하지 않는다.

 

사용자 입장에서 웹 페이지 상태나 정보 공유를 위해서는 프로그래머가 세션 트래킹(Session Tracking)이라는 웹 페이지 연결 기능을 구현해야 한다.

HTTP 포로토콜

  • 서버-클라이언트 통신 시 stateless 방식으로 통신
  • 브라우저에서 새 웹페이지를 열면 기존의 웹페이지나 서블릿에 관한 어떤 연결 정보도 유지하지 않음
  • 새로 열린 페이지에서 어떤 정보도 알 수 없음
  • 페이지가 서로 독점적이어서 서로의 상태를 알 수 없음

웹 페이지 연동하는 방법

  1. <hidden> 태그 : HTML의 <hidden> 태그를 이용해 웹 페이지들 사이의 정보 공유
    • <input type="hidden" value='$(id)'> 태그 사용
  2. URL Rewriting : GET 방식으로 URL 뒤에 정보를 붙여서 다른 페이지로 전송
    • second02?name=lee -> 다음 페이지에서 getParameter()로 받아서 사용
  3. 쿠키 : 클라이언트 PC의 Cookie 파일에 정보를 저장한 후 웹 페이지들이 공유
  4. 세션 : 서버 메모리에 정보를 저장한 후 웹 페이지들이 공유

hedden과 URL Rewriting 방식은 GET 방식으로 전송하기 때문에 데이터 노출, 길이 제한, 보안 문제가 있다.

<hidden> 태그 사용

  • 현재 페이지에 데이터를 숨겨놓고 연결된 다음 페이지로 데이터를 보내는 방법
  • 두 웹 페이지가 데이터를 공유한다.
  • 페이지 1에서 <input type="hidden" name='id' value='abcd'>로 데이터를 숨김 -> 페이지 2에서 request.getParameter()로 받아서 사용 가능

<hidden> 태그와 URL Rewriting을 활용한 예제

login.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>로그인창</title>
</head>
<body>
<form name="frmLogin" method="post" action="login" >
    아이디  :<input type="text" name="user_id"><br>
    비밀번호:<input type="password" name="user_pw" ><br>
    <input type="submit" value="로그인">  <input type="reset" value="다시입력">
    <!-- hidden 태그  -->
    <input type="hidden" name="user_address" value="서울시 종로구" >
    <input type="hidden" name="user_email" value="test@naver.com" >
    <input type="hidden" name="user_hp" value="010-1111-1111" >
</form>
</body>
</html>
LoginServlet
@WebServlet(name = "LoginServlet", value = "/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        String user_address = request.getParameter("user_address");
        String user_email = request.getParameter("user_email");
        String user_hp = request.getParameter("user_hp");

        String data = "<html><body>";
        data += "안녕하세요!<br> 로그인하셨습니다.<br><br>";
        data += "아이디 : " + user_id + "<br>";
        data += "비밀번호 : " + user_pw + "<br>";
        data += "주소 : " + user_address + "<br>";
        data += "이메일 : " + user_email + "<br>";
        data += "휴대전화 : " + user_hp;
        out.print(data);

        // URL Rewriting 방식 이용
        user_address = URLEncoder.encode(user_address, "utf-8");
        out.print("<br><br><a href='/Gradle___com_example___Servlet02_1_0_SNAPSHOT_war/second?user_id=" + user_id
                + "&user_pw=" + user_pw
                + "&user_address=" + user_address
                + "'>두 번째 서블릿으로 보내기</a>");
        data = "</body></html>";
        out.print(data);
    }
}
SecondServlet
@WebServlet(name = "SecondServlet", value = "/second")
public class SecondServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        String user_address = request.getParameter("user_address");

        out.println("<html><body>");
        if (user_id != null && user_id.length() != 0) {
            out.println("이미 로그인 상태입니다 <br><br>");
            out.println("첫 번째 서블릿에서 넘겨준 아이디 : " + user_id + "<br>");
            out.println("첫 번째 서블릿에서 넘겨준 비밀번호 : " + user_pw + "<br>");
            out.println("첫 번째 서블릿에서 넘겨준 주소 : " + user_address + "<br>");
            out.println("</body></html>");
        } else {
            out.println("로그인 하지 않았습니다. <br><br>");
            out.println("다시 로그인하세요! <br>");
            out.println("<a href='login.html'>로그인창으로 이동하기</>");
        }
    }
}