백엔드/JSP

JSP Servlet 기초 (6) : Cookie

두개의 문 2023. 6. 12. 23:29
쿠키(Cookie)

 

▷ 쿠키 : 클라이언트의 상태 정보를 유지하기 위한 기술

  - 상태 정보를 클라이언트( 주로 웹 브라우저 )에 key와 value 값 형태로 저장했다가 다음 요청 시, 저장된 쿠키를 함께 전송

  - 웹 서버는 브라우저가 전송한 쿠키로부터 필요한 데이터를 읽어들임

  - 쿠키 표준(RFC 6265)

    · 3000개까지 만들 수 있음 

    · 쿠키 하나의 최대 크기는 4096바이트

    · 하나의 호스트나 도메인에서 최대 50개까지 만들 수 있음

  - 쿠키로 저장할 수 있는 최대 용량은 대략 1.2MB

     모든 브라우저가 표준을 그대로 따르지는 않으며, 대부분 이보다 적은 수만 지원

 

 

▷ 동작 메커니즘

❶ 클라이언트가 서버에 요청

서버가 쿠키 생성 → HTTP 응답 헤더에 실어 클라이언트에 전송

❸ 클라이언트는 쿠키를 받아 저장

    ( 이 시점에는 쿠키가 클라이언트에만 저장된 상태이므로 서버는 아직 쿠키를 사용할 수 없음 )

❹ 클라이언트는 다음 번 요청 시, 저장해둔 쿠키를 HTTP 요청 헤더에 실어 보냄

❺ 서버는 쿠키의 정보를 읽어 필요한 작업을 수행

 

 

▷ 쿠키를 구성하는 속성

  - 이름(name) : 쿠키를 구별하는 이름

  - 값(value) : 쿠키에 저장할 실제 데이터

  - 도메인(domain) : 쿠키에 적용할 도메인

  - 경로(path) : 쿠키를 적용할 경로

  - 유지 기간(max age) : 쿠키를 유지할 기간

 

 

▷ 설정 메서드 

  - void setValue(String value) : 쿠키의 값을 설정

  - void setDomain(String Domain) : 쿠키에 적용할 도메인을 설정

  - void setPath(String path) : 쿠키가 적용될 경로를 지정

  - void setMaxAge(int expire_seconds) : 쿠키가 유지될 기간을 초 단위로 설정

 

▷ 쿠키의 이름은 생성자를 통해 설정

  : new Cookie(String name, String value) : 이름과 값을 받아 새로운 쿠키를 생성 

 

▷ 쿠키 정보를 읽는 메서드

  - String getName( ) : 쿠키의 이름을 반환

  - String getValue( ) : 쿠키의 값을 반환

  - String getDomain( ) : 쿠키가 적용되는 도메인을 반환

  - String getPath( ) : 쿠키의 적용 경로를 반환. ( 단, setPath( )로 설정한 적이 없다면 null을 반환 )

  - int getMaxAge( ) : 쿠키의 유지 기간을 반환. ( 단, setMaxAge( )로 설정한 적이 없다면 -1을 반환 )

 

< 요약 >
 - 쿠키는 생성자를 통해서만 생성할 수 있음 
   생성 후 쿠키 값은 변경할 수 있으나 쿠키 이름은 변경 불가
 - setPath( ) 메서드로 적용할 경로를 설정
 - setMaxAge( ) 메서드로 쿠키의 유지 기간을 설정
 - response 내장 객체의 addCookie( ) 메서드로 클라이언트에 쿠키를 저장

 

 

※ 앞으로 JSP 작업을 할 때 <!DOCTYPE html>를 기준으로 나누자

   ① 처리 영역 : Java 코드

   ② View 영역 : 표현식 / 일반 <html> 코드 / 출력 부분 등

 

 

▷ cookieset.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
// 처리 영역 
	// ① 서버에서 쿠키 생성 : 생성자 이용 
	Cookie cookie = new Cookie("cookieName", "cookieValue");
	// ② 쿠키의 만료시간 설정 : setMaxAge( 초 * 분 )
	cookie.setMaxAge(60 * 10); // 만료시간 : 10분 
	// ③ response 객체에 저장 : addCookie(생성된쿠키객체)
	//    → response 객체가 웹 브라우저로 전송되면 
	//      웹 브라우저의 쿠키 저장공간에 파일이 생성됨 
	response.addCookie(cookie);
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- 위에서 생성한 쿠키의 내용을 읽어오는 스크립트 링크 연결 --%>
<a href="cookieget.jsp">쿠키 읽어오기</a>
</body>
</html>

 

 

▷ cookieget.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<% 
	// 쿠키 읽어오는 처리
	// ① 생성된 쿠키를 배열로 읽기 ( 생성된 쿠키가 여러 개라는 가정 )
	Cookie[] cookies = request.getCookies();
	// ② 읽어온 쿠키 출력 : 루프 이용
	for (int i = 0; i < cookies.length; i++){
		// ②-❶ i번째 쿠키의 key이름 가져오기
		String str = cookies[i].getName();
		// ②-❷ str에 저장되어 있는 쿠키 중에 cookieName이 있는지 비교
		if (str.equals("cookieName")){
			out.println(
					"cookie[" + i + "] name : " +
					cookies[i].getName());
			out.println(
					"cookie[" + i + "] value : " + 
					cookies[i].getValue());
		}
	}
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<br />
	<a href="cookiedelete.jsp">쿠키 삭제하기</a>
</body>
</html>

 

 

▷ cookiedelete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 쿠키 삭제 구현 : 쿠키의 만료시간을 0초로 설정하자
	// ① 현재 request 객체의 모든 쿠키 읽기
	Cookie[] cookies = request.getCookies();
	//② 읽어온 쿠키 출력 : 루프 이용
	for (int i = 0; i < cookies.length; i++){
		// 원하는 쿠키만 삭제해보자
		// ②-❶ i번째 쿠키의 key이름 가져오기 
		String str = cookies[i].getName();
		// ②-❷ 실제 삭제할 쿠키의 key이름인지 비교
		if(str.equals("cookieName")){
			// 쿠키 삭제하기 전에 쿠키 내용 출력
			out.println("쿠키의 이름 : " + cookies[i].getName() + "<br />");
			// 이제 해당 쿠키를 삭제해보자
			cookies[i].setMaxAge(0);
			// 삭제된 쿠키(만료 설정된 쿠키)를 다시 request 객체에 추가
			response.addCookie(cookies[i]);
		}	
	}
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<br />
	<a href="cookietest.jsp">쿠키 확인하기</a>
</body>
</html>

 

 

▷ cookietest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 삭제된 쿠키 확인
	// ① 현재 request 객체의 모든 쿠키 읽기
	Cookie[] cookies = request.getCookies();
    //② 읽어온 쿠키 출력 : 루프 이용
	for(int i = 0; i < cookies.length; i++){
		out.println(
				"cookies[" + i + "] name : " +
				cookies[i].getName());
		out.println(
				"cookies[" + i + "] value : " + 
		 		cookies[i].getValue());
	}
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<br />
	<a href="cookieset.jsp">쿠키 생성하기</a>
	<a href="cookieget.jsp">쿠키 가져오기</a>
	<a href="cookiedelete.jsp">쿠키 삭제하기</a>
</body>
</html>

 

 

▶ 직접 서버에 cookieset.jsp 요청해보자.

 

 

 

- 개발자 도구에서 삭제되는 과정 확인하기