Web Programming

Web programming : Cookie

jmeen 2021. 8. 18. 12:14
728x90

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");

	}
}