[Web] 세션 트래킹 / hidden 태그 / URL Rewriting

2024. 8. 17. 21:58자바 웹 개발/세션 쿠키 필터 리스너

웹 프로그램에서 사용되는 정보는 데이터베이스에서 가져온다. 하지만 사용자 수가 많아지면 데이터베이스 연동 속도에 영향을 준다. 그래서 몇몇 정보는 클라이언트 PC와 서버의 메모리에 저장하고 사용한다. 

세션 트래킹

HTTP 프로토콜 방식으로 통신하는 웹 페이지는 서로 정보를 공유하지 않는다. 이 방식을 stateless 방식이라고 한다. 브라우저에서 새 웹 페이지를 열면 어떤 연결 정보도 새 웹 페이지에는 알려지지 않는다. 웹 페이지 사이의 상태나 정보를 공유하려면 세션 트래킹이라는 웹 페이지 연결 기능을 구현해야만 한다. 

 

연동 방법은 다음과 같다. 

 

1. hidden 태그 사용

2. URL Rewriting 

3. 쿠키

4. 세션

 

hidden 태그

hidden 태그는 브라우저에 표시되지 않지만 미리 저장된 정보를 서블릿으로 전송할 수 있다. login.html을 다음과 같이 작성한다. 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form name="frmLogin" method="post" action="login" encType="UTF-8">
		아이디 :<input type="text" name="user_id"><br>
		비밀번호 :<input type="password" name="user_pw"><br>
		<input type="submit" value="로그인">
		<input type="reset" value="다시 입력">
		<input type="hidden" name="user_address" value="서울시 성북구">
		<input type="hidden" name="user_email" value="test@gmail.com">
		<input type="hidden" name="user_hp" value="010-111-2222">	  
	</form>
</body>
</html>

 

위 코드를 실행해보면 다음과 같이 출력된다. 

보이지는 않지만 hidden 태그의 value 속성에 주소, 이메일, 전화번호를 저장한 후 서블릿으로 전송한다. 이 정보를 getParameter() 메서드를 이용하여 가져올 수 있다. 

 

로그인을 입력하면 form에 입력된 방법(post)로 입력된 매핑(login)으로 전달합니다.

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

}

 

URL Rewriting을 이용한 세션 트래킹

<a> 태그를 클릭하면 로그인창에서 입력한 ID와 비밀번호가 SecondServlet으로 전송된다. 쿼리스트링을 통해 전달하기 때문에 방식은 get이다. 

 

user_address=URLEncoder.encode(user_address, "utf-8");
out.printf("<a href='/pro5/second?user_id=%s&user_pw=%s&user_address=%s'>두번째 서블릿으로 보내기</a>", user_id, user_pw, user_address);
data="</body></html>";
out.print(data);

 

URLEncoder.encode(문자열, 인코딩) : 문자열을 지정된 방식으로 인코딩할 때 사용함

 

https://docs.oracle.com/javase/8/docs/api/java/net/URLEncoder.html

 

URLEncoder (Java Platform SE 8 )

Utility class for HTML form encoding. This class contains static methods for converting a String to the application/x-www-form-urlencoded MIME format. For more information about HTML form encoding, consult the HTML specification. When encoding a String, th

docs.oracle.com

두 번째 서블릿은 다음과 같이 작성한다. getParameter를 통해 첫 번째 서블릿에서 전달된 내용을 받는다. 만약, 첫 번째 서블릿에서 넘어오지 않았다면 다시 로그인 창으로 이동하는 a태그를 넣었다. 

@WebServlet("/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='/pro5/login.html'>로그인창으로 이동하기</>");
		}
	}
}

첫 번째 서블릿을 거치치 않았을 시
첫 번째 서블릿에서 정보를 얻었을 시