쿠키에 대해서 설명하기 전에 웹 페이지 연동 시에 알아야 할 부분이 있습니다.
세션 트래킹(Session Tracking)
세션 트래킹이란 사용자 입장에서 웹 페이지 사이의 상태나 정보를 공유하도록 하기 위해 프로그래머가 구현해야 하는 웹 페이지 연결 기능입니다.
HTTP 프로토콜은 각 웹 페이지의 상태나 정보를 다른 페이지들과 공유하지 않는 stateless 방식으로 통신을 합니다.
따라서 웹 페이지나 서블릿끼리 상태가 정보를 공유하려면 웹 페이지 연결 기능, 즉 세선 트래킹을 이용해야 합니다.
웹 페이지를 연동하는 방법 중 쿠키를 이용하는 방법과 세션을 이용하는 방법이 있습니다.
쿠키 : 클라이언트 PC 의 Cookie 파일에 정보를 저장한 후 웹 페이지들이 공유합니다.
세션 : 서버 메모리에 정보를 저장한 후 웹 페이지들이 공유합니다.
쿠키(Cookie)
쿠키란 웹 페이지들 사이의 공유 정보를 클라이언트 PC 에 저장해 놓고 필요할 때 여러 웹 페이지들이 공유해서 사용할 수 있도록 매개 역할을 하는 방법입니다.
쿠키는 클라이언트 PC 에 정보를 저장해서 사용하므로 보안에 취약합니다.
따라서 쿠키를 이용한 방법은 주로 보안과 무관한 경우에 한해 사용합니다.
예를 들어 각 사이트의 로그인 시에 ID 를 저장해두는 경우나 팝업창이 생성됐을 때 오늘 하루 열지 않기 등의 설정 시에 사용할 수 있습니다.
쿠키는 다음과 같이 두 종류로 나눌 수 있습니다.
속성 | Persistence Cookie | Session Cookie |
생성 위치 | 파일로 생성 | 브라우저 메모리에 생성 |
종료 시기 | 쿠키를 삭제하거나 쿠키 설정 값이 종료된 경우 | 브라우저를 종료한 경우 |
최초 접속 시 전송 여부 | 최초 접속 시 서버로 전송 | 최초 접속 시 서버로 전송되지 않음 |
용도 | 로그인 유무, 팝업창 제한, ID 저장 등 | 사이트 접속 시 Session 인증 정보를 유지할때 |
Session 쿠키는 세선 기능과 같이 사용됩니다.
쿠키 API
javax.servlet.http.Cookie 객체를 이용합니다.
HttpServletResponse 의 addCookie() 메서드를 이용해 클라이언트 브라우저에 쿠키를 전송한 후 저장합니다.
HttpServletReqeust 의 getCookie 메서드를 이용해 쿠키를 서버로 가져옵니다.
Cookie 클래스에서 제공하는 메서드는 다음과 같습니다.
메서드 | 기능 |
getComment() | 쿠키에 대한 설명을 가져옵니다. |
getDomain() | 쿠키의 유요한 도메인 정보를 가져옵니다. |
getMaxAge() | 쿠키 유효 기간을 가져옵니다. |
getName() | 쿠키 이름을 가져옵니다. |
getPath() | 쿠키의 디렉터리 정보를 가져옵니다. |
getValue() | 쿠키의 설정 값을 가져옵니다. |
setComment(String comment) | 쿠키에 대한 설명을 설정합니다. |
setDomain(String domain) | 쿠키의 유요한 도메인을 설정합니다. |
setMaxAge(int age) | 쿠키 유효 기간을 설정합니다. |
setValue(String value) | 쿠키 값을 설정합니다. |
쿠키 생성 시 setMaxAge() 메서드 인자 값의 종류를 지정할 수 있는데 이 인자 값을 양수로 지정하면 파일로 저장하는 Persistence 쿠키로 저장이 되고, 음수나 setMaxAge() 함수를 사용하지 않으면 메모리에만 저장하는 Session 쿠키로 저장됩니다.
서블릿에서 쿠키 사용
서블릿에서 쿠키 API 를 사용하여 직접 쿠키를 만들어 보겠습니다.(쿠키라고 하니 굽는 쿠키가 자꾸 생각이 나네요. 하.하.)
먼저 쿠키를 설정하는 예제입니다.
@WebServlet("/set")
public class SetCookieValue extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Date d = new Date();
Cookie c = new Cookie("cookieTest", URLEncoder.encode("서블릿에서 쿠키 사용 참 쉽죠?", "utf-8"));
c.setMaxAge(24 * 60 * 60); // 양수이므로 PC 에 파일로 쿠키 저장
response.addCookie(c); // 생성된 쿠키를 브라우저로 전송
out.println("Current Time : " + d);
out.println("<br> 문자열을 쿠키에 저장하였습니다.");
}
다음 저장된 쿠키를 가져오는 예제입니다.
@WebServlet("/get")
public class GetCookieValue extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Cookie[] allValues = request.getCookies();
for (int i = 0; i < allValues.length; i++) {
if (allValues[i].getName().equals("cookieTest")) {
out.println("<h2>Cookie 값 : " + URLDecoder.decode(allValues[i].getValue(), "utf-8"));
}
}
}
}
모두 저장한 후 웹 브라우저에 /set 을 요청하면 쿠키가 저장된 것을 확인하실 수 있습니다.
이제 저장한 쿠키를 불러오기 위해서 /get 을 요청하면 저장했던 쿠키가 출력되는 것을 확인할 수 있습니다.
쿠키 생성 상태를 확인하려면 개발자도구(F12) - Applicaion - Cookie - http://localhost:8090 클릭해서 확인할 수 있습니다.
쿠키의 파일 저장이 아닌 메모리에 저장하려면 위의 SetCookieValue.java 파일의 c.setMaxAge 의 인자 값을 -1 로 설정하면 파일로 저장하지 않고 메모리에 저장하게 됩니다.(결과는 동일)
쿠키를 이용한 팝업 제한
팝업창 제어는 서버에서 쿠키를 다루지 않고 자바스크립트를 이용해 쿠키에 접근하여 사용합니다.
먼저 메인 웹 브라우저에서 보여줄 HTML 파일을 작성합니다.
<html>
<head>
<meta charset="UTF-8">
<title>팝업 제한 메인</title>
<script type="text/javascript">
// 페이지 로드 이벤트 처리
window.onload = pageLoad;
function pageLoad() {
// 저장된 쿠키 읽어오기
notShowPop = getCookieValue(); // 쿠키 정보를 가져옴
if (notShowPop != "true") { // 팝업제한이 true 이면 팝업을 띄우지 않고 아니면 팝업을 띄움
window.open("popUp.html",
"pop",
"width=600,height=400,history=no,resizable=no,status=no,scrollbars=yes,menubar=no");
}
}
// 쿠키 읽어오는 함수
function getCookieValue() {
var result = "false";
// 쿠키 여부 확인
if (document.cookie != "") {
cookie = document.cookie.split(";");
for (var i = 0; i < cookie.length; i++) {
element = cookie[i].split("=");
value = element[0];
value = value.replace(/^\s*/, ''); // 정규표현식 공백 제거
if (value == "notShowPop") { // key 가 일치하면
result = element[1]; // 값을 result 에 할당해서 반환
}
}
}
return result;
}
// 쿠키 삭제 함수
function deleteCookie() {
document.cookie = "notShowPop=" + "false" + ";path=/; expires=-1";
}
</script>
</head>
<body>
<form>
쿠키를 삭제하려면 아래 버튼을 클릭하세요.<br>
<input type=button value="쿠키삭제" onClick="deleteCookie()">
</form>
</body>
</html>
이제 체크하면 띄워지지 않을 팝업창을 만듭니다.
<html>
<head>
<meta charset="UTF-8">
<title>팝업창</title>
<script type="text/javascript">
function setPopUpStart(obj) {
if (obj.checked == true) { // checkbox 가 체크가 되어 있으면
var expireDate = new Date();
var days = 1;
expireDate.setDate(expireDate.getDate() + days);
// document.cookie 에 넣기
document.cookie = "notShowPop=" + "true" + ";path=/; expires="
+ expireDate.toGMTString();
window.close();
}
}
</script>
</head>
<body>
체크하면 팝업창은 다음 기회에..
<br>
<br>
<br>
<br>
<br>
<form>
<input type=checkbox onClick="setPopUpStart(this)">오늘 하루 보지 않기
</form>
</body>
</html/>
모두 저장한 다음 /popuptest.html 을 요청합니다.
팝업창이 생성되는 것을 확인하실 수 있습니다.
여기서 팝업창의 "오늘 하루 보지 않기" 를 체크한 후 다시 웹 브라우저를 요청합니다.
팝업창이 나타나지 않는 것을 확인하실 수 있습니다.
쿠키삭제 버튼을 클릭하게 되면 팝업창은 다시 되살아납니다...
여기까지 임미다.
'개발 > Java' 카테고리의 다른 글
[JAVA - WEB] JSP 스크립트 요소 (0) | 2022.11.06 |
---|---|
[JAVA - WEB] JSP 정의와 구성 요소 (0) | 2022.11.06 |
[JAVA - WEB] 서블릿 리스너(Listener) (0) | 2022.11.05 |
[JAVA - WEB] 서블릿 필터(Filter) (0) | 2022.11.05 |
[JAVA - WEB] 세션(Session) (1) | 2022.11.03 |
[JAVA - WEB] 서블릿 바인딩(binding) (0) | 2022.11.02 |
[JAVA - WEB] 서블릿 포워드(forward) (0) | 2022.11.02 |
[JAVA - WEB] 서블릿과 데이터베이스 (0) | 2022.11.02 |
[ Eclipse ] 소스 정렬 방법 (0) | 2022.11.01 |
[JAVA - WEB] 서블릿 요청 및 데이터 전송 (1) | 2022.10.31 |