<< 학습 목표 >>
1. 쿠키를 설명할 수 있다.
2. 쿠키가 필요한 이유를 설명할 수 있다.
3. 유효기간이 있는 쿠키를 생성할 수 있다.
4. 유효기간이 없는 쿠키를 생성할 수 있다.
5. 클라이언트가 건낸 쿠키를 서버에서 꺼낼 수 있다.
정상적인 웹 서비스라면 사용자가 웹 서비스를 이용하는데 필요한 상태 정보를 기억하고 있어야함
사용자가 웹 서비스를 이용하는데 필요한 상태 정보는 일반적으로 로그인 여부임
네이버로 예를 들자
네이버에 로그인 하기 전이라면 네이버 웹 서비스는 "이 사용자는 지금 내 서비스에 로그인하기 전이구나" 를 판단하고 로그인 버튼을 보여줌
그러나 네이버에 로그인을 한 상태라면 네이버 웹 서비스는 "이 사용자는 지금 내 서비스에 로그인을 했구나" 를 판단하고 로그인한 사용자의 정보를 보여줌
이렇게 내가 만드는 웹 서비스에서 사용자의 로그인 여부를 판단하기 위해서는 사용자가 웹 서비스를 이용하는데 필요한 상태 정보를 기억해야함
간단하게 상태 정보 라고 하자
상태 정보를 기억하기 위한 방법은 두 가지가 있음
1. Cookie 사용하기
2. Session 사용하기
이 글에서는 Cookie 를 사용해 사용자의 상태 정보를 저장하고 저장한 상태 정보를 꺼내는 방법을 배울 것
활용하는 방법은 Session까지 모두 배운 후 회원 정보 수정, 회원 탈퇴 서비스를 구현하면서 알아볼 것
쿠키(Cookie) 란 클라이언트(사용자) 의 상태 정보를 저장해두는 공간을 뜻함
하드 디스크에 파일들을 저장해두듯이 쿠키는 클라이언트의 상태 정보를 저장하는 공간임
쿠키란 말은 우리가 알고 있는 그 쿠키에서 따왔다고 함
쿠키처럼 작은(간단한) 상태 정보를 저장하기 위한 공간이라 쿠키라는 설이 있음
어떻게 사용하느냐에 따라서 쿠키에 많은 상태 정보를 저장할 수도 있음
특히나 쿠키는 클라이언트의 PC에 파일 형태로 저장됨
브라우저별로 쿠키가 저장되는 공간이 다름
크롬(Chrome) 브라우저를 사용한다면
1. 크롬 브라우저 실행
2. 주소창에 chrome://version/ 입력 후 프로필 경로 복사
3. 파일 탐색기 ( 키보드의 시작키 + E ) 를 열고 복사한 프로필 경로 붙여넣기
4. Cache 폴더 또는 Cache 폴더 내 Cache_Data 로 이동
하면 다음과 같이 쿠키 파일들이 보이는걸 알 수 있음
여기 보이는 쿠키 파일들이 크롬 브라우저를 사용해 접속했던 웹 서비스에서 쿠키를 사용해 상태 정보를 저장해둔 것
우리 웹 서비스도 쿠키를 사용해 상태 정보를 저장해두면 이 곳에 파일이 하나 생길 것
이제 본격적으로 쿠키를 배울텐데 여기서 알아야할 중요한 점은 쿠키가 필요한 이유임
쿠키가 필요한 이유는? 웹 서비스에 필요한 상태 정보를 저장 하기 위해서임
클라이언트가 필요한게 아닌 서버가 필요한 것
그래서 서버가 쿠키를 만들고 쿠키에 정보를 저장하고 쿠키에 저장한 정보를 꺼내 사용할 것
그. 런. 데. 그 쿠키를 어디에 저장해둔다? 클라이언트에게
쿠키의 예를 든다면 어느 음식점의 쿠폰 서비스에 비유를 들 수 있음
어느 음식점에서 10번 방문 시 1만원 할인 쿠폰을 주는 서비스를 시작했음
고객이 필요해서 "저 10번 오면 1만원 할인 쿠폰 주세요" 가 아니라 매장이 단골을 확보하기 위한 서비스임
고객 마다 몇 번 왔는지 기록해두기 위해서 위와 같이 쿠폰 도장을 만들어서 방문 마다 도장을 찍어주기로 했음
점원이 쿠폰에 도장을 찍고 고객에게 주면서 "다음에 오실 때 쿠폰 가지고 오세요" 라고 하는 것
점원 = 웹 서비스
쿠폰 = 상태 정보
인 것이고
이 쿠폰을 고객이 가지고 가는 방식이 웹 서비스에서는 쿠키임
웹 서비스(서블릿)에서 쿠키를 만들고 쿠키에 정보를 저장하고 쿠키에 저장된 데이터를 꺼내는 방법을 배워보자
<< 서블릿에서 쿠키를 만드는 방법 >>
쿠키를 만들 때는 쿠키 클래스를 사용해서 쿠키 객체를 생성하면 됨
이때 쿠키를 그냥 만들기만 하면 안되고 쿠키를 만들면서 서버에 필요한 정보를 쿠키에 저장해야함
chapter05 패키지를 추가한 뒤 chapter05 패키지 안에 CreateCookie 서블릿을 추가 하고 아래 코드를 추가하자
package chapter05;
import java.io.IOException;
import java.time.LocalDateTime;
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("/chapter05/cookie/create")
public class CreateCookie extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
LocalDateTime now = LocalDateTime.now();
Cookie cookie = new Cookie("test", now.toString());
cookie.setMaxAge(24 * 60 * 60);
response.addCookie(cookie);
System.out.println("이름이 test인 쿠키를 생성하고");
System.out.println("그 쿠키에 " + now.toString() + " 를 저장했음");
}
}
이제 서버를 실행시키고 해당 서블릿으로 접근해보자
클라이언트(브라우저)에 현재 날짜와 시간을 가지고 있는 이름이 test인 쿠키가 저장됨
앞서 얘기했던 쿠키가 저장된 폴더(Cache_Data 폴더)로 가서 이름이 test인 쿠키 파일이 있는지 확인해보자
그러나 그런 쿠키 파일은 보이지 않음
크롬은 자기만의 방식으로 쿠키를 저장함
시작하면서 쿠키가 저장된 폴더를 본 이유는 "클라이언트(크롬)이 이런식으로 쿠키를 저장해둔다" 를 보기위함이었음
우리가 쿠키를 보려면 브라우저의 개발자 모드로 봐야함
브라우저에서 F12 를 눌러 개발자 모드를 열자(1)
그 다음 응용프로그램 또는 Application (2) 을 누르고 쿠키(3) 를 펼쳐 보면 URL이 나옴
URL을 클릭(4)하면 오른쪽에 쿠키의 이름(5)과 쿠키(6)에 저장한 값이 보임
지금까지의 과정을 비유하자면 음식점에서 쿠폰에 도장을 찍고 고객에게 건내준 것
코드를 분석해보자
쿠키에 저장할 현재 날짜와 시간을 생성(1)
이름이 test인 쿠키를 만들고 그 안에 현재 날짜와 시간을 저장(2)
쿠키의 유효기간은 하루로 지정(3), 쿠키의 유효기간은 초 단위로 지정함
1분은 60초, 1시간은 60분, 하루는 24시간이므로 하루를 초로 바꾸면 24 * 60 * 60이 됨
쿠키의 유효기간이 하루이므로 클라이언트는 이 쿠키를 하루 동안 보관함
하루가 넘어가면 클라이언트는 이 쿠키를 지움
test 쿠키를 클라이언트(브라우저)가 저장하라고 응답 정보에 담았음(4)
쿠키를 만들어 클라이언트에게 보내는 서블릿에 여러번 접속하면 그때 마다 이름이 test인 쿠키에 현재 날짜와 시간을 담아 보내는데 그렇게 되면 전에 받았던 쿠키의 이름과 나중에 받은 쿠키의 이름이 같으니 전에 받았던 쿠키는 버려지게 됨
쿠키 하나에는 최소한의 상태 정보만 저장하는게 좋음
이런 저런 상태 정보가 필요하면 이름이 다른 쿠키를 여러 개 만들어야하는 상황도 생김
여기까지 << 서블릿에서 쿠키를 만드는 방법 >> 을 배웠음
이번에는 << 서블릿에서 쿠키를 꺼내는 방법 >> 을 배우자
chapter05 -> GetCookie 서블릿을 추가하고 아래 코드를 추가하자
package chapter05;
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;
@WebServlet("/chapter05/cookie/get")
public class GetCookie extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
for(int i=0; i<cookies.length; i++) {
Cookie nthCookie = cookies[i];
String cookieName = nthCookie.getName();
String cookieValue = nthCookie.getValue();
System.out.println("name => " + cookieName);
System.out.println("value => " + cookieValue);
}
}
}
이제 서버를 실행시키고 해당 서블릿으로 접근해보자
쿠키의 이름과 쿠키에 저장해둔 값이 출력됨
이 상황을 비유해보자면 다시 이 음식점에 방문한 고객이 점원에게 쿠폰을 건낸 것
코드를 분석해보자
요청 정보 안에서 클라이언트가 건낸 모든 쿠키를 꺼냄(1)
앞서 간단하게 언급했듯이 서버는 클라이언트에게 이런 저런 쿠키를 건낼 수 있음
이름이 같은 쿠키라면 전에 쿠키는 지우고 마지막으로 보낸 쿠키만 저장해두고 이름이 다르다면 그대로 저장할 것
클라이언트가 서버로 요청을 보낼 때는 서버가 건낸 모든 쿠키를 담아서 요청을 보냄
그래서 서버는 요청 정보 안에서 클라이언트가 건낸 모든 쿠키를 꺼내는 것
클라이언트가 건낸 쿠키 중 특정 쿠키만 골라서 꺼낼 수는 없음
단, 우리는 지금 이름이 test인 쿠키 밖에 없으므로 cookies에 들어있는 쿠키는 1개뿐임
반복문을 통해 클라이언트가 건낸 첫 번째 쿠키부터 마지막 쿠키까지 모두 접근함(2)
n번째 쿠키를 nthCookie 객체에 저장(3)
n번째 쿠키의 이름과 저장된 값을 꺼냄(4)
n번째 쿠키의 이름과 저장된 값을 출력(5)
여기서 결과에 주목하자
우리는 CreateCookie 서블릿에서 이름이 test인 쿠키에 현재 날짜와 시간을 저장했음
그런데 지금 쿠키를 꺼내는 서블릿은? GetCookie 서블릿임
쿠키를 생성한 서블릿과 쿠키를 꺼내는 서블릿이 다름
이렇게 상태 정보를 쿠키에 저장해 여러 서블릿에서 상태 정보를 사용할 수 있음
또 한가지 주목해야되는 부분은 test 쿠키에 저장된 값임
현재 쿠키에 저장된 값은 다음과 같음
브라우저를 닫고 다시 브라우저를 연 다음 GetCookie 서블릿에 접근 해보자
그러면 이름이 test인 쿠키의 값이 그대로 출력된다는것을 알 수 있음
이번에는 서버를 껐다 켜보자
이클립스의 [ Servers ] 탭(1)에서 서버 우클릭(2) 후 [ Stop ] (3) 을 눌러 서버를 끄자
그 뒤 같은 방법으로 서버를 [ Start ] 한 후 브라우저에서 GetCookie 서블릿에 접근해보자
여전히 이름이 test인 쿠키의 값이 그대로 출력된다는것을 알 수 있음
마지막으로 컴퓨터를 아예 껐다 켠 뒤 이클립스를 실행한 다음 서버를 실행시키자
그 뒤 GetCookie 서블릿에 접근 해보자
여전히 이름이 test인 쿠키의 값이 그대로 출력된다는것을 알 수 있음
이렇게 서버가 쿠키를 만든 뒤 [ 클라이언트에게 건냈고 ] [ 쿠키의 유효기간을 하루 ] 로 했기 때문에 브라우저를 닫았다 열어도, 서버를 내렸다 올려도, 컴퓨터를 껐다 켜도 클라이언트는 쿠키를 하루 동안 유지하면서 서버로 보냄
쿠키를 만들었는데 클라이언트에게 건내지 않았다면 당연히 클라이언트는 쿠키를 저장하지 못함
쿠키의 유효기간을 극단적으로 짧게 해 1초로 지정한 뒤 클라이언트에게 건냈다면 클라이언트는 쿠키를 받고 1초 뒤 그 쿠키를 버릴 것
여기까지 << 서블릿에서 쿠키를 꺼내는 방법 >> 을 배웠음
이번에는 다시 << 서블릿에서 쿠키를 만드는 방법 >> 얘기를 해보자
서블릿에서 쿠키를 만드는데 유효기간을 지정하지 않거나 유효기간을 음수로 지정하면 어떻게 될까?
chapter05 -> CreateCookie2 서블릿을 추가하고 아래 코드를 추가하자
package chapter05;
import java.io.IOException;
import java.time.LocalDateTime;
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("/chapter05/cookie/create2")
public class CreateCookie2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
LocalDateTime now = LocalDateTime.now();
Cookie cookie = new Cookie("test2", now.toString());
response.addCookie(cookie);
System.out.println("이름이 test2인 쿠키를 생성하고");
System.out.println("그 쿠키에 " + now.toString() + " 를 저장했음");
}
}
처음에 만들어봤던 쿠키와 비슷한 이름인 test2 쿠키를 만들었음
test2 쿠키에는 유효기간을 지정하지 않았음
이제 서버를 재시작하고 CreateCookie2에 접근한 후 이어서 GetCookie 서블릿에 접근하자
GetCookie 서블릿은 이와 같이 클라이언트가 건낸 두 개의 쿠키 이름과 값을 출력할 것(1)
이번에는 브라우저를 닫고 브라우저를 다시 연 다음 GetCookie 서블릿에 접근하자
이번에 GetCookie 서블릿이 출력하는건 test 쿠키 뿐임(1)
이렇게 쿠키의 유효기간을 설정하지 않으면 그 쿠키는 브라우저를 닫으면 사라짐
또한 쿠키의 유효기간을 음수로 설정해도 브라우저를 닫으면 쿠키는 사라짐
여기까지 << 서블릿에서 유효기간 없이 쿠키 만드는 방법 >> 을 배웠음
쿠키에 뭘 저장할 지, 쿠키는 어떻게 활용할 지는 내 상황에 따라 다름
우리가 이 글의 처음에 확인했듯이 쿠키는 사용자의 PC에 저장됨
쿠키 안에 사용자의 중요한 개인 정보를 저장해두면 해커가 쿠키를 빼갈 우려가 있기 때문에 쿠키 안에는 중요한 개인 정보를 저장해두면 안됨
보통 쿠키 안에는 유출되도 큰 문제가 없는 데이터를 저장함
예전에는 쿠키를 사용해서 장바구니를 많이 구현했음
사용자가 인터넷 쇼핑몰에서 [ 장바구니에 담기 ] 를 누르면 클라이언트는 장바구니에 담을 상품 정보를 서버로 보냄
서버는 전달 받은 상품 정보를 이름이 "cart" 인 쿠키에 저장하는 것
그러나 요즘은 쿠키로 장바구니를 구현하지 않는 추세임
( 쿠키로 장바구니를 구현하지 않는 추세이니 쿠키로 장바구니를 구현하는 설명은 여기까지 )
장바구니를 쿠키로 구현하지 않는 이유는 개인 정보 유출 문제는 아니고 시대의 흐름상 이라고 생각하면 됨
'Servlet + JSP > Serlvet-Chapter05' 카테고리의 다른 글
Chapter05. CRUD 프로젝트 / 비밀번호 암호화하기 (0) | 2023.03.26 |
---|---|
Chapter05. CRUD 프로젝트 / URL에서 포트 번호 없애기 (0) | 2023.03.26 |
Chapter05. CRUD 프로젝트 / URL에서 .html 없애기(2) (0) | 2023.03.25 |
Chapter05. CRUD 프로젝트 / URL에서 .html 없애기(1) (0) | 2023.03.25 |
Chapter05. 세션을 사용해 상태 정보를 저장하는 방법 (0) | 2023.03.22 |