위로
아래
Cookie
쿠키(Cookie)
- 클라이언트의 상태 정보를 유지하기 위한 기술
- 상태 정보를 클라이언트에 키와 값의 형태로 저장했다가, 다음 요청 시 저장된 쿠키를 함께 전송해서, 웹 서버가 쿠키로부터 필요한 데이터를 읽어올 수 있도록 한다.
- 쿠키의 제약
- 쿠키 하나의 크기 : 4096바이트
- 쿠키는 3000개까지 만들 수 있다
- 하나의 호스트나 도메인에서는 최대 50개까지 만들 수 있다.
- 쿠키로 저장할 수 있는 최대 용량 1.2MB
- 보안이 취약
쿠키 동작
- 클라이언트가 서버에 요청 전송
- 서버가 쿠키를 생성하여 HTTP 응답 헤더에 실어 응답과 함께 클라이언트에 전송
- 클라이언트에서 쿠키를 받아 저장
- 다음 요청에서 클라이언트가 서버에 요청을 보낼 때, HTTP 요청 헤더에 저장해둔 쿠키를 함께 전송
- 서버가 쿠키를 받아 정보를 읽음
쿠키 생성 예시
더보기
<!-- 로그인 페이지 Cookie.jsp 파일 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="Cookie01Process.jsp" method="post">
<p>아이디 : <input type="text" name="id"></p>
<p>비밀번호 : <input type="text" name="passwd"></p>
<p><input type="submit" value="전송하기"></p>
</form>
</body>
</html>
<!-- 쿠키 생성 페이지 Cookie01Process.jsp 파일 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String user_id = request.getParameter("id");
String user_pw = request.getParameter("passwd");
if(user_id.equals("admin") && user_pw.equals("1234")){
Cookie cookie_id = new Cookie("userID",user_id);
Cookie cookie_pw = new Cookie("userPW",user_pw);
response.addCookie(cookie_id);
response.addCookie(cookie_pw);
out.println("쿠키 생성이 성공했습니다. <br>");
out.println(user_id + "님 환영합니다");
} else {
out.println("쿠키 생성이 실패했습니다.");
}
%>
</body>
</html>
쿠키 종류
속성 | Persistence 쿠키 | Session 쿠키 |
생성 위치 | 파일로 생성 | 브라우저 메모리에 생성 |
종료 시기 | 쿠키를 삭제하거나 쿠키 설정값이 종료된 경우 | 브라우저를 종료하면 자동 소멸 |
최초 접속 시 전송 여부 | 최초 접속 시 서버로 전송 | 최초 접속 시 서버로 전송되지 않음 |
용도 | 로그인 유무 또는 팝업창 제한 | 사이트 접속 시 Session 인증 정보를 유지 |
예시
더보기
![](https://blog.kakaocdn.net/dn/bMA2mn/btsuG5DWeiX/vWw8I3wi87PskQ5dxklcCK/img.png)
![](https://blog.kakaocdn.net/dn/cjTtqU/btsuOf0hAya/VPMMpuCi47UqsJeEQxVfdK/img.png)
//SetCookieValue 서블릿
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/set")
public class SetCookieValue extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Date d = new Date();
Cookie c = new Cookie("cookieTest","gaesol");
c.setMaxAge(24*60*60); // Persistence 쿠키
//c.setMaxAge(-1); // Session 쿠키
response.addCookie(c);
out.println("현재시간 : "+d);
out.println("문자열을 Cookie에 저장합니다.");
}
}
![](https://blog.kakaocdn.net/dn/bMA2mn/btsuG5DWeiX/vWw8I3wi87PskQ5dxklcCK/img.png)
//GetCookieValue 서블릿
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/get")
public class GetCookieValue extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Cookie[] allValues = request.getCookies();
for(int i=0; i<allValues.length;i++) {
if(allValues[i].getName().equals("cookieTest")) {
out.println("<h2>Cookie 값 가져오기 : "
+ allValues[i].getValue());
}
}
}
}
![](https://blog.kakaocdn.net/dn/cjTtqU/btsuOf0hAya/VPMMpuCi47UqsJeEQxVfdK/img.png)
쿠키 메소드
속성
- 이름(name) : 쿠키를 구별하는 이름
- 값(value) : 쿠키에 실어서 저장할 데이터
- 도메인(domain) : 쿠키를 적용할 도메인
- 경로(path) : 쿠키를 적용할 경로
- 유지 기간(max age) : 쿠키를 유지할 기간
쿠키 생성자
new Cookie(name, value)
세터 메소드
- setValue(값) : 쿠키의 값을 설정 (문자열)
- setDomain(도메인) : 쿠키에 적용할 도메인 설정.
- setPath(경로) : 쿠키가 적용될 경로를 지정. 지정된 경로의 하위 경로에까지 적용된다 (문자열)
- setMaxAge (초) : 쿠키가 유지될 기간을 초 단위로 설정
- 음수 설정 : Session 쿠키로 설정 (없어도 Session 쿠키)
- 양수 설정 : Persistence 쿠키로 설정
게터 메소드
- getName() : 쿠키의 이름을 반환
- getValue() : 쿠키의 값을 반환
- getDomain() : 쿠키가 적용되는 도메인을 반환
- getPath() : 쿠키의 적용 경로를 반환 (없다면 null)
- getMaxAge() : 쿠키의 유지 기간을 반환 (없다면 -1 반환)
예시
더보기
<!-- Cookie02.jsp 파일 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
out.println("현재 설정된 쿠키의 개수 : " + cookies.length);
out.println("<br> ====== <br>");
for(int i=0;i<cookies.length;i++){
out.println(i + "번째 쿠키의 속성 이름 : " + cookies[i].getName() + "<br>");
out.println(i + "번째 쿠키의 속성 값 : " + cookies[i].getValue() + "<br>");
}
%>
</body>
</html>
<!-- Cookie02.jsp 파일 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
for(int i=0;i<cookies.length;i++){
cookies[i].setMaxAge(0);
response.addCookie(cookies[i]);
}
response.sendRedirect("Cookie02.jsp");
%>
</body>
</html>
쿠키를 이용한 팝업창 만들기
더보기
![](https://blog.kakaocdn.net/dn/Qq1vw/btsut2altLe/b7iMYKJGFG40WSKuoB2CS0/img.png)
<!-- popupTest.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type ="text/javascript">
window.onload = pageLoad;
function pageLoad(){
notShowPop = getCookieValue();
if(notShowPop != "true"){
window.open("popUp.jsp","pop","width=400, height=500, history=no," +
"resizable=no, status=no, scrollbars=yes, menubar=no");
}
}
function getCookieValue(){
let result = "false";
if(document.cookie != ""){
cookie = document.cookie.split(";");
for(let i=0; i<cookie.length;i++){
element=cookie[i].split("=");
value=element[0];
value = value.replace(/^\s*/,'');
if(value=="notShowPop"){
result = element[1];
}
}
}
return result;
}
function deleteCookie(){
document.cookie = "notShowPop=" + "false" + ";path=/; expires=-1";
}
</script>
</head>
<body>
<form>
<input type="button" value="쿠키삭제" onClick="deleteCookie()">
</form>
</body>
</html>
<!-- popUp.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function setPopUpStart(obj){
if(obj.checked==true){
let expireDate = new Date();
let days = 1;
expireDate.setDate(expireDate.getDate() + days);
document.cookie = "notShowPop=" + "true" + ";path=/; expires=" + expireDate.toGMTString();
window.close();
}
}
</script>
</head>
<body>
알림 팝업창
<br><br><br><br><br><br><br><br>
<form>
<input type="checkbox" onClick = "setPopUpStart(this)"> 오늘 더 이상 팝업창 띄우지 않기
</form>
</body>
</html>
![](https://blog.kakaocdn.net/dn/Qq1vw/btsut2altLe/b7iMYKJGFG40WSKuoB2CS0/img.png)
체크박스를 체크하면 쿠키에 저장되어 새로고침을 해도 팝업창이 뜨지 않는다.
쿠키 삭제 버튼을 눌러서 쿠키를 삭제해주면 새로고침 시 팝업창이 뜬다.