쿠키: 웹 브라우저가 보관하는 데이터.
쿠키는 웹 브라우저가 웹 서버에게 요청을 보낼 때 쿠키를 함께 전송함으로써, 웹 서버가 필요한 데이터를 읽을 수 있도록 한다.
한 번 생성된 쿠키는 삭제되기 전까지 웹 서버에 요청을 보낼 때면 항상 함께 전송되므로, 웹 어플리케이션을 사용하면서 지속적으로 유지해야 하는 정보를 저장하기에 용이하다.
쿠키는 웹 서버와 웹 브라우저 양쪽 모두 생성할 수 있다.
(출처: JSP 2.3 웹 프로그래밍, 최범균 저)
JSP에서 생성하는 쿠키는, 웹 서버에서 생성하는 쿠키이다.
쿠키의 값을 변경할 때에는, 변경하고자 하는 쿠키와 같은 이름, 다른 값(자신이 변경고 싶은 값)으로 생성한 뒤, 쿠키를 response 객체에 추가시키면 된다.
//english_name 이라는 쿠키의 값이 "Finn"이라고 가정하자.
Cookie c = new Cookie("english_name", "Jake");
request.addCookie(c);
여기서 의문점이 하나 들었다. 기존 쿠키의 값을 setValue(String value) 메소드를 통해 다시 지정할 수는 없을까? 시도해 보았다.
//Cookie cookie = new Cookie("english_name", "Jake");
//response.addCookie(cookie);
cookies[i].setValue("Jake");
response.addCookie(cookies[i]);
확인해 보니 쿠키의 값이 정상적으로 변경되었다. 개발자 도구를 사용해 응답 헤더를 확인해 보았다.
정상적으로 Set-Cookie 헤더 값이 포함된 것을 확인할 수 있다.
부차적으로 의문이 든 게 하나 있었다. response.addCookie() 메소드를 꼭 사용해야 할까? setValue() 메소드를 사용했으니 필요 없지 않을까?
나와 응답 헤더의 대답은 "No. 필요하다."이다. 이유는 아래 유효시간에서 생기는 의문점에서 같이 확인해보자.
위에서 소개한 과정을 통해 생성된 쿠키는 유효시간을 가진다. 유효시간 동안, 웹 브라우저가 종료되어도 쿠키는 삭제되지 않고 존재하며, 다시 서버에 전송될 수 있다.
유효시간을 지정하기 위한 메소드는 setMaxAge(long expiry) 메소드를 사용하게 된다. (파라미터는 초 단위.)
ex) cookie.setMaxAge(60) => 쿠키의 유효시간을 1분으로 설정.
*쿠키의 유효시간을 활용하여 내 아이디 기억하기 OR 자동 로그인 기능을 구현한다고 한다. (출처: "JSP 2.3 프로그래밍" 저: 최범균)
Q1: 쿠키의 유효시간을 설정하지 않으면 어떻게 되나요?
A1: 쿠키의 유효시간의 기본값은 -1입니다. 유효시간이 음수로 설정되어 있다면, 클라이언트로 쿠키가 전송되고 웹 브라우저가 종료될 때 쿠키가 함께 삭제된답니다.
Q2: 쿠키의 유효시간을 0으로 설정하면 어떻게 되나요?
A2: 쿠키를 바로 삭제(무효화)합니다. 참고로, Cookie 클래스는 쿠키를 삭제하는 기능을 따로 제공하지 않아서, 쿠키를 삭제하고자 할 때는 setMaxAge(0)을 호출해야 합니다.쿠키 삭제 예시)
cookies[i].setMaxAge(0);
response.addCookie(cookies[i]);
여기서 위 쿠키 변경에서도 생겼던 동일한 의문점이 하나 들었다. 쿠키의 값, 유효 시간 등 기존 쿠키의 구성 요소를 변경 후, response.addCookie(Cookie cookie) 메소드 호출은 필수적인 것인가?
대답은 "Yes. 필수적이다."이다. 근거는 위 의문점에서도 미뤄뒀던 이유와 동일하다. 바로 살펴보도록 하자.
우선, 알아야 할 정보가 있다. 쿠키는 응답 헤더(Response Headers)를 사용해서 웹 브라우저에 전달된다. 위 response Headers 캡쳐 화면에 Set-Cookie 헤더 값이 쿠키의 정보이다. 쿠키를 삭제하였을 경우의 response Headers도 보여주겠다.
보다시피, 쿠키는 response.addCookie() 메소드를 실행함으로써 Set-Cookie 헤더를 통해서 전달되는 것이다. 하지만, response.addCookie(Cookie cookie) 메소드를 호출하지 않을 경우 위 Set-Cookie 헤더는 생성되지 않는 것을 확인하였다. 따라서 쿠키의 구성 요소를 변경 후에는 response.addCookie(Cookie cookie) 메소드를 호출해야 해당 변경 사항이 정상적으로 반영된다.