고급자바_Cookie

oungoo·2020년 10월 23일
0

JAVA_고급

목록 보기
19/19

쿠키 ?

  • 서버가 사용자의 웹브라우저에 전송하는 작은 데이터 조각
  • 브라우저는 쿠키를 저장했다가 동일한 서버에 재요청시 저장된 데이터를 함께 전송
  • 두 요청이 동일한 브라우저에서 들어왔는지 아닌지 판단할 때 주로 사용함
  • 하나의 쿠키값은 4KB까지 저장가능
  • 사용자가 따로 요청하지 않아도 브라우저가 Request시 Header에 넣어서 자동으로 서버에 전송

쿠키를 사용하는 이유

  • HTTP 프로토콜의 특징 보완
    Connecetionless(비연결)
    stateless(상태가 없는)
  • 상태가 없는 HTTP 프로토콜에서 상태 정보를 기억시켜 줌

쿠키 구성요소

이름

유효시간(초)

  • 쿠키가 생성된 이후에 사용될 수 있는 기간
  • 유효시간이 경과된 쿠키는 클라이언트에서 자동으로 삭제됨
    => 쿠키를 삭제하려면 유효시간은 0으로 설정하면 됨.
  • 기본 값은 -1 : 웹브라우저를 종료할 때 삭제됨

도메인

  • 도메인은 현재 쿠키가 어떤 서버로 전송되어져야 하는지 지정할 수 있는 속성
  • 지정하지 않으면 생성된 서버로만 전송(기본값)
  • 지정할 수 있는 값 : 현재 서버의 주소 혹은 상위 도메인까지만

쿠키 동작방식

쿠키 생성단계

  • 웹브라우저가 페이지 요청
  • 웹 서버는 쿠키 생성
  • 응답데이터의 헤더에 저장하여 웹브라우저에 전송

쿠키 저장단계

  • 웹브라우저는 응답헤더의 set-Cookie 정보를 읽어 쿠키저장소에 쿠키 보관
  • 쿠키 종류에 따라 메모리나 파일에 저장

쿠키 전송단계

  • 웨브라우저는 저장한 쿠키를 요청이 있을 때마다 웹서버에 전송
  • 웹서버는 브라우저가 전송한 쿠키를 사용하여 필요한 작업을 수행
    : 정보 변경이 필요하면 쿠키 업데이트 후 응답과 함께 변경된 쿠키 전송

쿠키 생성

1. 쿠키 객체 생성

Cookie cookie = new Cookie("이름(key)", "값(value)");

  • 사용불가 문자
    공백, [ ] ( ) = , " / ? @ : ;
  • 사용불가 문자를 제외한 나머지 출력가능한 아스키 문자 사용 가능
    => 이외의 값(ex.한글)을 사용시에는 URLEncoder.encode() 사용하여 인코딩 처리
Cookie userId = new Cookie("userId", req.getParameter("userId");

Cookie name = new Cookie("name", URLEncoder.encode(req.getParameter("name"), "UTF-8"));

2. 쿠키 최대지속시간 설정(초단위)

cookie.setMaxAge(초)

  • 지정하지 않으면 브라우저를 종료할 때 쿠키를 함께 삭제
userId.setMaxAge(60*60*24);  => 1일
name.setMaxAge(60*60*48);  => 2

3. 응답헤더에 쿠키객체 추가

resp.addCookie(cookie);

resp.addCookie(userId);
resp.addCookie(name);

쿠키 생성 예제 ~~(P16_T06)~~

private void setCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
	// 쿠키 생성하기 
	Cookie userId = new Cookie("userId", req.getParameter("userId"));
	// 쿠키값에 한글을 사용시 인코딩 처리를 해준다.
	Cookie name = new Cookie("name", URLEncoder.encode(req.getParameter("name"),"UTF-8"));
	// URL인코더로 인코딩하면 모양이 %로 되있음 (%16진수 %16진수 .. )그래서 다른말로 퍼센트인코딩이라고도 함

	// 쿠키 소멸 시간 설정 (초단위) => 지정하지 않으면 웹브라우저를 종료할 때 쿠키를 함께 삭제한다.
	userId.setMaxAge(60*60*24);  // 1일
	name.setMaxAge(60*60*48);    // 2일
	// 응답헤더에 쿠키 추가하기 
	resp.addCookie(userId);
	resp.addCookie(name);
	// 응답헤더에 인코딩 및 Content-Type 설정
	resp.setCharacterEncoding("UTF-8");
	resp.setContentType("text/html");
	PrintWriter out = resp.getWriter();
	String title = "쿠키설정 예제";
	out.println("<!DOCTYPE html>\n"
			+ "  <html>\n"
			+ "     <head>\n"
			+ "        <title>" + title + "</title>"
			+ "     </head>\n"
			+ "     <body>"
			+ "        <h1 align=\"center\">" + title + "<h1>\n"
			+ "           <ul>\n "
			+ "             <li><b>ID</b>: "
			+                   req.getParameter("userId") + "</li>\n"
			+ "             <li><b>이름</b>: "
			+                   req.getParameter("name") + "</li>\n"
			+ "           </ul>\n"
			+ "     </body>"
			+ "  </html>");
}



쿠키 정보 읽기

쿠키 정보읽기 예제 ~~(P16_T06)~~

private void readCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
	Cookie cookie = null;
	// 현재 도메인에서 사용중인 쿠키정보배열 가져오기
	Cookie[] cookies = req.getCookies();
	
	// 응답헤더에 인코딩 및  Content-Type 설정
	resp.setCharacterEncoding("UTF-8");
	resp.setContentType("text/html");
	
	PrintWriter out = resp.getWriter();
	String title = "쿠키정보 읽기 예제";
	
	out.println("<!DOCTYPE html>\n"
			+ "<html>\n"
			+ "<head><title>" + title + "</title></head>\n"
			+ "<body>\n");
	if(cookies != null) {
		out.println("<h2>" + title + "</h2>");
		for(int i = 0 ; i < cookies.length ; i++) {
			cookie = cookies[i];
			out.println("name : " + cookie.getName() + "<br>");
			out.println("value : " + URLDecoder.decode(cookie.getValue(),"UTF-8") + "<br>");
			out.println("<br>");
		}
	}else {
		out.println("<h2> 쿠키정보가 없습니다.<h2>");
	}
	out.println("</body>");
	out.println("</html>");
}

쿠키 삭제

  1. 사용중인 쿠키 정보를 이용하여 쿠키 생성
  2. 쿠키객체의 최대 지속시간을 0으로 설정
  3. 설정한 쿠키객체를 응답헤더에 추가하여 전송

쿠키 삭제 예제 ~~(P16_T06)~~

private void deleteCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
	Cookie cookie = null;
		
	// 현재 도메인에서 사용중인 쿠키정보배열 가져오기
	Cookie[] cookies = req.getCookies();
	
	// 응답헤더에 인코딩 및 Content_Type 설정
	resp.setCharacterEncoding("UTF-8");
	resp.setContentType("text/html");
	
	PrintWriter out = resp.getWriter();
	String title = "쿠키정보 삭제 예제";
	
	out.println("<!DOCTYPE html>\n"
			+ "  <html>\n"
			+ "     <head>"
			+ "        <title>" + title + "</title>"
			+ "     </head>\n"
			+ "     <body>\n");
	if(cookies != null) {
		out.println("<h2>" + title + "</h2>");
		for(int i = 0 ; i < cookies.length ; i++) {
			cookie = cookies[i];
			
			if(cookie.getName().equals("userId")) {
				// 쿠키 제거하기
				cookie.setMaxAge(0);
				resp.addCookie(cookie);
				out.println("삭제한 쿠키 : " + cookie.getName() + "<br>");
			}
			out.print("name : " + cookie.getName() + ", ");
			out.print("value : " + URLDecoder.decode(cookie.getValue(),"UTF-8"));
			out.println("<br>");
		}
	}else {
		out.println("<h2> 쿠키정보가 없습니다.<h2>");
	}		
	out.println("</body>");
	out.println("</html>");
}

참고

  • 쿠키
    https://dololak.tistory.com/543
  • 쿠키 동작방식
    https://medium.com/@duddk1551/web-%EC%BF%A0%ED%82%A4-cookie-%EC%99%80-%EC%84%B8%EC%85%98-session-36ca55b4aa01

0개의 댓글