프로그래밍 언어/자바 웹

URL Rewriting을 이용한 세션 트래킹 실습

· 코딩마이데이

1. 새로운 패키지를 만들고 LoginServlet, SecondServlet 클래스 파일을 준비합니다.

실습 파일 위치

 

2. LoginServlet 클래스를 다음과 같이 작성합니다. 로그인창에서 입력 받은 ID와 비밀번호를 <a> 태그의 두 번째 서블릿으로 보내기를 클릭하면 로그인창에서 입력한 ID와 비밀번호 그리고 다른 정보들을 GET 방식을 이용해 두 번째 서블릿으로 전송헙니다.

package sec01.ex02;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	public void init() {
		System.out.println("init 메서드 호출");
	}

	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;
		data += "<br>";
		data += "비밀번호 : " + user_pw;
		data += "<br>";
		data += "주소 : " + user_address;
		data += "<br>";
		data += "email : " + user_email;
		data += "<br>";
		data += "휴대 전화 : " + user_hp;
		data += "<br>";
		out.print(data);

		user_address = URLEncoder.encode(user_address, "utf-8"); // GET 방식으로 한글을 전송허기 위해 인코딩합니다.
		out.print("<a href='/pro09/second?user_id=" + user_id 
				             + "&user_pw=" + user_pw 
				             + "&user_address=" + user_address
				             + "'>두 번째 서블릿으로 보내기</a>"); // <a> 태그를 이용해 링크 클릭 시 서블릿 /second로 다시 로그인 정보를 전송합니다.
		data = "</body></html>";
		out.print(data);
	}
	
	
	public void destroy() {
		System.out.println("destory 메서드 호출");
	}
}

 

3. SecondServlet 클래스를 다음과 같이 작성합니다. 첫 번째 서블릿에서 전송한 데이터 ID와 비밀번호를 가져왔으면 이미 첫 번째 서블릿에서 로그인한 것이므로 로그인 상태를 유지하도록 해줍니다.

package sec01.ex02;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	public void init() {
		System.out.println("init 메서드");
	}
	
	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='/pro09/login.html'>로그인창으로 이동하기 </>");
		}
	}
	
	public void destroy() {
		System.out.println("destory 메서드 호출");
	}
}

 

4. <hidden> 태그와 URL Rewriting 방식으로 데이터를 전송한 결과를 볼까요? http://localhost:8090/pro09/login.html로 요청한 후 ID와 비밀번호를 입력하고 첫 번째 서블릿으로 전송합니다.

로그인창 요청

 

5. 첫 번째 서블릿에서 전달받은 로그인 정보를 출력한 후 두 번째 서블릿으로 보내기를 클릭합니다.

입력한 로그인 정보가 표시되면 두 번째 서블릿으로 보내기 클릭

 

6. 두 번째 서블릿에서 현재 로그인 상태와 회원 정보를 출력합니다.

로그인창에서 입력한 정보가 두 번째 서블릿에 전달됨

 

7. 만약 브라우저에서 로그인 창을 거치지 않고 바로 서블릿 /second로 요청하면 "로그인 하지 않았습니다."라고 상태 안내 문구와 함께 '로그인창으로 이동하기'가 표시됩니다.

로그인창을 거치지 않고 바로 서블릿 /second로 요청한 경우

 

웹 페이지가 많아지면 일일이 로그인 상태를 확인하기 위해 로그인 정보를 다른 웹 페이지로 전송해야 한다는 한다는 것입니다. 그리고 ID와 비밀번호를 GET 방식으로 전송하므로 브라우저에 노출되어 보안상으로도 좋지 않습니다. 또한 전송할 수 있는 데이터 용량에도 한계가 왔습니다. 따라서 이 방식은 웹 페이지 사이에 간단한 정보 정도를 공유할 때만 사용하는 것이 좋습니다.