쿠키(Cookie)

JSP 2016. 3. 8. 12:47

쿠키(Cookie)

'쿠키(cookie)'는 웹 브라우저가 보관하고 있는 데이터로서 웹 서버에 요청을 보낼 때 함께 전송된다.


동작 방식




1. 쿠키의 구성


1) 구성 요소

- 이름 : 각각의 쿠키를 구별하는 데 사용되는 이름

- 값 : 쿠키의 이름과 관련된 값

- 유효시간 : 쿠키의 유지 시간

- 도메인 : 쿠키를 전송할 도메인

- 경로 : 쿠키를 전송할 요청 경로


2) 쿠키 이름의 제약

- 쿠키의 이름은 아스키 코드의 알파벳과 숫자만을 포함할 수 있다.

- 콤마(,), 세미콜론(;), 공백(' ') 등의 문자는 포함할 수 없다.

- '$'로 시작할 수 없다.




2. JSP에서 쿠키 생성 / 읽기


1) Cookie 클래스를 이용해서 쿠키 생성

<%

    Cookie cookie = new Cookie("cookieName", "cookieValue");

    response.addCookie(cookie);

%>



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

Cookie[] cookies = request.getCookies();



읽기 관련 주요 메서드

getName() : 쿠키의 이름을 구한다.

getValue() : 쿠키의 값을 구한다.




예제) 쿠키 생성하기 makeCookie.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8"%>

<%

Cookie cookie = new Cookie("name", "Hong");

response.addCookie(cookie);

%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>쿠키 생성</title>

</head>

<body>

<ul>

<li>쿠키의 이름 = <%= cookie.getName() %></li> 

<li>쿠키의 값 = "<%=cookie.getValue() %>"</li>

</ul>

</body>

</html>

  • 쿠키의 이름 = name
  • 쿠키의 값 = "Hong"



예제) 쿠키 읽어오기 viewCookie.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8"%>

<%@ page import = "java.net.URLDecoder" %> 한글을 표시하기 위해 Decoder 사용

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Cookie 정보 보기</title>

</head>

<body>

<h3>쿠키 목록</h3>

<%

Cookie[] cookies = request.getCookies();

if(cookies != null && cookies.length > 0) {

for (Cookie cookie : cookies) {

%>

<ul>

<li>쿠키이름: <%= cookie.getName() %></li>

<li>쿠키값: <%= URLDecoder.decode(cookie.getValue(), "utf-8") %></li>

</ul>

<%

}

}

%>

</body>

</html>

쿠키 목록

  • 쿠키이름: JSESSIONID
  • 쿠키값: EA94C79163E7587A083F76569EFBFDAD
  • 쿠키이름: only
  • 쿠키값: onlycookie
  • 쿠키이름: name
  • 쿠키값: 홍길동





3) 쿠키 값 변경 modifyCookie.jsp

기존에 존재하는 지 확인 후, 쿠키 값 새로 설정


<%@page import="java.net.URLEncoder"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.net.URLEncoder" %>
<%
Cookie[] cookies = request.getCookies();
if(cookies !=null && cookies.length > 0) {
for (Cookie cookie : cookies) {
if(cookie.getName().equals("name")) {
Cookie cookie1 = 
new Cookie("name", URLEncoder.encode("CHANGE", "UTF-8"));
response.addCookie(cookie1);
}
%>
쿠키이름: <%= cookie.getName() %><br />
쿠키값: <%= cookie.getValue() %><br />
<%
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>

쿠키이름: JSESSIONID
쿠키값: EA94C79163E7587A083F76569EFBFDAD
쿠키이름: only
쿠키값: onlycookie
쿠키이름: name
쿠키값: CHANGE 

쿠키값이 새롭게 넣은 'CHANGE'로 바뀐다.
단순히 쿠키 내용값만 바꾸고 싶으면 setValue를 쓰면 된다. 
키값과 밸류값을 모두 바꾼다면 위와 같이 하면 된다.




4) 쿠키 삭제

쿠키 삭제 기능은 별도로 제공하지 않으며, 유효 시간을 0으로 지정해준 후 응답 헤더에 추가해주면, 웹브라우저가 관련 쿠키를 삭제.


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ page import = "java.net.URLEncoder" %>

<%

Cookie[] cookies = request.getCookies();

if(cookies !=null && cookies.length > 0) {

for (Cookie cookie : cookies) {

if(cookie.getName().equals("name")) {

Cookie cookie1 = new Cookie("name", "");

cookie1.setMaxAge(0); // 유효시간 0으로 지정되어 해당 name 쿠키 삭제됨.

response.addCookie(cookie1);

}

}

}

%>    

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>쿠키 삭제</title>

</head>

<body>


</body>

</html>



5) 쿠키의 도메인과 경로


기본적으로 쿠키는 그 쿠키를 생성한 서버에만 전송


도메인 지정 시, 해당 도메인에 쿠키 전달

- Cookie.setDomain()으로 쿠키 설정

- 도메인 형식

.somehost.com : 점으로 시작하는 경우 관련 도메인에 모두 쿠키를 전송한다.

www.somehost.com : 특정 도메인에 대해서만 쿠키를 전송한다.


웹 브라우저는 도메인이 벗어난 쿠키는 저장하지 않음

쿠키 도메인에 따라 쿠키가 전달


only 쿠키를 javacan.madvirus.net 서버에서 생성했다고 한 경우



자기 서버의 도메인 임시로 변경

Windows 7/8에서 C:\Windows\System32\driver\etc 폴더에서 host 파일에 

127.0.0.1 www.somehost.com을 추가한다. 그러면 자신의 로컬호스트가 입력한 주소로 인식한다.

(127.0.0.1은 자기 컴퓨터의 주소) 즉, http://localhost가 입력한 도메인으로 인식하게 된다.


예제) 서로 다른 3개의 설정을 가진 3개의 쿠키를 생성 makeCookieWithDomain.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
Cookie cookie1 = new Cookie("id", "madvirus");
cookie1.setDomain(".somehost.com");  // .somehost.com이라는 도메인에 해당 쿠키를 전송 
response.addCookie(cookie1);

Cookie cookie2 = new Cookie("only", "onlycookie");
response.addCookie(cookie2);  // 도메인을 지정하지 않음

Cookie cookie3 = new Cookie("invalid", "invalidcookie");
cookie3.setDomain("javacan.tistory.com");
// javacon.tistory.com이라는 도메인에 해당 쿠키를 전송하지만 내 서버가 아니므로 무용지물.
response.addCookie(cookie3);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키 생성</title>
</head>
<body>
<%= cookie1.getName() %> = <%= cookie1.getValue() %>
[<%= cookie1.getDomain() %>]
<br />
<%= cookie2.getName() %> = <%= cookie2.getValue() %>
[<%= cookie2.getDomain() %>]
<br />
<%= cookie3.getName() %> = <%= cookie3.getValue() %>
[<%= cookie3.getDomain() %>]
</body>
</html>

http://www.somehost.com:8095/chap09/makeCookieWithDomain.jsp
id = madvirus [.somehost.com] 
only = onlycookie [null] 
ivonly = onlycookie [javacan.tistory.com]

쿠키는 그 쿠키를 생성한 서버에만 전송된다. 같은 도메인을 사용하는 모든 서버에 쿠키를 보낼 수 있으므로 
.somehost.com 이렇게 앞에 점을 붙여 지정하면 앞에 mail.somehost.com이나 www.somehost.com이나 javacan.somehost.com 등 앞에 여러가지가 오는 모든 도메인에 모두 쿠키를 전송할 수 있다. 점 앞도 확실히 입력하면 딱 해당 도메인으로만 전송된다.
자기 서버의 host에 
127.0.0.1 www.javacan.somehost.com
127.0.0.1 www.somehost.com
이렇게 넣어두면 해당 도메인으로는 서버를 전송하게 된다.

http://javacan.somehost.com:8095/chap09/viewCookie.jsp

쿠키 목록

  • 쿠키이름: id
  • 쿠키값: madvirus
viewCookie.jsp를 브라우저에서 입력해보면 makeCookieWithDomain.jsp에서 입력한 name과 value인 id, madvirus가 넘어온 것을 확인할 수 있다.




6) 쿠키의 경로 / 유효 시간

경로 설정 시 해당 경로를 기준으로 쿠키 전달
- 경로 미 설정 시, 요청 URL의 경로에 대해서만 쿠키 전달
- 경로 설정 시, 설정한 경로 및 그 하위 경로에 대해서 쿠키 전달
-  Cookie.setPath()로 경로 설정

유효 시간
- 유효 시간 미 지정 시, 웹 브라우저 닫을 때 쿠키도 함께 삭제
- Cookie.setMaxAge()로 쿠키 유효 시간 설정
유효 시간이 지나지 않을 경우 웹 브라우저를 닫더라도 쿠키가 삭제되지 않고, 이후 웹 브라우저를 열었을 때 해당 쿠키 전송됨
유효 시간 : 초 단위로 설정

예제) setCookieWithPath.jsp
path1과 path2라는 하위 폴더를 만들고, setCookieWithPath.jsp는 path1에 넣어서 실행한다.

<%@ page contentType = "text/html; charset=utf-8" %>
<%@ page import = "java.net.URLEncoder" %>
<%
Cookie cookie1 = new Cookie("path1", 
URLEncoder.encode("경로:/chap09/path1", "utf-8"));
cookie1.setPath("/chap09/path1"); // path1 경로로 쿠키 전송
response.addCookie(cookie1);
Cookie cookie2 = new Cookie("path2", 
URLEncoder.encode("경로:", "utf-8"));
response.addCookie(cookie2);  // 경로 지정을 안하면 실행한 경로 안에서 쿠키 전송
Cookie cookie3 = new Cookie("path3",
URLEncoder.encode("경로:/", "utf-8"));
cookie3.setPath("/");  // 프로젝트의 모든 경로로 쿠키 전송
response.addCookie(cookie3);

Cookie cookie4 = new Cookie("path4",
URLEncoder.encode("경로:/chap09/path2", "utf-8"));
cookie4.setPath("/chap09/path2"); // path2 경로로 쿠키 전송
response.addCookie(cookie4);
%>
<html>
<head><title>쿠키 경로 지정</title></head>
<body>
다음과 같이 쿠키를 생성했습니다.<br>
<%= cookie1.getName() %>=<%= cookie1.getValue() %>
[<%= cookie1.getPath() %>]
<br>
<%= cookie2.getName() %>=<%= cookie2.getValue() %>
[<%= cookie2.getPath() %>]
<br>
<%= cookie3.getName() %>=<%= cookie3.getValue() %>
[<%= cookie3.getPath() %>]
<br>
<%= cookie4.getName() %>=<%= cookie4.getValue() %>
[<%= cookie4.getPath() %>]
</body>
</html>

path1과 path2에 cookieView.jsp를 넣어 각각 실행해보면 넘어온 쿠키값과 넘어오지 않은 쿠키값이 구분된다.


http://localhost:8095/chap09/path1/viewCookie.jsp

쿠키 목록

  • 쿠키이름: path1
  • 쿠키값: 경로:/chap09/path1
  • 쿠키이름: path2
  • 쿠키값: 경로:
  • 쿠키이름: JSESSIONID
  • 쿠키값: 6B05A59B1119B135A8F0396AD9BA761A
  • 쿠키이름: path3
  • 쿠키값: 경로:/

http://localhost:8095/chap09/path2/viewCookie.jsp

쿠키 목록

  • 쿠키이름: path4
  • 쿠키값: 경로:/chap09/path2
  • 쿠키이름: JSESSIONID
  • 쿠키값: 6B05A59B1119B135A8F0396AD9BA761A
  • 쿠키이름: path3
  • 쿠키값: 경로:/



Posted by netyhobby
,