본문 바로가기

JSP, Servlet, MySQL/JSP - webmarket

JSP Servlet 쿠키 : 주문 처리 페이지 만들기

728x90
반응형

01 쿠키의 개요

쿠키(cookie)는 세션과 마찬가지로 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법이다. 하지만 쿠키는 세션과 달리 상태 정보를 웹 서버가  아닌 클라이언트에 저장한다. 예를 들어 어떤 웹 사이트를 처음 방문한 사용자가 로그인 인증을 하고 나면 아이디와 비밀번호를 기록한 쿠키가 만들어진다. 그다음부터 사용자가 그 웹 사이트에 접속하면 별도의 절차를 거치지 않고 쉽게 접속할 수 있다. 

 

이와 같이 쿠키는 클라이언트의 정보를 웹 브라우저에 저장하므로 이후에 웹 서버로 전송되는 요청에는 쿠키가 가지고 있는 정보가 포함된다. 이때 웹 서버는 웹 브라우저의 요청에 포함된 쿠키를 읽어 새로운 웹 브라우저인지, 이전에 요청했던 웹 브라우저인지 판단한다.

 

쿠키는 클라이언트의 일정 폴더에 정보를 저장하기 때문에 웹 서버의 부하를 줄일 수 있다는 것이 장점이다. 반면에 웹 브라우저가 접속했던 웹 사이트에 관한 정보와 개인 정보가 기록되기 때문에 보안에 무제가 있다. 이러한 보안상의 문제를 해소하기 위해 웹 브라우저 자체에 쿠키 거부 기능이 추가되었다. 그러나 크키에 대한 거부가 웹 브라우저에 설정되어 있으면 쿠키 본래의 목적인 웹 브라우저와의 연결을 지속시키는 기능을 수행할 수 없다. 

 

1. 쿠키 생성 단계 

쿠키를 사용하려면 먼저 쿠키를 생성해야 한다. 쿠키는 주로 웹 서버 측에서 생성한다. 생성된 쿠키는 응답 데이터에 함께 저장되어 웹 브라우저에 전송된다. 

 

2.쿠키 저장 단계

웹 브라우저는 응답 데이터에 포함된 쿠키를 쿠키 저장소에 보관한다. 쿠키는 종류에 따라 메모리나 파일로 저장된다. 

 

3.쿠키 전송 단계

웹 브라우저는 한 번 저장된 쿠키를 요청이 있을 때마다 웹 서버에 전송한다. 웹 서버는 웹 브라우저가 전송한 쿠키를 사용하여 필요한 작업을 수행할 수 있다. 

 

일단 웹 브라우저에 쿠키가 저장되면 웹 브라우저는 쿠키가 삭제되기 전까지 웹 서버에 쿠키를 전송한다. 따라서 웹 애플리케이션을 사용하는 동안 지속적으로 유지해야 하는 정보는 쿠키를 이용해서 저장하면 된다. 

 

이와 같이 JSP 페이지는 쿠키 기능을 사용할 수 있도록 Cookie 클래스를 제공한다. 또한 Cookie 클래스는 다음과 같은 메소드를 지원한다. 

 

Cookie 클래스의 메소드 종류

메소드 반환 유형 설명
getComment() String 쿠키에 대한 설명을 반환한다.
getDomain() String 쿠키의 유효한 도메인 정보를 반환한다. 
getMaxAge() int 쿠키의 사용 가능 기간에 대한 정보를 반환한다.
getName() String 쿠키의 이름을 반환한다. 
getPath() String 쿠키의 유효한 디렉터리 정보를 반환한다. 
getSecure() boolean 쿠키의 보안 설정을 반환한다.
getValue() String 쿠키에 설정된 값을 반환한다.
getVersion() int 쿠키의 버전을 반환한다. 
setComment(String) void 쿠키에 대한 설명을 설정한다. 
setDomain(String) void 쿠키에 유효한 도메인을 설정한다.
setMaxAge(int) void 쿠키의 유효 기간을 설정한다. 
setPath(String) void 쿠키의 유효한 디렉터리를 설정한다. 
setSecure(boolean) void 쿠키의 보안을 설정한다.
setValue(String) void 쿠키의 값을 설정한다.
setVersion(int) void 쿠키의 버전을 설정한다. 

 

 

NOTE_ 쿠키와 세션의 차이

구분 쿠키 세션
사용클래스 Cookie 클래스 HttpSession 인터페이스
저장 형식 텍스트 형식 Object 형
저장 장소 클라이언트 서버(세션 아이디만 클라이언트에 저장)
종료 시점 쿠키 저장 시 설정(설정하지 않을 경우 웹 브라우저 종료 시 소멸) 정확한 시점을 알 수 없음
리소스 클라이언트의 리소스 사용 서버의 리소스 사용
보안 클라이언트에 저장되므로 사용자의 변경이 가능하여 보안에 취약 서버에 저장되어 있어 상대적으로 안정적

 

쿠키 대신에 세션을 사용하는 첫번째 이유는 쿠키보다 세션이 보안에 강하기 때문이다. 쿠키의 이름이나 데이터는 네트워크를 따라서 전달되기 때문에 일반적인 HTTP 프로토콜을 사용할 경우 중간에 누군가가 쿠키의 값을 읽을 수 있다. 반면에 세션의 값은 서버에만 저장되기 때문에 중요한 데이터를 저장하기에 적합하다. 세션을 사용하는 두번째 이유는, (흔치 않지만) 웹 브라우저가 쿠키를 지원하지 않거나 강제로 쿠키를 막은 경우 쿠키를 사용할 수 없지만 세션은 쿠키 설정 여부에 상관없이 사용할 수 있기 떄문이다. 

 

02 쿠키 생성

 

쿠키를 사용하려면 먼저 Cookie 클래스를 사용하여 쿠키를 생성해야 한다. 쿠키를 생성하는 데에는 Cookie()메소드를 사용하며 형식은 다음과 같다. 쿠키를 생성한 후에는 반드시 response 내장 객체의 addCookie() 메소드로 쿠키를 설정해야 한다. 

Cookie Cookie(String name, String value)

 

첫번째 매개변수 name 은 쿠키를 식별하기 위한 이름을 나타내고, 두번째 매개변수 value 는 쿠키 값을 나타낸다. 

 

다음은 쿠키 이름이 memberId 이고 쿠키 값을 admin 으로 쿠키를 생성하는 예이다. 첫 번째 행에서는 쿠키 정보를 담고 있는 Cookie 클래스의 생성자 Cookie() 를 통해 쿠키 객체를 생성하고, 두 번째 행에서는 response 내장 객체의 addCookie() 메소드를 사용하여 쿠키 객체를 설정한다. addCookie() 메소드는 웹 브라우저에 쿠키 정보를 추가로 전송한다. 

 

[Cookie() 메소드 사용 예]

Cookie Cookie = new Cookie("memberId" , "admin");
response.addCookie(cookie);

 

예제- 쿠키 생성하기 

cookie01.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Cookie</title>
</head>
<body>
	<form action="cookie01_process.jsp" method="post">
		<p> ID : <input type="text" name="id">
		<p> PW : <input type="text" name="passwd">
		<p> <input type="submit" value="">
	</form>
</body>
</html>

 

cookie01_process.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Cookie</title>
</head>
<body>
	<%
		//요청 파라미터 아이디와 비밀번호를 전송받도록 request 내장 객체의 getParameter()메소드를 작성한다. 
		String user_id = request.getParameter("id");
		String user_pw = request.getParameter("passwd");
		
		
		//전송된 아아디와 비밀번호가 각각 admin 1234 와 일치하면 쿠키 이름 userID, userPW 에 값을 설정하도록 Cookie 객체를 생성한다.
		//생성된 Cookieㅓ 객체를 쿠키로 저장하도록 response 내장 객체의 addCookie() 메소드를 작성하고 성공 메시지를 출력한다. 
		//또한 일치하지 않으면 실패 메시지를 출력하도록 작성한다. 
		if ( user_id.equals("admin") && user_pw.equals("1234")){
			Cookie cookie_id = new Cookie("userID", user_id);
			Cookie cookie_pw = new Cookie("userPW" , user_pw );
			response.addCookie(cookie_id);
			response.addCookie(cookie_pw);
			out.println("쿠키 생성이 성공했습니다. <br>");
			out.println(user_id+"님 환영합니다. ");
		}else{
			out.println("쿠키 생성이 실패했습니다. ");
		}
	
	%>
</body>
</html>

 

03 쿠키 정보

생성된 쿠키의 정보를 얻어오려면 request 내장 객체의 getCookie() 메소드를 사용하여 쿠키 객체를 얻어온 후 getName(), getValue() 메소드를 사용하여 쿠키 이름과 값을 얻어온다. 

 

3.1 쿠키 객체 얻기

클라이언트에 저장된 모든 쿠키 객체를 가져오려면 request 내장 객체의 getCookie() 메소드를 사용하며 형식은 다음과 같다. 쿠키 객체가 여러 개일 때는 배열 형태로 가져온다. 

Cookie[] request.getCookies()

 

다은은 request 내장 객체의 getCookies() 메소드로 쿠키 객체를 배열 형태로 가져오는 예이다. 

 

[getCookies() 메소드 사용 예]

Cookie[] cookies = request.getCookies();

 

3.2 쿠키 객체의 정보 얻기

쿠키 객체를 얻어왔다면 이 쿠키 객체에 저장된 쿠키 이름과 값을 가져오기 위해 getName(), getValue() 메소드를 사용하며 형식은 다음과 같다. 

String getName()

String getValue()

 

다음은 request 내장 객체의 getCookies() 메소드로 쿠키 객체를 읽어온 후 해당 쿠키 객체의 개수만큼 쿠키 이름과 값을 출력하는 예이다. 

[getName(), getValue() 메소드 사용 예]

Cookie[] cookies = request.getCookies();

for(int i= 0; i < cookies.length; i++) {
	out.println(cookies[i].getName() + ":" + cookies[i].getValue() + "<br>");
}

 

예제- 쿠키 객체에 저장된 모든 쿠키 값 가져와 출력하기

 

cookie02.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Cookie</title>
</head>
<body>
	<%
		//쿠키 정보를 얻어오도록 request 내장 객체의 getCookies() 메소드를 작성한다. 
		Cookie[] cookies = request.getCookies();
	
		//언어온 쿠키 정보의 개수를 출력하도록 Cookie 객체의 length 를 작성한다. 
		out.println("현재 설정된 쿠키의 개수 =>" + cookies.length + "<br>");
		out.println("===================================<br>");
		
		//얻어온 쿠키 정보에서 쿠키 이름과 값을 하나씩 출력하도록 Cookie 객체의 getName(), getValue() 메소드를 작성한.
		for ( int i = 0 ; i < cookies.length; i ++){
			out.println("설정된 쿠키의 속성 이름 [" + i + "]:" + cookies[i].getName() + "<br>");
			out.println("설정된 쿠키의 속성 값 [" + i + "]:" + cookies[i].getValue() + "<br>");
			out.println("____________________<br>");
			
		}
	
	%>
</body>
</html>

 

 

728x90
반응형