본문 바로가기
웹개발/js

쿠키 사용하기.

by heavenLake 2022. 2. 18.
반응형

 

 

출처사이트 :  https://uoonleen.tistory.com/m/65

 

 쿠키(Cookie)란?

 
─────
 
 웹서버가 웹브라우저에게 보내는 데이터 중의 하나입니다.
    웹브라우저는 웹서버로부터 받은 쿠키 데이터를 내부 메모리 또는 
    별도의 폴더에 저장합니다. 그리고 그 웹서버를 방문할 때마다 쿠키를 
    요청 헤더(Request Header)에 담아 다시 전달합니다.
 
 쿠키 생성
- 쿠키의 이름은 'ISO-8859-1'이어야 합니다. 이 말은 한글이 안된다는 것이죠.
- 쿠키의 값은 'ISO-8859-1' 문자열이어야 합니다.
 
 
    만약 한글을 저장하고 싶다면?
 

   ▶  URL 인코딩을 하여 저장하면 됩니다.

 

 

───── 

쿠키의 사용 I : 쿠키 객체 생성

 

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("/cookieEx/Servlet01")
public class Servlet01 extends HttpServlet {
  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) 

throws ServletException, IOException { /* 1) 쿠키 생성 */ Cookie cookie = new Cookie("c1", "aaaaaa"); /* 2) 쿠키를 응답 헤더에 포함시켜 보내기 HTTP/1.1 200 Set-Cookie: c1=aaaaaa <----- 쿠키 데이터가 이렇게 헤더에 추가됨. Content-Type: text/plain;charset=UTF-8 Content-Length: 29 Date: Mon, 12 Jun 2017 03:35:03 GMT */ resp.addCookie(cookie); resp.setContentType("text/plain;charset=UTF-8"); PrintWriter out = resp.getWriter(); out.println("Servlet01: 쿠키 보냈음."); } }

 

 

 서버를 실행하고 웹브라우저 url 주소에 localhost:8080/프로젝트명/cookieEx/Servlet01 을 입력하면 쿠키가 생성되어 웹브라우저에 저장됩니다.

 

 

────

웹브라우저에 저장된 쿠키의 값을 읽기

 

mport 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;

/* 쿠키 읽기 I
 * => 웹브라우저가 보낸 쿠키 정보를 읽기
 */

@WebServlet("/cookieEx/CookieReader01")
public class CookieReader01 extends HttpServlet {
  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
    resp.setContentType("text/plain;charset=UTF-8");
    PrintWriter out = resp.getWriter();

    /* 1) 요청 헤더에서 쿠키 정보를 추출하기
     * => 웹브라우저가 쿠키를 보내지 않았다면, null을 리턴한다.
GET /프로젝트명/cookieEx/CookieReader01 HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,

*... Accept-Encoding: gzip, deflate, sdch, br Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: c1=aaaaaa <------------ 웹브라우저가 웹서버에 보내는 쿠키 데이터 */ Cookie[] cookies = req.getCookies(); // 2) 읽은 쿠기 정보 출력하기 if (cookies != null) { for (Cookie cookie : cookies) { out.printf("%s=%s\n", cookie.getName(), // 쿠키 이름 cookie.getValue()); // 쿠키 값 } } else { out.println("쿠키가 한 개도 없습니다."); } } }

 

 

 서버를 실행시킨 후 웹브라우저 url 주소에 localhost:8080/프로젝트명/cookieEx/CookieReader01 을 입력하면 저장된 쿠키의 이름과 값이 출력됩니다.

 

 

───── 

쿠키의 사용 II : 사용 범위 지정

 

cookie.setPath(req.getContextPath());

 

 쿠키의 사용 범위를 지정해주지 않으면 쿠키를 보낸 서블릿의 경로에

    한정됩니다. 따라서 쿠키의 사용 범위를 현재 웹 어플리케이션 전체로

    지정하고 싶다면 setPath(주소) 함수를 이용해야 합니다. 

 

 여기서 req.getContextPath() 는 "/웹프로젝트명"과 동일합니다.

 

 

 

 

───── 

쿠키의 사용 III : 사용 기간 지정

 

cookie.setMaxAge(60);

 

 쿠키의 사용 기간을 지정하지 않으면 웹브라우저가 실행되는 동안만 

    쿠키가 보관됩니다. 웹브라우저를 '모두' 닫으면 사용 기간을 지정하지

    않은 쿠키는 모두 소멸되어 버리는 것이죠.

 

 사용 기간을 지정하면, 컴퓨터를 껐다 켜도 지정한 시간 만큼 유지할 수

    있습니다. 웹브라우저는 보낼 쿠키를 검사할 때 사용 기간이 지난 쿠키는

    제거합니다.

 

 여기서 setMaxAge() 메서드의 파라미터로 넘어가는 값(60)의 단위는 '초'입니다.

 

 

 

───── 

쿠키의 사용 IV : 한글 보내는 법

 

Cookie cookie = new Cookie("c4", URLEncoder.encode("ABC가각간", "UTF-8"));

 

 만약 웹서버가 유니코드를 그대로 내보내는 서버가 아니라면, 위와 같이 

    개발자가 URL 인코딩을 직접 수행해야 합니다.

 

▶ 한글 "가각간"을 보내주기 위해선 URLEncoder 인스턴스의 encode() 

    메서드를 사용해야 하는 것입니다. 첫번째 아규먼트로 넘겨줄 값을, 

    두번째 아규먼트로 인코딩 형식을 지정해야 하죠.

 

 웹서버가 유니코드 값을 보내더라도 웹브라우저 중에서는 유니코드를

    처리할 수 없는 브라우저도 있기 때문에 개발자가 URL 인코딩을 해서

    보내기를 권장합니다.

 

 

왜 URL 인코딩을 해야만 하는지에 대해선 이전 글을 참고해주세요 :)

 

       2017/06/12 - [Programming/java] - [Java] URL 인코딩이란 무엇인가?

 

 

 

 

───── 

쿠키의 사용 V : 한글로 인코딩 된 쿠키 값을 읽기

 

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;

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;

/* 쿠키 읽기 III
 * => 쿠키 값이 URL 인코딩 되어 있을 때,
 *    개발자가 직접 URL 디코딩을 수행해야 한다.
 *  
 */

@WebServlet("/cookieEx/CookieReader03")
public class CookieReader03 extends HttpServlet {
  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
    resp.setContentType("text/plain;charset=UTF-8");
    PrintWriter out = resp.getWriter();

    Cookie[] cookies = req.getCookies();
    
    if (cookies != null) {
      for (Cookie cookie : cookies) {
        out.printf("%s=%s\n", 
            cookie.getName(),  // 쿠키 이름
            URLDecoder.decode(cookie.getValue(), "UTF-8"));  
        // 영어는 URL 디코딩해도 값이 같다. 그러니 영어를 디코딩하는 것에 대해 걱정말라!
      }
    } else {
      out.println("쿠키가 한 개도 없습니다.");
    }
  }
}

 

 URLEncoder를 통해 인코딩 된 쿠키 데이터(한글 값)는 URLDecoder의 

    decode() 메서드를 통해 디코딩 시켜주어야 합니다. 

 

▶ decode() 메서드에 넣어주는 첫번째 아규먼트는 쿠키 데이터, 두번째 

   아규먼트는 디코딩 형식입니다.

 

 영어는 URL 디코딩을 해도 값이 달라지지 않습니다. 그러니 영어를 

    디코딩하는 것에 대해선 걱정마세요 :)

 

 

반응형

댓글