Web programming : Cookie
Web programming : Cookie
인터넷을 하다보면 쿠키가 많이 쌓여서 쿠키삭제를 하네 뭐하네 한적이 많다.
쿠키는 무엇이며, 어떻게 작동하는지 배워보는 시간이다.
Cookie
동적 페이지를 위한 브라우저 상태 유지
- 기본적으로 HTTP 프로토콜은 상태를 저장하지 않음(Stateless)
- 모든 요청-응답 사이클은 서로 관계가 없음
- HTTP 클라이언트와 무관하게 HTTP 연결의 데이터는 서로 상관이 없음
- 동적 맞춤형 자료를 제공하기 위해 접속 브라우저를 식별해야 할 필요가 발생
- 접속 브라우저 식별(상태 유지) 및 임시 데이터 저장을 위한 다양한 노력들
- 클라이언트 IP
- HTTP Header를 이용
- 인증 식별 정보를 가진 값을 파라미터로 주고 받음 등
- 서버가 브라우저를 식별하고 간단한 데이터를 저장해 둘 수는 없을까...?
Cookie : 서버가 사용자의 컴퓨터에 설치하는 작은 기록 정보 파일
- HTTP 쿠키, 브라우저 쿠키, 웹 쿠키라고도 일컬음
- 쿠키에 담긴 정보는 인터넷 사용자가 웹 사이트를 방문할 때, 서버가 조회하고 변경할 수 있음
- 쿠키 안에 개인 데이터가 담겼을 때는 악용의 여지가 있지만 그 자체는 악성 파일이 아님
- 쿠키로 할 수 있는 일들
- 웹 사이트 기본 설정
- 쇼핑 카트 등의 임시 데이터 저장
- 페이지 개인화를 위한 식별 정보 송수신
Cookie 구성 요소
쿠키는 HTTP 헤더 정보에 포함되어 전달
구성요소 | 설명 |
이름 | 각 쿠키의 값을 식별하기 위한 키(key) |
값 | 지정된 이름으로 쿠키에 저장된 값(value) |
유효시간 | 쿠키의 유지 시간(초) |
도메인 | 쿠키를 전송할 도메인 |
경로 | 쿠키를 전송할 경로 |
Java에서 Cookie를 다루기 위한 API는 java.servlet.http 패키지에 포함
1. 쿠키를 생성할 폼을 만든다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Cookie Test Form</h1>
<h3>Add/Edit Cookie</h3>
<form method="post" action="cookies">
<label for="example">cookie value</label>
<input type="text" name="example" id="example" value="<%=cookievalue %>">
<input type="submit" value="쿠키설정">
</form>
<h3>Delete cookie</h3>
<a href="<%=request.getContextPath()%>/cookies?a=delete">쿠키삭제</a>
</body>
</html>
- 쿠키를 추가하는 폼을 만들고, example이라는 parameter name을 갖는다.
- 쿠키설정이라는 버튼을 누르면 서블릿의 post메소드로 이동하여 처리된다.
2. 쿠키 서블렛
1)에서 만들어진 쿠키폼의 정보를 가지고 쿠키를 생성한다.
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 쿠키 세팅
String value = req.getParameter("example");
System.out.println("설정할 쿠키값 : " + value);
// 쿠키 생성
Cookie jcookie = new Cookie("example", value);
// 쿠키를 브라우저에 설정 : 응답객체에 추가
resp.addCookie(jcookie);
// 응답전송
resp.sendRedirect(req.getContextPath() + "/cookies");
}
3. 쿠키 정보를 뿌려주기
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 쿠키 읽어오기
Cookie[] cookies = req.getCookies();
// 체크
if (cookies != null) {
// 쿠키가 있다!
for (Cookie cookie : cookies) {
String name = cookie.getName(); // 쿠키 이름
String value = cookie.getValue(); // 쿠키 값
int MaxAge = cookie.getMaxAge(); // 쿠키 지속 시간 (초)
System.out.printf("%s, %s, %d%n", name, value, MaxAge);
if (cookie.getName().equals("example")) {
// jsp에 값을 전달
req.setAttribute("example", cookie.getValue());
}
}
}
- 쿠키 서블릿의 doget에 쿠키를 가져오고, 있으면 값을 되돌려주는 내용을 추가한다.
- Attribute를 활용하자.
- 그럼 req에 받아온 attribute를 가져와서 form에 풀어줘야한다.
<%
String cookievalue = (String) request.getAttribute("example");
if (cookievalue == null) {
cookievalue = "";
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Cookie Test Form</h1>
<h3>Add/Edit Cookie</h3>
<form method="post" action="cookies">
<label for="example">cookie value</label>
<input type="text" name="example" id="example" value="<%=cookievalue %>">
<input type="submit" value="쿠키설정">
</form>
<h3>Delete cookie</h3>
<a href="<%=request.getContextPath()%>/cookies?a=delete">쿠키삭제</a>
</body>
</html>
JSP를 이용해 request에서 example의 이름의 쿠키 밸류를 가져오고, 그것을 <input의 value에 할당하였다.
만약 값이 있다면 그 값이 나올것이고, 없다면 "" 으로 아무 표현이 안될 것이다.
4. 삭제
쿠키는 삭제를 할 수 없다. 내용을 다른것으로 채워넣어 무효화를 해야한다.
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String actionName = req.getParameter("a");
if ("delete".equals(actionName)) {
// 쿠키삭제
Cookie[] cookies = req.getCookies();
if (cookies != null) {
// 쿠키가 있다
for (Cookie cookie : cookies) {
if (cookie.getName().equals("example")) {
// 쿠키는 삭제할 수 없음 -> 무효화
Cookie jcookie = new Cookie("example", "");
jcookie.setMaxAge(0);// 지속시간 0으로
resp.addCookie(jcookie);
break;
}
}
}
삭제 버튼을 눌렀을때 parameter a의 값이 delete이면 아래 코드가 실행된다.
쿠키값을 읽어어고, 쿠키값이 있으면, 내용이 없는 쿠키를 생성하고 그것을 기존에 가지고있던 쿠키이름으로 재설정해준다. 그러면 가지고있던 값이 사라지게 된다.
** 쿠키 서블렛 코드 전체
package com.example.emaillist.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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("/cookies")
public class CookieTestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String actionName = req.getParameter("a");
if ("delete".equals(actionName)) {
// 쿠키삭제
Cookie[] cookies = req.getCookies();
if (cookies != null) {
// 쿠키가 있다
for (Cookie cookie : cookies) {
if (cookie.getName().equals("example")) {
// 쿠키는 삭제할 수 없음 -> 무효화
Cookie jcookie = new Cookie("example", "");
jcookie.setMaxAge(0);// 지속시간 0으로
resp.addCookie(jcookie);
break;
}
}
}
} else {
// 쿠키 읽어오기
Cookie[] cookies = req.getCookies();
// 체크
if (cookies != null) {
// 쿠키가 있다!
for (Cookie cookie : cookies) {
String name = cookie.getName(); // 쿠키 이름
String value = cookie.getValue(); // 쿠키 값
int MaxAge = cookie.getMaxAge(); // 쿠키 지속 시간 (초)
System.out.printf("%s, %s, %d%n", name, value, MaxAge);
if (cookie.getName().equals("example")) {
// jsp에 값을 전달
req.setAttribute("example", cookie.getValue());
}
}
}
}
RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/views/cookies/cookie_form.jsp");
rd.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 쿠키 세팅
String value = req.getParameter("example");
System.out.println("설정할 쿠키값 : " + value);
// 쿠키 생성
Cookie jcookie = new Cookie("example", value);
// 쿠키를 브라우저에 설정 : 응답객체에 추가
resp.addCookie(jcookie);
// 응답전송
resp.sendRedirect(req.getContextPath() + "/cookies");
}
}