본문 바로가기

학원/복기

[Servlet] 쿠키(Cookie)

쿠키(Cookie)

쿠키(Cookie)는 서버(웹프로그램)와 클라이언트(브라우저)의 연결 지속성을 제공하기 위해 클라이언트에 저장하는 문자값을 뜻한다. 

클라이언트는 접속 서버의 정보를 식별자로 하여 쿠키 정보를 저장한다.


예제)

클라이언트에게 쿠키를 전달하고 처리결과를 웹문서로 응답하는 서블릿 생성

→ 서블릿에 의해 전달받은 쿠키는 클라이언트에 저장된다.

 

@WebServlet("/create.itwill")
public class CookieCreateServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//파일형태(MimeType)를 변경
		response.setContentType("text/html;charset=utf-8");
		//응답파일을 생성하기 위한 출력스트림을 반환받아 저장
		PrintWriter out=response.getWriter();
        
        	//코드작성
            	//코드작성
           	// ...
	}
}

 

 

1) Cookie 객체 생성 - Cookie 객체를 클라이언트에 전달하여 클라이언트에 쿠키 저장

→ Cooke 객체 : 쿠키 관련 정보를 저장하기 위한 객체

 

Cookie(String name, String value) 생성자로 매개변수에 쿠키명과 쿠키값을 전달하여 객체를 생성한다.

쿠키명 : 쿠키값을 구분하기 위한 식별자 / 쿠키값 : 연결 지속성을 제공하기 위한 문자값 

 쿠키명과 쿠키값은 영문자, 숫자, 일부 특수문자만 사용하여 작성이 가능하다. (한글 사용 X) 

Cookie idCookie=new Cookie("id", "abc123");//id라는 이름으로 abc123 저장
Cookie countCookie=new Cookie("count", "0");//count라는 이름으로 0 저장

 

2) 클라이언트에 전달되어 저장될 쿠키의 유지시간을 변경한다.

 

Cookie.setMaxAge(int expiry) : 쿠키의 유지시간을 변경하는 메소드

→ 매개변수에 쿠키를 유지하기 위한 시간(초)를 전달하면 클라이언트는 해당 시간 동안 쿠키를 유지한다. 

 

setMaxAge() 메소드를 호출하지 않은 경우엔 쿠키 유지시간의 기본값이  [-1]로 설정되며, 쿠키 유지시간이 [-1]로 설정된 쿠키는 브라우저 종료시 자동으로 소멸된다.

 

countCookie.setMaxAge(24*60*60);//쿠키 유지시간을 1일로 변경

 

3) 클라이언트에게 Cookie 객체를 전달한다. (클라이언트에 쿠키가 저장된다.)

→ Cookie 객체의 유지시간이 [-1]인 쿠키는 클라이언트 브라우저 메모리에 저장되며 브라우저 종료시 소멸된다.

→ Cookie 객체의 유지시간이 [-1]이 아닌 쿠키는 클라이언트의 쿠키파일로 저장되며 유지시간 경과 후 소멸된다.

 

HttpServletResponse.addCookie(Cookie cookie) : 클라이언트에게 Cookie 객체를 전달하는 메소드

response.addCookie(idCookie);
response.addCookie(countCookie);

 

4) HTML 문서 만들어 응답

 

out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>쿠키(Cookie) 생성</h1>");
out.println("<hr>");
out.println("<p>네 안에 쿠키 있다.</p>");
out.println("<hr>");
out.println("<p><a href='read.itwill'>쿠키 읽기</a></p>");
out.println("</body>");
out.println("</html>");

클라이언트로 전달받은 쿠키값을 반환받아 클라이언트에게 전달하여 응답하는 서블릿 생성 (read.itwill 서블릿)

→ 클라이언트는 서버에 접속해서 웹프로그램을 요청할 때 서버 정보로 저장된 모든 쿠키를 리퀘스트 메세지에 담아 제공한다. 

 

@WebServlet("/read.itwill")
public class CookieReadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//파일형태(MimeType)를 변경
		response.setContentType("text/html;charset=utf-8");
		//응답파일을 생성하기 위한 출력스트림을 반환받아 저장
		PrintWriter out=response.getWriter();
        
        	//코드작성
            	//코드작성
           	// ...
	}
}

 

1)  클라이언트에게 전달받은 모든 쿠키를 반환받아 저장 

 

HttpServletRequest.getCookies() : 클라이언트에게 전달받은 모든 쿠키를 얻어와 Cookie 객체 배열로 반환하는 메소드 

Cookie[] cookies=request.getCookies();

 

2) HTML 문서 만들어 응답

 

 

[전체 소스코드]

package xyz.itwill.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//클라이언트로 전달받은 쿠키값을 반환받아 클라이언트에게 전달하여 응답하는 서블릿
@WebServlet("/read.itwill")
public class CookieReadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//클라이언트에게 전달받은 모든 쿠키를 반환받아 저장 
		Cookie[] cookies=request.getCookies();
		
		//HTML 문서 만들어 응답
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>쿠키 읽기</h1>");
		out.println("<hr>");
		if(cookies==null) {//클라이언트로부터 전달받은 쿠키가 없는 경우  
			out.println("<p>네 안에 쿠키 없다.</p>");
		} else {
			String id="";
			String count="";
			
			//Cookie 객체 배열에 있는 요소(Cookie 객체)를 차례대로 제공받아 사용하기 위한 반복문
			for(Cookie cookie : cookies) {
				//클라이언트로부터 전달받은 쿠키에서 필요로 하는 쿠키값을 반환받아 저장
				//Cookie.getName() : Cookie 객체에 저장된 쿠키명을 반환하는 메소드 
				if(cookie.getName().equals("id")) {
					//Cookie.getValue() : Cookie 객체에 저장된 쿠키값을 반환하는 메소드 
					id=cookie.getValue();
				} else if(cookie.getName().equals("count")) {
					count=cookie.getValue();
				}
			}
			//클라이언트에게 쿠키값을 HTML 문서에 포함하여 출력 
			if(!id.equals("")) {//쿠키값이 있는 경우 
				out.println("<p>아이디 = "+id+"</p>");
			}
			if(!count.equals("")) {//쿠키값이 있는 경우 
				int cnt=Integer.parseInt(count)+1;
				out.println("<p>서블릿 요청횟수 = "+cnt+"</p>");
				
				//클라이언트에게 Cookie 객체를 전달하여 저장
				// => 전달되는 Cookie 객체의 쿠키명과 같은 쿠키가 이미 클라이언트에 저장되어 
				//있는 경우 덮어씌우기한다. (쿠키를 변경한다.) 
				Cookie cookie=new Cookie("count", cnt+"");
				cookie.setMaxAge(86400);
				response.addCookie(cookie);
			}
		}
		out.println("<hr>");
		out.println("<p><a href='create.itwill'>쿠키 생성</a></p>");
		out.println("<p><a href='remove.itwill'>쿠키 삭제</a></p>");
		out.println("</body>");
		out.println("</html>"); 
	}

}

 

클라이언트에 저장된 모든 쿠키를 삭제하고 실행결과를 전달하여 응답하는 서블릿 생성(remove.itwill 서블릿)

 

별도로 쿠키를 삭제하는 메소드는 존재하지 않으며,

쿠키의 유효시간을 0으로 지정하면 웹브라우저에 전달되자 마자 삭제된다.

 

@WebServlet("/remove.itwill")
public class CookieRemoveServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//파일형태(MimeType)를 변경
		response.setContentType("text/html;charset=utf-8");
		//응답파일을 생성하기 위한 출력스트림을 반환받아 저장
		PrintWriter out=response.getWriter();
        
        	//코드작성
            	//코드작성
           	// ...
	}
}

 

 

1) 클라이언트에게 전달받은 모든 쿠키를 반환받아 저장 

Cookie[] cookies=request.getCookies();

 

 

2) 클라이언트에게 전달받은 쿠키의 유지시간을 [0]으로 변경하여 클라이언트에게 전달 

→ 유지시간이 지난 쿠키는 클라이언트에서 자동으로 소멸되기 때문에 클라이언트에 저장된 쿠키는 삭제된다.

if(cookies != null) {//클라이언트에게 전달받은 쿠키가 있는 경우 
			//Cookie 객체 배열에 있는 요소(Cookie 객체)를 차례대로 제공받아 사용하기 위한 반복문
			for(Cookie cookie : cookies) {
				cookie.setMaxAge(0);
				response.addCookie(cookie);//클라이언트에 저장된 기존 쿠키 덮어씌우기 
			}
		}

 

 

3) HTML 문서 만들어 응답

 

[전체 소스코드]

 

package xyz.itwill.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//클라이언트에 저장된 모든 쿠키를 삭제하고 실행결과를 전달하여 응답하는 서블릿
@WebServlet("/remove.itwill")
public class CookieRemoveServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//클라이언트에게 전달받은 모든 쿠키를 반환받아 저장
		Cookie[] cookies=request.getCookies();
		
		
		if(cookies != null) {//클라이언트에게 전달받은 쿠키가 있는 경우 
			//Cookie 객체 배열에 있는 요소(Cookie 객체)를 차례대로 제공받아 사용하기 위한 반복문
			for(Cookie cookie : cookies) {
				cookie.setMaxAge(0);
				response.addCookie(cookie);//클라이언트에 저장된 기존 쿠키 덮어씌우기 
			}
		}
		
		//HTML 문서 만들어 응답
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>쿠키(Cookie) 삭제</h1>");
		out.println("<hr>");
		out.println("<p>네 안에 쿠키 없다.</p>");
		out.println("<hr>");
		out.println("<p><a href='read.itwill'>쿠키 읽기</a></p>");
		out.println("</body>");
		out.println("</html>");
	}
}