티스토리 뷰

2) 쿠키란?

쿠키 정의

  • 클라이언트 단에 저장되는 작은 정보의 단위입니다.
  • 클라이언트에서 생성하고 저장될 수 있고, 서버 단에서 전송한 쿠키가 클라이언트에 저장될 수 있습니다.
  • 쿠키는 자체적으로 key 하나와 value 하나, 이렇게 값을 가지고 있습니다.

이용 방법

  • 서버에서 클라이언트의 브라우저로 전송되어 사용자의 컴퓨터에 저장합니다.
  • 저장된 쿠키는 다시 해당하는 웹 페이지에 접속할 때, 브라우저에서 서버로 쿠키를 전송합니다.
  • 쿠키는 이름(name)과 값(value) 쌍으로 정보를 저장합니다.
    이름-값 쌍 외에도 도메인(Domain), 경로(Path), 유효기간(Max-Age, Expires), 보안(Secure), HttpOnly 속성을 저장할 수 있습니다.

쿠키는 그 수와 크기에 제한

javax.servlet.http.Cookie

  • 서버에서 쿠키 생성, Reponse addCookie메소드를 이용해 클라이언트에게 전송
  • 쿠키는 (이름, )의 쌍 정보를 입력하여 생성합니다.
  • 쿠키의 이름은 일반적으로 알파벳과 숫자, 언더바로 구성합니다. 정확한 정의를 알고 싶다면 RFC 6265(https://tools.ietf.org/html/rfc6265) 문서 [4.1.1 Syntax] 항목을 참조하세요.
  • 쿠키는 기본적으로 이름과 값을 가지게 되는데 쿠키의 생성자를 보면 이름과 값을 받아들여서 생성을 하는 것을 알 수 있습니다.
  • 이렇게 생성한 쿠키는 response가 가지고 있는 addCookie()라는 메서드에 인자로 넘겨주면 웹 클라이언트 쪽으로 전송을 하게 됩니다.
  • 웹 클라이언트는 쿠키를 응답으로 받으면 자동으로 서버별로 쿠키를 클라이언트에게 저장하게 됩니다.
  • 주의해야 될 점은 쿠키의 이름은 알파벳과 숫자로만 구성이 된다는 것입니다. 그래서 혹시 쿠키의 값을 영문이 아닌 한글로 저장하고 싶은 경우에는 반드시 인코딩해서 쿠키를 보내고 받아온 쿠키는 다시 디코딩해서 봐야 한글의 값을 알아볼 수 있을 겁니다.

Cookie cookie = new Cookie(이름, 값);

response.addCookie(cookie);

 

클라이언트가 보낸 쿠키 정보 읽기

Cookie[] cookies = request.getCookies();

 

  • 쿠키 값이 없으면 null이 반환됩니다.
  • Cookie가 가지고 있는 getName() getValue() 메서드를 이용해서 원하는 쿠키정보를 찾아 사용합니다.
  • 웹 클라이언트는 이 쿠키를 만들어준 서버한테 다시 요청을 보내게 될 때 자동으로 해당 쿠키들을 같이 보냅니다. 그리고 서버는 요청으로부터 전달된 쿠키를 읽어서 사용을 하게 됩니다.
  • 이런 쿠키를 얻기 위해선 HttpServletRequest가 가지고 있는 getCookies()라는 메서드를 이용하면 웹 클라이언트가 보낸 쿠키의 정보들을 읽어낼 수 있습니다.
  • 그런데 이때 잘 보면 getCookies() return 타입으로 쿠키의 배열이 return되어 오는 것을 볼 수 있습니다. 배열로 오는 이유는 하나의 서버가 쿠키를 여러 개 보낼 수 있으며 클라이언트는 쿠키를 보낼 때 이 서버가 보낸 쿠키를 모두 같이 보내기 때문입니다.
  • 그래서 이렇게 쿠키의 배열로 받아들여야 합니다. 주의하셔야 될 점은 만약에 해당 쿠키 값이 없다면 null return 하게 된다는 것입니다.
  • 그래서 쿠키를 얻어와서 cookies 배열을 사용할 때 반드시 null 부분을 생각해서 코드를 만들어야 합니다. NullPointerException 같은 것들이 발생되지 않게 말입니다.

클라이언트에게 쿠키 삭제 요청

  • 쿠키를 삭제하는 명령은 없고, maxAge 0인 같은 이름의 쿠키를 전송합니다.
  • 클라이언트가 가진 쿠키를 서버 쪽에서 삭제할 수 있는 명령은 없습니다. 쿠키는 웹 클라이언트가 관리하기 때문입니다.
  • 서버가 쿠키를 삭제하는 명령을 따로 가질 수가 없기 때문에 쿠키를 삭제하고 싶다면 똑같은 이름의 쿠키를 하나 만들어서 setMaxAge()라는 메서드를 이용하여 값을 0으로 바꿔주고 이 쿠키를 다시 클라이언트 쪽에 보내주면 삭제됩니다.
  • 클라이언트 쪽에 똑같은 이름을 가진 쿠키를 두 개 가질 수는 없기 때문에 같은 이름의 쿠키가 다시 전송이 되어오면 쿠키 자체를 교체합니다그런데 유지 시간이 0이기 때문에 해당 쿠키가 없어집니다.
  • 다시 정리하면 유지하고 있던 정보를 이제 그만 유지하고 싶다면 위의 방법으로 클라이언트가 가지고 있는 쿠키를 삭제할 수 있습니다.
  • 위에서처럼 쿠키를 웹 클라이언트에게 전송하기 전에 setMaxAge() 메서드를 이용하게 되면 쿠키의 유효시간을 지정할 수 있습니다setMaxAge() 메서드의 인자로는 정수형을 가질 수 있는데 이때 나오는 숫자가 초 단위라고 생각을 하면 됩니다.

Cookie cookie = new Cookie("이름", null);

cookie.setMaxAge(0);

response.addCookie(cookie);

 

쿠키의 유효기간 설정

  • 메소드 setMaxAge()
    -
    인자는 유효기간을 나타내는 초 단위의 정수형
    -
    만일 유효기간을 0으로 지정하면 쿠키의 삭제
    -
    음수를 지정하면 브라우저가 종료될 때 쿠키가 삭제
  • 유효기간을 10분으로 지정하려면
    - cookie.setMaxAge(10 * 60); //
    초 단위 : 10
    - 1
    주일로 지정하려면 (7*24*60*60)로 설정합니다.

반환형

메소드 이름

메소드 기능

int

setMaxAge(int value)

쿠키의 최대지속 시간을 초단위로 지정

-1 일 경우 브라우저가 종료되면 쿠키를 만료

int

getMaxAge()

해당 쿠키의 유효기간을 알아낼 수 있음.

String

getName()

쿠키의 이름을 스트링으로 반환

String

getValue()

쿠키의 값을 스트링으로 반환

void

setValue(String newValue)

쿠키에 새로운 값을 설정할 때 사용

 

Spring MVC에서의 Cookie 사용

  • @CookieValue 애노테이션 사용
    -
    쿠키 값을 컨트롤러에서 쉽게 읽어들일 수 있는 방법을 제공.
    -
    컨트롤러 메소드의 파라미터에서 CookieValue애노테이션을 사용함으로써 원하는 쿠키정보를 파라미터 변수에 담아 사용할 수 있습니다.
  • 컨트롤러메소드(@CookieValue(value="쿠키이름", required=false, defaultValue="기본값") String 변수명)

생각해보기

  • 이번 시간엔 쿠키에 대해 배웠습니다. 쿠키는 브라우저별로 웹 사이트당 정해진 개수가 있다는 것을 알았습니다. 쿠키를 만든 사람은 왜 이런 제약을 주었을까요?

참고 자료

[참고링크] Cookie (Servlet API Documentation)
https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/Cookie.html

[참고링크] Cookies in Servlet                 https://www.javatpoint.com/cookies-in-servlet

[참고링크] Browser Cookie Limits                      http://browsercookielimits.squawky.net/

Comments