쿠키(Cookie)
: 웹 서버가 생성하여 웹 브라우저로 전송하는 작은 정보 파일로 정보가 클라이언트에 저장된다.
웹 서버와 브라우저는 애플리케이션을 사용하는 동안 필요한 값을 쿠키를 통해 공유하여 상태를 유지한다.
ex) 오늘 하루는 열지 않음
1. 구성요소
- 이름
- 값
- 유효시간(초)
- 도메인 : ex) http://www.somehost.com, .somehost.com
- 경로 : 쿠키를 공유할 기준 경로를 지정한다. => 지정하지 않으면 실행한 URL의 경로 부분이 사용된다.
2. 동작 방식
- 쿠키 생성 단계 : 생성한 쿠키를 응답데이터의 헤더에 저장하여 전송한다.
- 쿠키 저장 단계 : 브라우저는 응답메시지에 포함된 쿠키정보를 쿠키 저장소에 보관한다.
- 쿠키 전송 단계 : 브라우저는 저장한 쿠키를 요청이 있을 때마다 웹서버에 전송한다. (삭제되기 전까지...)
웹 서버는 브라우저가 전송한 쿠키를 사용해서 필요한 작업을 수행한다.
쿠키 생성
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>ServletTest</display-name>
<servlet>
<servlet-name>T04ServletCookieTest</servlet-name>
<servlet-class>kr.or.ddit.basic.T04ServletCookieTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>T04ServletCookieTest</servlet-name>
<url-pattern>/T04ServletCookieTest</url-pattern>
</servlet-mapping>
</web-app>
package kr.or.ddit.basic;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
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 T04ServletCookieTest 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 {
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);
userId.setHttpOnly(true); // javascript를 이용한 직접 접근 방지
name.setMaxAge(60 * 60 * 48);
///////////////////////////////////////////////////////
// 응답헤더에 쿠키 추가
resp.addCookie(userId);
resp.addCookie(name);
// 응답 헤더에 인코딩 및 Content-Type 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키설정 예제";
out.print("<!DOCTYPE html><html><head><title>" + title + "</title>");
out.print("</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);
}
}
쿠키 읽기
package kr.or.ddit.basic;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
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 T04ServletCookieTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 쿠키 설정(생성) 하기
// setCookieExam(req, resp);
// 쿠키 읽어오기
readCookieExam(req, resp);
}
private void readCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 현재 도메인에서 사용중인 쿠키정보 배열 가져오기
Cookie[] cookies = req.getCookies();
///////////////////////////////////////////////
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키정보 읽기 예제";
out.print("<!DOCTYPE html><html><head>" + title + "</head>"
+ "<body>");
if(cookies != null) {
out.print("<h2>" + title + "</h2>");
for (Cookie cookie : cookies) {
out.print("<p>name : " + cookie.getName() + "</p>");
out.print("<p>value : " + URLDecoder.decode(cookie.getValue(), "UTF-8") + "</p>");
out.print("<hr>");
}
} else {
System.out.println("<h2>쿠키정보가 존재하지 않습니다.</h2>");
}
out.print("</body></html>");
}
private void setCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
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);
userId.setHttpOnly(true); // javascript를 이용한 직접 접근 방지
name.setMaxAge(60 * 60 * 48);
///////////////////////////////////////////////////////
// 응답헤더에 쿠키 추가
resp.addCookie(userId);
resp.addCookie(name);
// 응답 헤더에 인코딩 및 Content-Type 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키설정 예제";
out.print("<!DOCTYPE html><html><head><title>" + title + "</title>");
out.print("</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);
}
}
+ 페이지에서 쿠키 생성 및 삭제 가능


쿠키 삭제
사용중인 쿠키정보를 삭제하는 방법
1. 사용중인 쿠키정보를 이용하여 쿠키객체를 생성한다.
2. 쿠키객체의 최대 지속 시간을 0으로 설정한다.
3. 설정한 쿠키객체를 응답헤더에 추가하여 전송한다.
package kr.or.ddit.basic;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
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 T04ServletCookieTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 쿠키 설정(생성) 하기
// setCookieExam(req, resp);
// 쿠키 읽어오기
// readCookieExam(req, resp);
// 쿠키 정보 삭제하기
deleteCookieExam(req, resp);
}
private void deleteCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Cookie[] cookies = req.getCookies();
////////////////////////////////////////
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키 삭제 예제";
out.print("<!doctype html><html><head><title>" + title + "</title>"
+"<body>");
if(cookies != null) {
out.print("<h2>" + title + "</h2>");
for (Cookie cookie : cookies) {
if(cookie.getName().equals("userId")) {
// 쿠키 제거하기
cookie.setMaxAge(0);
resp.addCookie(cookie);
out.print("삭제한 쿠키 : " + cookie.getName() + "<br>");
}
out.print("<p>name : " + cookie.getName() + "</p>");
out.print("<p>value : " + URLDecoder.decode(cookie.getValue(), "UTF-8") + "</p>");
out.print("<hr>");
}
} else {
System.out.println("<h2>쿠키정보가 존재하지 않습니다.</h2>");
}
out.print("</body></html>");
}
private void readCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 현재 도메인에서 사용중인 쿠키정보 배열 가져오기
Cookie[] cookies = req.getCookies();
///////////////////////////////////////////////
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키정보 읽기 예제";
out.print("<!DOCTYPE html><html><head>" + title + "</head>"
+ "<body>");
if(cookies != null) {
out.print("<h2>" + title + "</h2>");
for (Cookie cookie : cookies) {
out.print("<p>name : " + cookie.getName() + "</p>");
out.print("<p>value : " + URLDecoder.decode(cookie.getValue(), "UTF-8") + "</p>");
out.print("<hr>");
}
} else {
System.out.println("<h2>쿠키정보가 존재하지 않습니다.</h2>");
}
out.print("</body></html>");
}
private void setCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
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);
userId.setHttpOnly(true); // javascript를 이용한 직접 접근 방지
name.setMaxAge(60 * 60 * 48);
///////////////////////////////////////////////////////
// 응답헤더에 쿠키 추가
resp.addCookie(userId);
resp.addCookie(name);
// 응답 헤더에 인코딩 및 Content-Type 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키설정 예제";
out.print("<!DOCTYPE html><html><head><title>" + title + "</title>");
out.print("</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);
}
}
'자바' 카테고리의 다른 글
[Java 고급] 29장 서블릿 컨텍스트, 필터, 리스너 (0) | 2024.02.22 |
---|---|
[Java 고급] 28장 세션 (1) | 2024.02.21 |
[Java 고급] 26장 서블릿 및 설정 (0) | 2024.02.19 |
[Java 고급] 25장 UDP 방식의 통신, HTTP 통신 (0) | 2024.02.16 |
[Java 고급] 24장 TCP 방식의 통신 (0) | 2024.02.16 |