반응형
1. 쿠키란?
- 클라이언트의 상태 정보를 유지하기 위한 기술 (클라이언트의 상태 정보를 클라이언트에 저장함)
- 상태 정보를 클라이언트(주로 웹 브라우저)에 key(키)와 value(값) 형태로 저장했다가, 요청 시 저장된 쿠키를 함께 전송 → 웹 서버는 웹 브라우저가 전송한 쿠키로부터 필요한 데이터를 읽어올 수 있음
*제약 조건
- 3000개까지 만들 수 있음
- 쿠키 하나의 최대 크기는 4096바이트(=약 1.2MB)
- 하나의 호스트나 도메인에서 최대 50개까지 만들 수 있음
2. 동작 메커니즘
*여기서 ‘요청’과 ‘응답’은 일반적인 HTTP 요청과 응답을 말함
*쿠키는 요청/응답에 부가적으로 실려 전달되는 데이터
*쿠키가 처음 만들어진 시점에는 서버가 아직 쿠키를 읽을 수 없음
→ 다음 번 요청 때부터 클라이언트가 전송해주기 때문
→ 페이지를 새로 고치거나 다시 접속해야 서버가 쿠키를 읽고 활용 가능
- 클라이언트가 서버에 요청을 보냄
- 서버가 쿠키를 생성하여 HTTP 응답 헤더에 실어 클라이언트에 전송
- 클라이언트는 쿠키를 받아 저장해 둠(쿠키가 클라이언트에만 저장되어 있어 서버는 아직 쿠키 이용 불가)
- 클라이언트는 다음 번 요청 시 저장해 둔 쿠키를 HTTP 요청 헤더에 실어 보냄
- 서버는 쿠키의 정보를 읽어 필요한 작업을 수행
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>
- 이름 “myCookie” 값 “쿠키맛나요”인 쿠키 생성 후, 경로와 유지 시간을 설정해서 응답 헤더에 쿠키 추가
- 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>
- 쿠키를 배열로 얻어와서 하나씩 출력(일반 for문 사용-확장 for문과는 다르게 배열의 인덱스를 사용해야 하므로 코드가 좀 더 복잡함
- CookieMain.jsp 최초 실행 결과: 1.에서 생성한 “myCookie”가 보이지 않음 → 쿠키는 생성 직후에 사용할 수 없기 때문
- CookieMain.jsp 페이지에서 “다음 페이지에서 쿠키값 확인하기” 클릭: 1.에서 생성한 “myCookie”가 보임
→ CookieResult.jsp 페이지에서 뒤로가기 버튼을 누르면, CookieMain.jsp 페이지에서도 쿠키값을 확인할 수 있다
반응형
'자바(JAVA) > JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)' 카테고리의 다른 글
JAVA/JSP 12. 쿠키(Cookie) - 로그인 아이디 저장(편의 기능 구현하기: 자바스크립트 코드 추가, 쿠키 관리자) (0) | 2023.06.08 |
---|---|
JAVA/JSP 11. 쿠키(Cookie) - 레이어 팝업창 제어 (0) | 2023.05.27 |
JAVA/JSP 9. 내장 객체의 영역(Scope) - session 영역, application 영역 (2) | 2023.05.03 |
JAVA/JSP 8. 내장 객체의 영역(Scope) - page 영역, request 영역 (0) | 2023.04.30 |
JAVA/JSP 7. 내장 객체의 영역(Scope) - 정의, 데이터 전송 객체(DTO) 준비 (0) | 2023.04.15 |