학습 목표
· 쿠키란?
· 쿠키 생성하기
· 쿠키의 구성
· 쿠키 값 읽어오기
· 쿠키 값 변경 및 쿠키 삭제
· 쿠키 도메인
· 쿠키의 경로
· 쿠키 유효시간
· 쿠키와 헤더
· 쿠키 처리를 위한 유틸리티 클래스
쿠키란?
· 쿠키(cookie): 웹 브라우저가 보관하는 데이터
· 웹 브라우저는 웹 서버에 요청을 보낼 때 쿠키를 함께 전송, 웹 서버는 쿠키를 사용해 필요한 데이터를 읽을 수 있음
· 쿠키는 웹 서버와 웹 브라우저 양쪽에서 생성 가능
· JSP에서 생성하는 쿠키는 웹 서버에서 생성하는 쿠키
· 쿠키 동작 방식
1. 쿠키 생성: JSP 프로그래밍에서 쿠키는 웹 서버 측에서 생성,
생성한 쿠키를 응답 데이터 헤더에 저장해서 웹 브라우저에 전송
2. 쿠키 저장: 웹 브라우저는 응답 데이터에 포함된 쿠키를 쿠키 저장소에 보관,
쿠키의 종류에 따라 메모리나 파일에 저장
3. 쿠키 전송: 웹 브라우저는 저장한 쿠키를 요청이 있을 때마다 웹 서버에 전송,
웹 서버는 해당 쿠키를 사용해서 필요한 작업 수행
· 웹 브라우저에 쿠키가 생성되면, 웹 브라우저는 쿠키가 삭제되기 전까지 웹 서버에 쿠키를 전송함
- 웹 어플리케이션을 사용하는 동안 지속적으로 유지해야 하는 정보를 쿠키를 사용해서 저장하기
쿠키의 구성
· 이름: 각각의 쿠키를 구별하는 데 사용 (웹 브라우저는 여러 개의 쿠키를 가질 수 있음)
- 쿠키 이름은 콤마, 세미콜론, 공백, 등호기호('=')를 제외한 출력 가능한 아스키 문자로 구성
· 값: 쿠키의 이름과 관련된 값
- 서버는 값을 사용해서 원하는 작업 수행
- 쿠키 값은 콤마, 세미콜론, 공백 문자를 제외한 나머지 출력 가능한 아스키 문자를 사용
- 값으로 사용 가능한 문자가 한정되므로 쿠키 값을 생성할 때는 알맞은 방식으로 인코딩함
ex) 자바는 URL 인코딩을 사용해 쿠키 값으로 사용할 문자열을 변환 가능
· 유효시간: 쿠키의 유지 시간
- 별도 유효 시간을 지정하지 않으면 웹 브라우저를 종료할 때 쿠키를 함께 삭제함
· 도메인: 쿠키를 전송할 도메인
· 경로: 쿠키를 전송할 요청 경로
쿠키 생성하기
· JSP는 Cookie 클래스를 사용하여 쿠키를 생성함
<%
Cookie cookie = new Cookie("cookieName","cookieValue");
response.addCookie(cookie);
%>
· Cookie 클래스 생성자의 첫 번째 인자는 쿠키 이름, 두 번째 인자는 쿠키 값을 의미
· response 기본 객체에 addCookie() 메서드를 사용하여 쿠키를 추가
- reponse 기본 객체는 웹 브라우저에 쿠키 정보를 전송
▶ 예시 - 쿠키 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "java.net.URLEncoder"%>
<%
Cookie cookie = new Cookie("name", URLEncoder.encode("Ted", "utf-8"));
response.addCookie(cookie);
%>
<html>
<head><title>쿠키생성</title></head>
<body>
<%= cookie.getName() %> 쿠키의 값 ="<%=cookie.getValue() %>"
</body>
</html>
· Cookie 클래스가 제공하는 메서드
메서드 | 리턴 타입 | 설명 |
getName() | String | 쿠키 이름 가져오기 |
getValue() | String | 쿠키 값 가져오기 |
setValue(String value) | void | 쿠키 값 지정 |
setDomain(String pattern) | void | 쿠키가 전송될 서버의 도메인 지정 |
getDomain() | String | 쿠키의 도메인 가져오기 |
setPath(String uri) | void | 쿠키를 전송할 경로 지정 |
getPath() | String | 쿠키 전송 경로 가져오기 |
setMaxAge(int expiry) | void | · 쿠키의 유효시간을 초 단위로 지정 · 음수를 입력할 경우 웹 브라우저를 닫을 때 쿠키가 함께 삭제 |
getMaxAge() | int | 쿠키 유효시간 가져오기 |
쿠키 값 읽어오기
· 웹 브라우저는 요청 헤더에 쿠키를 저장해서 보내고,
JSP는 request 기본 객체의 getCookies() 메서드로 쿠키 값을 읽음
Cookie[] cookies = request.getCookies();
· 쿠키가 존재하지 않으면 null을 리턴
<%@ page contentType = "text/html; charset=utf-8" %>
<%@page import="java.net.URLDecoder"%>
<html>
<head>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0)
for(Cookie cookie : cookies){
String cookieName = cookie.getName();
String cookieValue = URLDecoder.decode(cookie.getValue(), "UTF-8");
%>
<h1>쿠키이름 - <%= cookieName %>, 쿠키 값 - <%= cookieValue %> </h1>
<%
}
%>
</body>
</html>
쿠키 값 변경 및 쿠키 삭제
· 쿠키 값 변경 방법: 같은 이름을 가진 쿠키 객체를 생성하여 응답 데이터에 추가
Cookie cookie = new Cookie("name",URLEncoder.encode("새로운값","euc-kr"));
response.addCookie(cookie);
· 쿠키 존재를 확인하는 코드
Cookie[] cookies = request.getCookies();
if(cookies != null && cokies.length > 0{
for(int i = 0; i < cookies.length; i++){
if(cookies[i].getName().equals("name")){
Cookie cookie = new Cookie("name", URLEncoder.encode("변경할값", " utf-8"));
response.addCookie(cookie);
}
}
}
· 쿠키 삭제 방법: 유효시간을 0으로 지정한 후 응답 헤더에 추가
Cookie cookie = new Cookie(name, value);
cookie.setMaxAge(0);
response.addCookie(cookie);
쿠키 도메인
· setDomain() 메서드: 생성한 쿠키를 전송할 수 있는 도메인을 지정
- .somehost.com: 점으로 시작하는 경우 관련 도메인에 모두 쿠키 전송 ex) mail.somehost.com, www.somehost.com, javacan.somehost.com
- www.somehost.com:특정 도메인에 대해서만 쿠키 전송
· 주의! 도메인을 지정할 때 setDomain()의 값으로 현재 서버의 도메인 및 상위 도메인만 전달 가능
- 이외의 도메인을 전달하면, 웹 브라우저는 쿠키를 저장하지 않음
ex) JSP페이지가 실행되는 서버의 주소가 mail.somehost.com 일 경우 setDomain() 메서드에 "mail.somehost.com", ".somehost.com"만 전달 가능. "www.somehost.com"은 불가능
▶ 예시
Cookie cookie = new Cookie("name", "Ted");
cookie.setDomain(".somehost.com");
response.addCookie(cookie);
쿠키의 경로
· Cookie 클래스의 setPath() 메서드로 쿠키를 공유할 기준 경로를 지정
· 경로: URL에서 도메인 이후의 부분
ex) http://localhost:8080/chap09/path2/viewCookies.jsp 에서 /chap09/path2/viewCookies.jsp가 경로
· 쿠키는 디렉터리 수준 경로를 사용하여 위에서는 "/", "/chap09", "/chap09/path2" 등을 쿠키 경로로 사용 가능
· setPath() 메서드를 사용하여 쿠키의 경로를 지정하면, 웹 브라우저는 지정한 경로 또는 하위 경로에 대해서만 쿠키를 전송함
▶ 예시 - /ch09/path1/setCookieWIthPath.jsp에 생성되는 쿠키
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="java.net.URLEncoder" %>
<%
Cookie cookie1 = new Cookie("path1", ":/chap09/path1");
cookie1.setPath("/ch09/path1");
response.addCookie(cookie1);
Cookie cookie2 = new Cookie("path2",":");
response.addCookie(cookie2);
Cookie cookie3 = new Cookie("path3", ":/");
cookie3.setPath("/");
response.addCookie(cookie3);
Cookie cookie4 = new Cookie("path4", ":/chap09/path2");
cookie4.setPath("/ch09/path2");
response.addCookie(cookie4);
%>
<html>
<head>
<title>쿠키 경로 지정</title>
</head>
<body>
다음과 같이 쿠키를 생성했습니다. <br>
<%= cookie1.getName()%>=<%=cookie1.getValue()%>
[<%= cookie1.getPath()%>]
<br>
<%=cookie2.getName()%>=<%=cookie2.getValue()%>
[<%=cookie2.getPath()%>]
<br>
<%=cookie3.getName()%>=<%=cookie3.getValue()%>
[<%=cookie3.getPath()%>]
<br>
<%=cookie4.getName()%>=<%=cookie4.getValue()%>
[<%=cookie4.getPath()%>]
</body>
</html>
· 쿠키에 경로를 지정하지 않으면, 실행한 URL의 경로 부분을 사용함
· "path2" 쿠키는 /chap09/path1 경로를 기준으로 전송
쿠키 유효시간
· 쿠키에 유효시간을 정해 놓으면 그 유효시간 동안 쿠키가 존재하며,
웹 브라우저를 종료해도 유효시간이 지나지 않았으면 쿠키를 삭제하지 않음
· 유효시간을 지정하지 않으면 웹 브라우저를 종료할 때 쿠키를 함께 삭제함
· JSP에서는 setMaxAge() 메서드를 사용하여 초 단위로 유효 시간을 지정함
Cookie cookie = new Cookie(name, value);
cookie.setMaxAge(60*60); //60초 * 60 = 1시간
response.addCookie(cookie);
쿠키와 헤더
· response.addCookie() 메서드로 쿠키를 추가하면, Set-Cookie 헤더를 통해 전달됨
쿠키이름=쿠기값; Domain=도메인값; Path=경로값; Expires=GMT형식의만료일시
* GMT: 그리니티 평균시 (https://ko.wikipedia.org/wiki/그리니치_평균시)
· 한 개의 Set-Cookie 헤더는 한 개의 쿠키 값을 전달함
· 쿠키는 응답 헤더를 사용해서 웹 브라우저에 전달하므로, 출력 버퍼를 플러시하기 전에 추가해야함
쿠키 처리를 위한 유틸리티 클래스
▶ 예시 - 쿠키를 편리하게 사용할 수 있도록 도와주는 보조 유틸리티 클래스
package util;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Map;
public class Cookies {
private Map<String, Cookie> cookieMap = new java.util.HashMap<String, Cookie>();
public Cookies(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(int i = 0; i < cookies.length; i++){
cookieMap.put(cookies[i].getName(), cookies[i]);
}
}
}
public Cookie getCookie(String name){
return cookieMap.get(name);
}
public String getValue(String name) throws IOException{
Cookie cookie = cookieMap.get(name);
if(cookie == null){
return null;
}
return URLDecoder.decode(cookie.getValue(), "euc-kr");
}
public boolean exists(String name){
return cookieMap.get(name) != null;
}
public static Cookie createCookie(String name, String value) throws IOException{
return new Cookie(name, URLEncoder.encode(value, "utf-8"));
}
public static Cookie createCookie(String name, String value, String path, int maxAge) throws IOException{
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "utf-8"));
cookie.setPath(path);
cookie.setMaxAge(maxAge);
return cookie;
}
public static Cookie createCookie(String name, String value, String domain, String path, int maxAge) throws IOException{
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "utf-8"));
cookie.setDomain(domain);
cookie.setPath(path);
cookie.setMaxAge(maxAge);
return cookie;
}
}
출처
최범균의 JSP 2.3 웹 프로그래밍: 기초부터 중급까지
'백엔드 > JSP & Servlet' 카테고리의 다른 글
[Servlet] ServletContextListener란? (0) | 2021.10.05 |
---|---|
[JSP] Model 1 아키텍처와 Model 2 아키텍처, MVC 패턴 (0) | 2021.10.04 |
[Servlet] 서블릿(Servlet)을 이해하고, 구현해보자 (0) | 2021.10.04 |
[JSP] JSP와 세션(Session) (0) | 2021.10.04 |
[JSP] JSP 동작과 처리 과정 (0) | 2021.10.02 |
댓글