자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 10. 쿠키(Cookie) - 정의, 기본 동작 확인

개발학생 2023. 5. 18. 23:07
반응형

1. 쿠키란?

  • 클라이언트의 상태 정보를 유지하기 위한 기술 (클라이언트의 상태 정보를 클라이언트에 저장함)
  • 상태 정보를 클라이언트(주로 웹 브라우저)에 key(키)와 value(값) 형태로 저장했다가, 요청 시 저장된 쿠키를 함께 전송 → 웹 서버는 웹 브라우저가 전송한 쿠키로부터 필요한 데이터를 읽어올 수 있음

*제약 조건

  1. 3000개까지 만들 수 있음
  2. 쿠키 하나의 최대 크기는 4096바이트(=약 1.2MB)
  3. 하나의 호스트나 도메인에서 최대 50개까지 만들 수 있음

2. 동작 메커니즘

*여기서 ‘요청’과 ‘응답’은 일반적인 HTTP 요청과 응답을 말함

*쿠키는 요청/응답에 부가적으로 실려 전달되는 데이터

*쿠키가 처음 만들어진 시점에는 서버가 아직 쿠키를 읽을 수 없음
  → 다음 번 요청 때부터 클라이언트가 전송해주기 때문
  → 페이지를 새로 고치거나 다시 접속해야 서버가 쿠키를 읽고 활용 가능

  1. 클라이언트가 서버에 요청을 보냄
  2. 서버가 쿠키를 생성하여 HTTP 응답 헤더에 실어 클라이언트에 전송
  3. 클라이언트는 쿠키를 받아 저장해 둠(쿠키가 클라이언트에만 저장되어 있어 서버는 아직 쿠키 이용 불가)
  4. 클라이언트는 다음 번 요청 시 저장해 둔 쿠키를 HTTP 요청 헤더에 실어 보냄
  5. 서버는 쿠키의 정보를 읽어 필요한 작업을 수행

3. 속성과 API

1) 쿠키를 구성하는 속성들

  • 이름(name): 쿠키를 구별하는 이름
  • 값(value): 쿠키에 저장할 실제 데이터
  • 도메인(domain): 쿠키를 적용할 도메인
  • 경로(path): 쿠키를 적용할 경로
  • 유지 기간(max age): 쿠키를 유지할 기간

2) 쿠키의 속성들을 설정하고 읽어오는 메소드

(1) 쿠키 속성을 설정하는 설정 메소드

*이름을 설정하는 setName( )은 없음

  • 쿠키의 이름은 생성자(constructor)를 통해 설정하고, 생성 후에는 더 이상 이름을 변경할 수 없기 때문
    → new Cookie(String name, String value): 이름과 값을 받아 새로운 쿠키를 생성하는 생성자
메소드 이름 설명
void setValue(String value) 쿠키의 값을 설정함(쉼표(,)나 세미콜론(;)을 제외한 모든 문자열 사용 가능)
void setDomain(String domain) 쿠키에 적용할 도메인을 설정함
주 도메인만 적용하고 싶다면 “도메인” 형태로 기술하고, 주 도메인 외에 서브 도메인에도 적용하고 싶다면 “.도메인” 형태로 기술  
(예시: setDomain(”.student.co.kr”)로 설정하면 www.student.co.kr은 물론 phone.student.co.kr에서도 쿠키가 적용됨)  
void setPath(String path) 쿠키가 적용될 경로를 지정함 (지정한 경로와 그 하위 경로에까지 적용됨)
void setMaxAge(int expire_seconds) 쿠키가 유지될 기간을 초 단위로 설정함. (설정하지 않을 경우, 웹 브라우저가 닫힐 때 쿠키도 같이 삭제됨)

(2) 쿠키 정보를 읽는 메소드

메소드 이름 설명
String getName( ) 쿠키의 이름을 반환
String getValue( ) 쿠키의 값을 반환
String getDomain( ) 쿠키가 적용되는 도메인을 반환
String getPath( ) 쿠키의 적용 경로를 반환(setPath 메소드로 설정한 적이 없다면 null 반환)
int getMaxAge( ) 쿠키의 유지 기간 반환(setMaxAge 메소드로 설정한 적이 없다면 -1 반환)

4. 기본 조작법

1) 쿠키 동작 확인

//CookieMain.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
		pageEncoding="UTF-8"%>
<html>
<head><title>Cookie</title></head>
<body>
	<h2>1. 쿠키(Cookie) 설정</h2>
	<%
	//1.(아래 코드 4줄) 
	Cookie cookie = new Cookie("myCookie", "쿠키맛나요");    //쿠키 생성
	cookie.setPath(request.getContentPath());    //2.경로를 컨텍스트 루트로 설정
	cookie.setMaxAge(3600);    //유지 기간 1시간으로 설정
	response.addCookie(cookie);    //응답 헤더에 쿠키 추가
	%>

	<h2>2. 쿠키 설정 직후 쿠키값 확인하기</h2>
	<%
	//3.(아래 if문 전체)
	Cookie[] cookies = request.getCookies();    //4.요청 헤더의 모든 쿠키 얻기
	
	if (cookies != null) {
		for(Cookie c : cookies) {    //5.쿠키 각각의
			String cookieName = c.getName();    //6.쿠키 이름 얻기
			String cookieValue = c.getValue();    //7.쿠키 값 얻기
			out.println(String.format("%s : %s<br/>", cookieName, cookieValue));    //8.화면에 출력
		}
	}
	%>

	<h2>3. 페이지 이동 후 쿠키값 확인하기</h2>
	<a href="CookieResult.jsp">
		다음 페이지에서 쿠키값 확인하기
	</a>
</body>
</html>
  1. 이름 “myCookie” 값 “쿠키맛나요”인 쿠키 생성 후, 경로와 유지 시간을 설정해서 응답 헤더에 쿠키 추가
  2. request 내장 객체의 getContextPath( )로 얻어온 컨텍스트 루트 → 이클립스에서는 프로젝트명이 컨텍스트 루트이므로, “/(프로젝트명)”의 형식으로 반환되어 설정됨 → 웹 애플리케이션 전체에서 쿠키를 사용하겠단 의미
  • 실행 결과: 1.에서 생성한 “myCookie”가 보이지 않음 → 쿠키는 생성 직후에 사용할 수 없기 때문

2) 쿠키값 확인

//CookieResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
		pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<title>CookieResult.jsp</title>
</head>

<body>
	<h2>쿠키값 확인하기(쿠키가 생성된 이후의 페이지)</h2>
	//1.(<% %> 부분 전체)
	<%
	Cookie[] cookies = request.getCookies();
	
	if (cookies != null) {
		for (int i = 0; i < cookies.length; i++) {
			String cookieName = cookies[i].getName();
			String cookieValue = cookies[i].getValue();
			out.println(String.format("쿠키명 : %s - 쿠키값 : %s<br/>",
																cookieName, cookieValue));
	}
	%>
</body>

</html>
  1. 쿠키를 배열로 얻어와서 하나씩 출력(일반 for문 사용-확장 for문과는 다르게 배열의 인덱스를 사용해야 하므로 코드가 좀 더 복잡함
  • CookieMain.jsp 최초 실행 결과: 1.에서 생성한 “myCookie”가 보이지 않음 → 쿠키는 생성 직후에 사용할 수 없기 때문

  • CookieMain.jsp 페이지에서 “다음 페이지에서 쿠키값 확인하기” 클릭: 1.에서 생성한 “myCookie”가 보임
    → CookieResult.jsp 페이지에서 뒤로가기 버튼을 누르면, CookieMain.jsp 페이지에서도 쿠키값을 확인할 수 있다

반응형