쿠키

호떡·2022년 9월 18일
0

쿠키&세션 등장 배경 : HTTP Protocal

HTTP Protocal 특징

  1. 비연결(connectionless) 지향형 통신 프로토콜
  2. 응답 후 연결을 종료(stateless)
  • 지속적인 연결 유지로 인한 자원낭비 방지를 위해 연결 해제
  • 연결이 해제되면 서버는 클라이언트 정보를 알 수 없음
  1. 이러한 문제를 해결하기 위해서 Cookie와 HttpSession을 활용한다.

예를 들어, 장바구니에 상품을 담아 두었는데, 페이지가 바뀌면 정보가 없어짐. 로그인 정보가 없음
따라서 쿠키에 장바구니 목록에 대한 정보 등을 담아두고 이후에 다시 페이지 요청을 할 때 쿠키도 함께 보내면서 이전의 장바구니 목록 상태가 반영된 페이지를 서버에게 전달받을 수 있는 것. 서버와 클라이언트는 stateless 상태이므로 서버는 장바구니의 변화를 알지 못함. 따라서 쿠키를 통해 그 변화를 알아차리는 것


  1. 서버가 생성하는 클라이언트 정보를 가지고 있는 파일
  2. 클라이언트 컴퓨터에 저장되며, 필요에 따라 요청 시 서버로 같이 전송된다.
  3. key-value 형태로 구성되며 문자열 데이터이다.
  4. 브라우저(클라이언트) 별로 별도의 쿠키가 생성된다. 따라서 브라우저가 다르면 다른 사용자로 처리하고, 이에 사용자마다 다른 페이지를 보여줄 수 있다.
  5. 세션관리(사용자 아이디, 접속시간, 장바구니 등)을 위해 사용된다.
  6. 사용자의 행동과 패턴을 분석하고 기록하는데 사용된다. (ex. 사용자가 클릭한 상품 관련 광고 배너)

  1. Client가 요청 생성
  2. WAS는 Cookie를 생성하고 Http Header에 Cookie를 넣어 응답
    (response에 쿠키를 담아 클라이언트에게 전달)
  3. Client(Browser)는 Cookie를 저장, 해당 서버에 요청할 때 요청과 함께 Cookie를 전송
  4. Cookie는 브라우저가 종료되더라도 계속 저장되기 때문에 (만료 기간 전까지) 동일 사이트 재방문하여 요청 시 필요에 따라 Cookie가 재전송된다.

쿠키 특징

  1. 이름(key), 값(value), 만료일(Expire date_저장기간), 경로정보로 구성된다.
  2. 클라이언트에 최대 300개의 쿠키를 저장할 수 있다.
  3. 하나의 도메인당 20개의 쿠키를 저장할 수 있다.
  4. 쿠키 하나는 4KB(=4096byte)까지 저장가능

package com.ssafy.cookie;

import java.io.IOException;

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;

// 서블릿으로 업그레이드 시키고
// 쿠키를 한번 만들어 보자
// 쿠키 정보를 입력할 수 있는 cookie.jsp가 있는 상태

@WebServlet("/make")
public class MakeCookie extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		String key = request.getParameter("key");
		String value = request.getParameter("value");
		
		// 쿠키 생성
		Cookie cookie = new Cookie(key, value);
		
		// 유효시간(만료기간) > 초단위
		cookie.setMaxAge(60);	// 1분 유지
		
		// 쿠키라고 하는 것은 직접 우리가 설정으로 지울 수 는 없을까?
		cookie.setMaxAge(0); 		// 이렇게 쓰는 것이 쿠키 삭제와 동일하다.		
		
		// 쿠키 응답에 추가
		response.addCookie(cookie);
	
		response.sendRedirect("cookie1.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>

	<h2>현재 내 브라우저 안에 있는 쿠키 정보</h2>
	<hr>
	<%
		// request에서 쿠키 찾기
		// 쿠키는 어차피 클라이언트에 저장되어 있어서 (리다이렉트로 요청 보내도) request에서 찾아도 괜찮다???
		// 쿠키 배열을 반환
		Cookie[] cookies = request.getCookies();
		if(cookies != null){
			for(Cookie c : cookies){
				String key = c.getName();
				String value = c.getValue();
				%>
				
				<%= key %>:<%= value %>
				
				<%
			}
		} else {
			out.print("설정된 쿠키가 없습니다");
		}
	
	%>


	<h2>쿠키설정</h2>
	<form action="make" method="GET">
		이름: <input type="text" name="key"> <br>: <input type="text" name="value"> <br> 
		<input type="submit" value="쿠키생성">
	
	</form>
</body>
</html>

💡노마드코더_쿠키와 세션

0개의 댓글