IT/JAVA

Cookie는 왜쓰는가? 그리고 Cookie관련 간단한 자바 예제

주현태 2022. 3. 6. 14:17

과거의 나는 쿠키라고 하면 나는 일단, 맛있는 쿠키가 생각난다. 하지만, 지금같이 개발자로 일하고 있는 경우에는 쿠키라 하면, IT 용어로서의 쿠키가 생각나는게 현실이다. 그러면 쿠키가 무엇인지 IT 용어사전을 통해 검색을 해보자.

 

쿠키(영어: cookie)란 하이퍼 텍스트의 기록서(HTTP)의 일종으로서 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일을 일컫는다. HTTP 쿠키, 웹 쿠키, 브라우저 쿠키라고도 한다. 이 기록 파일에 담긴 정보는 인터넷 사용자가 같은 웹사이트를 방문할 때마다 읽히고 수시로 새로운 정보로 바뀐다.

 

 

위와같이 인터넷에 정의되어 있다. 일단, 쿠키를 사용하는 이유는 HTTP는 기본적으로 Connectionless이다. 뭐냐면, 만약 우리가 브라우러를 통해 어떤 사이트에 들어가면 화면이 나오는 것을 생각할 수 있을것이다.

 

 

이러한 화면이 나오기 위해서는 서버로부터 html, css, js등의 파일을 전달 받아야 하는데, 이를 위해서는 당연히 브라우저 - 서버간 연결이 되어야 이러한 파일들을 내려받을 수 있을 것이다.

 

 

HTTP의 경우 이러한 파일들을 내려받고 이 연결을 끊는데 이렇게 종단간 연결을 유지하지 않고 끊는다는 의미로 Connectionless라고 부른다. (Keep Alive설정등을 통해 바로 연결을 안끊는 방법이 있긴 하다.)

 

 

다시 돌아와서, 쿠키가 왜 필요한 것일까? 이렇게 종단간 연결을 끊기 때문에 서버는 클라이언트가 현재 로그인이 된 상태인지, 로그인한 사람은 누구인지, 그리고 어떠한 권한을 갖고있는지 등의 상태정보를 알 길이 없다.

 

 

클라이언트의 상태정보를 알기 위해 서버는 클라이언트에게 쿠키라는 값을 전달해 주고, 클라이언트는 이를 로컬에 저장하여 또 다시 서버에 접근시에는 쿠키를 전달하여 클라이언트의 상태 정보를 전달해 주기위해 쿠키라는 것을 사용하게 된다.

 

 

서버는 클라이언트의 브라우저에게 쿠키를 설정하기 위해 다음과 같이 HTTP response 헤더에 Set-Cookie를 이용하여 쿠키값을 ;(세미콜론)을 delimeter(구분자)로 키=값 형태로 보내게 된다.

GET /index.html HTTP/1.1
Host: www.juhyeontae.com
Cookie: user=juhyeontae;Domain=.juhyeontae.com
Accept: text/html

브라우저에서 쿠키의 값을 확인할 수 있는데 크롬의 경우 개발자도구를 열고 Application > Cookies에서 확인할 수 있다.

 

자바 코드로는 아래와 같은 방식으로 Cookie값을 얻어올 수 있다.

package web;

import java.net.*;
import java.util.List;

public class CookieTest
{
    public static void main (String[] args) throws Exception
    {
        final CookieManager cookieManager = new CookieManager();
        cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
        CookieHandler.setDefault(cookieManager);

        final CookieStore cookieStore = cookieManager.getCookieStore();
        final List<HttpCookie> cookies = cookieStore.getCookies();
        System.out.println("----- URL로부터 데이터를 가져오기 전 -----");
        System.out.println("cookie Size : " + cookies.size());
        for (HttpCookie httpCookie : cookies)
        {
            System.out.printf("Cookie : %s%n", httpCookie);
        }

        URL url = new URL("http://www.google.com");
        final URLConnection urlConnection = url.openConnection();
        urlConnection.getContent();

        System.out.println("----- URL로부터 데이터를 가져온 후 -----");
        System.out.println("cookie Size : " + cookies.size());
        for (HttpCookie httpCookie : cookies)
        {
            System.out.printf("Cookie : %s%n", httpCookie);
        }
    }
}

 

결과