쿠키

서현서현·2022년 5월 10일
0

서블릿 & JSP

목록 보기
12/26
💡 Http의 한계는 stateless(작업끝날때마다 연결끊음, 따라서 같은 사람이들어와도 매번 새로운 사람으로 인식). 따라서 사용자 정보를 브라우저에 저장해 두려고한다 ⇒ 쿠키!

쿠키

  • 하이퍼 텍스트의 기록서(HTTP)의 일종으로서 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일을 일컫는다.
  • 웹 서버가 브라우저에게 지시하여 사용자의 로컬 컴퓨터에 파일 또는 메모리에 저장하는 작은 기록 정보 파일입니다.
  • 파일에 담긴 정보는 인터넷 사용자가 같은 웹사이트를 방문할 때마다 읽히고 수시로 새로운 정보로 바뀔 수 있습니다.
  • 사용자 입장에서는 세션을 유지할 수 있고(한번 방문한 사이트의 로그인 상태, 검색기록 유지, 사이트의 환경설정 저장)
  • 사이트 입장에서는 사용자에 대한 정보를 획득할 수 있고 웹사이트 개선에 도움을 준다.

구성요소

  • 이름
  • 유효시간(초)
  • 도메인 : (ex) www.somehost.com, .somehost.com ⇒ 쿠키의 도메인이 쿠키를 생성한 서버의 도메인을 벗어나면 브라우저는 쿠키를 생성(저장)하지 않는다. (보안상의 문제)
  • 경로 : 쿠키를 공유할 기준경로를 지정한다. (도메인 이후부분으로 디렉토리 수준) ⇒ 지정하지 않으면 실행한 URL의 경로부분이 사용됨.

동작방식

  • 쿠키 생성단계 : 생성한 쿠키를 응답데이터의 헤더에 저장하여 웹브라우저에 전송한다.
  • 쿠키 저장단계 : 웹브라우저는 응답데이터에 포함된 쿠키를 쿠키저장소에 보관한다. (쿠키 종류에 따라 메모리나 파일에 저장함)
  • 쿠키 전송단계 : 웹브라우저는 저장한 쿠키를 요청이 있을때마다 웹서버에 전송한다 (삭제 전까지..) 웹서버는 브라우저가 전송한 쿠키를 사용해서 필요한 작업을 수행한다

사용자 요청 라이프 사이클

💡 사용자의 요청이 일어났을 때 하나의 라이프 사이클을 보면
  1. 사용자가 서블릿에 대한 링크를 클릭한다.(HTTP 요청)
  2. 컨테이너는 들어온 요청에 대해서 HttpServletRequest와 HttpServletResponse를 생성
  3. 사용자가 보낸 URL를 분석해서 어떤 서블릿에 대한 요청인지 알아내고 스레드에 서블릿을 할당해서 실행하고 Request와 Response를 인자로 넘깁니다.
  4. 컨테이너는 서블릿 Service()를 호출하고 Http메서드에 따라 doGet(), doPost()등을 호출
  5. 그러면 서블릿은 요청 처리에 대한 응답을 생성해서 Response객체와 같은 곳에 실어서 응답을 보냅니다.

쿠키정보를 다루기 위한 예제

쿠키정보 생성 예제

웹서버와 브라우저는 애플리케이션을 사용하는 동안 필요한 값을 쿠키를 통해 공유하여 상태를 유지한다.

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

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

public class T05_ServletCookieTest extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		setCookieExam(req,resp); //쿠키 생성 예제
	}
	
	private void setCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		/* 쿠키정보 설정하는 방법
			
			1. 쿠키 객체를 생성한다. 사용불가문자(공백, [] () =, " / ? @ : ; )
			Cookie cookie = new Cookie("키값", "value값");
			쿠키값은 사용불가문자를 제외한 나머지 출력가능한 아스키문자 사용 가능
			=> 이외의 값 (예를들면 한글)을 사용시에는 URLEncoding.encode() 사용하여 인코딩 처리를 해야한다.
			
			2. 쿠키 최대 지속시간을 설정한다(초단위)
			=> 지정하지 않으면 웹브라우저를 종료할 때 쿠키를 함께 삭제한다.
				cookie.setMaxAge(60 * 60 ^ 24); // 24시간
			
			3. 응답헤더에 쿠키 객체를 추가한다.
			resp.addCookie(cookie);
			=> 출력버퍼가 플러시 된 이후에는 쿠키를 추가할 수 없다
				(응답 헤더를 통해서 웹브라우저에 전달하기 때문에)
		*/
		
		req.setCharacterEncoding("UTF-8");
		
		// 쿠키 생성하기
		Cookie userId = new Cookie("userId",req.getParameter("userId"));
		// 쿠키값에 한글을 사용시 인코딩 처리를 해준다
		Cookie name = new Cookie("name",URLEncoder.encode(req.getParameter("name"),"UTF-8"));
		// 쿠키 소멸시간 설정 (초단위)
		userId.setMaxAge(60*60*24); //1일
		userId.setHttpOnly(true); // javascript를이용한 직접접근 방지
		
		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><html><head><title>"+title+"</title>"
						+"</head><body>"+"<h1 align=\"center\">"+title+"</h1>"
						+"<ul>"
						+"<li><b>ID</b>:"+req.getParameter("userId")+"</li>"
						+"<li><b>이름</b>:"+req.getParameter("name")+"</li>"
						+"</ul></body></html>");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}
<servlet>
		<servlet-name>T05_SCT</servlet-name>
		<servlet-class>kr.or.ddit.basic.T05_ServletCookieTest</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>T05_SCT</servlet-name>
		<url-pattern>/T05_SCT</url-pattern>
	</servlet-mapping>

url인코더로 인코딩해서 퍼센트인코딩

쿠키 정보 읽기 예제

public class T05_ServletCookieTest extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//setCookieExam(req,resp); // 쿠키 생성 예제
		
		readCookieExample(req,resp); // 쿠키 정보 읽기 예제
	}
	
	private void readCookieExample(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		
		// 현재 도메인에서 사용중인 쿠키정보 배열 가져오기
		Cookie[] cookies = **req.getCookies();**
		
		// 응답헤더에 인코딩 및 content type 설정
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
		
		PrintWriter out = resp.getWriter();
		String title = "쿠키정보읽기예제";
		
		out.println("<!doctype html><html><head><title>"+title+"</title></head><body>");
		
		if(cookies != null) {
			out.println("<h2>"+title+"</h2>");
			
			for(Cookie cookie : cookies) {
				out.print("name : "+cookie.getName()+"</br>");
				out.print("value : "+URLDecoder.decode(cookie.getValue(),"UTF-8")+"</br>");
				out.print("<hr>");
			}
		}else {
			out.println("<h2>쿠키정보가 없습니다.</h2>");
		}
		out.println("</body");
		out.println("</html>");
		
		
	}

}

위에서 쿠키를 넣어뒀으므로 이렇게 뜨는것

쿠키삭제

< 사용중인 쿠키정보를삭제하는 방법 >

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

0개의 댓글