본문 바로가기

JSP

[WEB] HTTP 프로토콜에서 상태를 지속시키기 위한 방법들

URL 새로쓰기(URL Rewriting)

  • 매번 페이지가 실행될 때 해당 페이지의 URL에 파라미터를 붙여 실행이 되게끔 하는 방법
  • URL에 정보가 노출이 되기때문에 보안상 문제가 발생할 수 있다.

숨겨진 필드(Hidden Form Variable)

  • form 데이터 전송시 Hidden Type을 이용하여 값을 넘기는 방법
  • URL에 직접적인 정보가 노출이 되지 않으나, 페이지가 실행이 되었을 때 브라우저에서 소스보기를 통해 노출된다.

쿠키(Cookie)

  • javax.servlet.http 패키지의 Cookie 클래스를 이용한 방법
  • 서버에서 만들어진 쿠키를 응답과 함께 전송하여 클라이언트측에서 저장된다.
  • 클라이언트에 저장된 쿠키를 열어볼 수 있기 때문에 중요한 정보를 쿠키에 저장시 문제가 발생할 수 있다.

세션(HttpSession)

  • javax.servlet.http 패키지의 HttpSession 인터페이스를 이용하는 방법
  • 클라이언트의 식별을 위한 세션아이디만 클라이언트에 저장되고, 나머지는 정보는 서버에 저장된다.
  • 서버의 메모리에서 관리되기 때문에 쿠키에비해 보안적인 측면에서 유리하다.
  • URL새로쓰기, 숨겨진 필드 또한 SessionID를 사용해서 매 페이지로 넘겨진다.

URL새로쓰기와 숨겨진 필드 예시

  • form-data 전송시 hidden속성과 URL새로쓰기를 이용한 방법또한 세션아이디의 비교를 통해 클라이언트를 식별하여, 클라이언트의 서버에 등록된 메모리를 구별하는 방식이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Hidden Form Variable</h1>
	<form action="temp.jsp" method="get">
		<input type="text" name="name">
		<input type="text" name="greeting" value="hi" hidden="true">
		<input type="submit" value="이동">
	</form>
	
	<hr>

	<a href="temp.jsp?name=honggildong&greeting=hi">URL Rewriting</a>
	
</body>
</html>
  • 전송받은 데이터를 간단하게 출력하는 예제이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String name = request.getParameter("name");
		String greeting = request.getParameter("greeting");
	%>
	<div><%= name %> <%= greeting %></div>
</body>
</html>

결과

  • HIdden속성을 가진 Tag는 페이지 소스보기를 확인하면 노출이된다.

  • URL에 queryString을 추가하는 방법은 URL상에 데이터가 노출이된다.

  • 그렇기 때문에 위와같은 두가지 방법은 보안에 민감하지 않은 정보만을 전송하는것이 좋다.

쿠키와 세션 예시

  • Cookie클래스와 JSP의 내장객체 session을 이용해 쿠키와 세션을 만든다.
  • Cookie는 String, String 쌍의 값만 저장이 가능하다.
  • Session은 String, Object 쌍의 값이 저장이 가능하다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Set Cookie and Session</title>
</head>
<body>
	<%
		String cookieName = "myCookie";
		Cookie cookie = new Cookie(cookieName, "Apple");
		cookie.setMaxAge(60);
		response.addCookie(cookie);
		
		session.setAttribute("idKey", "java");
		session.setAttribute("pwKey", "1234");
		session.setMaxInactiveInterval(60);
	%>
	<div><a href="viewCookieSessionInfo.jsp">결과 확인하기</a></div>
	
</body>
</html>
  • 이후 링크를 통해 새로운 페이지를 얻고, 해당 페이지에서 쿠키와 세션 정보를 가져온다.
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>View Cookie Session Info</title>
</head>
<body>

	<%
		Enumeration e = session.getAttributeNames();
		while(e.hasMoreElements()) {
			String name = (String)e.nextElement();
			String value = (String)session.getAttribute(name);
			out.println("session name : " + name + ", ");
			out.println("session value : " + value + "<br>");
		}
		
		Cookie[] cookies = request.getCookies();
		if(cookies != null) {
			for(int i=0; i<cookies.length; i++) {
				out.println("Cookie name : " + cookies[i].getName() + ", ");
				out.println("Cookie value : " + cookies[i].getValue() + "</br>");
			}
		}
	%>

</body>
</html>

결과

  • 정상적으로 Session과 Cookie에 설정된 내용이 출력됨을 확인할 수 있다.
  • 또한 개발자도구를 통해 해당 웹 애플리케이션에 저장된 쿠키의 정보를 열람할 수 있다.
  • 이를통해 쿠키는 클라이언트측에 저장되고 노출이될 수 있다는 점을 확인할 수 있다.
  • 또한 Session역시 요청 웹브라우저의 식별을 위해 JSSESSIONID를 쿠키에 저장하고, 매 요청시마다 세션아이디를 확인을 위해 쿠키를 체크하고, 서버내 저장되어있는 세션정보에 접근을 하게 되는것이다.

 

 

쿠키와 세션의 추가적인 개념은 여기를 참고해주세요

https://tatsu.tistory.com/entry/JSP%EC%BF%A0%ED%82%A4%EC%99%80-%EC%84%B8%EC%85%98

 

[JSP]쿠키와 세션

HTTP의 특징과 세션과 쿠키가 만들어진 이유 HTTP의 특징 비연결성(connectionless), 무상태성(stateless)한 특징을 갖는 프로토콜이다. 비연결성 : 클라이언트가 HTTP Request를 통해 서버에게 요청을 보내면

tatsu.tistory.com

 

'JSP' 카테고리의 다른 글

[JSP] JSTL  (0) 2023.03.16
[JSP]EL  (0) 2023.03.16
[JSP] Java Beans와 JSP 빈즈태그  (0) 2023.03.15
[JSP] 내부객체  (0) 2023.03.15
[JSP]JSP의 지시자와 액션태그  (0) 2023.03.15