ksouth9

쿠키(Cookie) 본문

Web/JSP

쿠키(Cookie)

ksouth9 2022. 5. 8. 02:40

쿠키(Cookie)


쿠키는 클라이언트의 상태 정보를 유지하기 위한 기술이다.

상태 정보를 클라이언트(주로 웹 브라우저)에 키와 값 형태로 저장했다가 다음 요청 시 저장된 쿠키를 함께 전송한다. 그러면 웹 서버는 브라우저가 전송한 쿠키로부터 필요한 데이터를 읽어올 수 있다.

 

쿠키 특징

  • 쿠키는 생성자를 통해서만 생성할 수 있다. 생성 후 쿠키값은 변경할 수 있으나 쿠키명은 변경할 수 없다.
  • 쿠키는 생성 직후 바로 사용할 수는 없다. 클라이언트가 재요청을 했을 때부터 사용할 수 있다.

 

동작 메커니즘

  1. 클라이언트가 서버에 요청을 보낸다.
  2. 서버가 쿠키를 생성하여 HTTP 응답 헤더에 실어 클라이언트에 전송한다.
  3. 클라이언트는 쿠키를 받아 저장해둔다.( 이 시점에는 쿠키가 클라이언트에만 저장된 상태이므로 서버는 아직 쿠키를 사용할 수 없다.)
  4. 클라이언트는 다음번 요청 시 저장해둔 쿠키를 HTTP 요청 헤더에 실어 보낸다.
  5. 서버는 쿠키의 정보를 읽어 필요한 작업을 수행한다.

쿠키가 처음 만들어진 시점에는 서버가 아직 쿠키를 읽을 수 없다. 다음번 요청 때부터 클라이언트가 전송해주기 때문이다. 따라서 페이지를 새로 고치거나 다시 접속해야 서버가 쿠키를 읽어 활용하게 된다.

 

쿠키 속성

  • 이름(name) : 쿠키를 구별하는 이름
  • 값(value) : 쿠키에 저장할 실제 데이터
  • 도메인(domain) : 쿠키를 적용할 도메인
  • 경로(path) : 쿠키를 적용할 경로
  • 유지 기간(max age) : 쿠키를 유지할 시간

쿠키 설정 메서드

메서드 설명
void setValue(String value) 쿠키의 값을 문자열로 설정한다. 쉼표나 세미클론 같은 문자는 포함할 수 없다.
void setDomain(String domain) 쿠키에 적용할 도메인을 설정한다.
주 도메인만 적용하고 싶다면 "도메인" 형태로 기술
서브 도메인에 적용하고 싶다면 ".도메인"으로 기술
void setPath(String path) 쿠키가 적용될 경로를 지정한다. 지정한 경로와 그 하위 경로에까지 적용된다.
void setMaxAge(int expire_seconds) 쿠키가 유지될 기간을 초 단위로 설정한다.
기간을 설정하지 않으면 웹 브라우저가 닫힐 때 쿠키도 같이 삭제된다.
new Cookie(String name, String value)(생성자) 이름과 값을 받아 새로운 쿠키를 생성한다.

이름을 설정하는 setName()은 없다. 그 이유는 쿠키의 이름은 생성자를 통해 설정하고, 생성 후에는 더 이상 이름을 변경할 수 없기 때문이다.

쿠키 정보를 읽는 메서드

메서드 설명
String getName() 쿠키의 이름을 반환
String getValue() 쿠키의 값을 반환
String getDomain() 쿠키가 적용되는 도메인을 반환
String getPath() 쿠키의 적용 경로를 반환
단, setPath()로 설정한 적이 없다면 null을 반환
int getMaxAge() 쿠키의 유지 기간을 반환
단, setMaxAge()로 설정한 적이 없다면 -1을 반환

쿠키 예제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head><title>Cookie</title></head>
<body>
    <h2>1. 쿠키(Cookie) 설정</h2>
    <%
    Cookie cookie = new Cookie("myCookie", "쿠키맛나요");  // 쿠키 생성
    cookie.setPath(request.getContextPath());  // 경로를 컨텍스트 루트로 설정
    cookie.setMaxAge(3600);  // 유지 기간을 1시간으로 설정
    response.addCookie(cookie);  // 응답 헤더에 쿠키 추가
    %>

    <h2>2. 쿠키 설정 직후 쿠키값 확인하기</h2>
    <%
    Cookie[] cookies = request.getCookies();  // 요청 헤더의 모든 쿠키 얻기
    if (cookies!=null) {
        for (Cookie c : cookies) {  // 쿠키 각각의
            String cookieName = c.getName();  // 쿠키 이름 얻기
            String cookieValue = c.getValue();  // 쿠키 값 얻기
            // 화면에 출력
            out.println(String.format("%s : %s<br/>", cookieName, cookieValue));
        }
    }
    %>

    <h2>3. 페이지 이동 후 쿠키값 확인하기</h2>
    <a href="CookieResult.jsp">
        다음 페이지에서 쿠키값 확인하기
    </a>
</body>
</html>

이름이 "myCookie"이고 값이 "쿠키맛나요"인 쿠키를 생성한 후, 경로와 유지 기간을 설정했다.

setPath()에서 설정한 경로는 request 내장 객체의 getContextPath()로 얻어온 컨텍스트 루트이다. 이클립스에서는 프로젝트명이 컨텍스트 루트로 사용되므로 "프로젝트명"이 반환되어 설정된다. 즉, 웹 애플리케이션 전체에서 쿠키를 사용하겠다는 의미

다음은 Cookie배열에 요청 헤더의 모든 쿠키를 담아서 향상된 for문을 통해서 쿠키의 이름과 값을 얻어서 화면에 출력한다.

하지만 이렇게 실행해도 쿠키의 이름은 보이지 않는다. 쿠키는 생성 직후에는 사용할 수 없기 때문이다. 쿠키는 서버에서 먼저 생성한후 응답 헤더를 통해 클라이언트로 전송한다. 이때 서버는 클라이언트의 요청에 의해 단지 쿠키를 만들기만 할 뿐 그 내용을 즉시 읽지 않는다. 클라이언트로부터 재요청이 들어올 때 요청 헤더를 통해 쿠키가 서버로 전송되는데 이때부터 내용을 읽을 수 있다.

 

쿠키값 확인 예제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CookieResult.jsp</title>
</head>
<body> 
    <h2>쿠키값 확인하기(쿠키가 생성된 이후의 페이지)</h2>
    <%
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (int i = 0; i < cookies.length; i++) {
            String cookieName = cookies[i].getName();
            String cookieValue = cookies[i].getValue();
            out.println(String.format("쿠키명 : %s - 쿠키값 : %s<br/>",
                                      cookieName, cookieValue));
        }        
    }
    %>
</body>
</html>

앞선 예제를 실행하면 클라이언트(웹 브라우저)는 서버로부터 쿠키를 받아 저장해두며, 쿠키값 확인 예제에서 링크를 클릭하면 이 쿠키를 요청 헤더에 담아 서버로 전송한다. 그리고 다시 처음 예제로 돌아가더라도 쿠키이름 값이 출력된다. 그리고 setMaxAge()로 설정한 1시간 동안은 웹 애플리케이션 전체에서 사용할 수 있다.

쿠키를 삭제할 때는 쿠키를 빈 값으로 설정하고 유지 기간을 0으로 부여하면 된다.

 

'Web > JSP' 카테고리의 다른 글

액션 태그(Action Tag)  (0) 2022.05.11
세션(Session)  (0) 2022.05.09
내장 객체의 영역 - page, request, session, application  (0) 2022.05.07
내장 객체의 영역 - 데이터 전송 객체(DTO)  (0) 2022.05.07
내장 객체의 영역  (0) 2022.05.07