웹 서버는 쿠키를 이용해서 웹 브라우저에 정보를 전송할 수 있다. 쿠키를 전달 받은 웹 브라우저는 이후 웹 섭에 요청을 보낼 때 쿠키를 함께 전송한다. 쿠키를 사용하면 웹 서버와 웹 브라우저가 필요한 값을 공유하고 상태를 유지할 수 있다.
쿠키 사용하기
쿠키는 웹 브라우저를 보관하는 데이터이다. 웹 브라우저는 웹 서버에 요청을 보낼 때 쿠키를 함께 전송하며, 웹 서버는 웹 브라우저가 전송한 쿠키를 사용해서 필요한 데이터를 읽을 수 있다.
쿠키의 동장 방식은 아래와 같다.
1. 쿠키 생성 --요청--> 웹서버
<--쿠키,응답
쿠키 저장소
2. 쿠키 생성 웹서버
쿠키 저장소
쿠키
3. 쿠키 생성 --요청,쿠키--> 웹서버
쿠키 저장소
쿠키
1. 생성 웹 서버 측에서 쿠키를 생성하고 이 쿠키를 응답 데이터의 헤더에 저장해서 웹 브라우저에 전송한다.
2. 저장 웹 브라우저는 응답 데이터에 포함된 쿠키를 쿠키 저장소에 보관한다.
3. 전송 웹 브라우저는 저장한 쿠키를 요청이 있을 때마다 웹 서버에 전송한다. 웹 서버는 쿠키를 사용해서 필요한 작업을 수행한다.
웹 브라우저에 쿠키가 저장되면, 웹 브라우저는 쿠키가 삭제되기 전까지 웹 서버에 쿠키를 전송한다. 지속적으로 유지해야하는 정보는 쿠키를 사용하면 된다.
쿠키의 구성
이름:쿠키를 구별하는 데 사용되는 이름
값:쿠키의 이름과 관련된 값
유효시간:쿠키의 유지 시간
도메인:쿠키를 전송할 도메인
경로:쿠키를 전송할 요청 경로
쿠키 생성하기
JSP에서 쿠키를 생성할 때 Cookie 클래스를 사용한다. Cookie 클래스를 사용해서 쿠키를 추가하는 코드는 다음과 같다.
<%
Cookie cookie = new Cookie("cookieName","cookieValue"); //쿠키 객체 생성 (쿠키이름,쿠키값)
response.addCookie(cookie);
%>
쿠키객체를 생성했다면 addCookie() 메서드로 쿠키를 추가하면 된다. response.addCookie() 메서드를 사용하면 response 기본 객체는 웹 브라우저에 쿠키 정보를 전송한다.
cookieset.jsp코드는 아래와 같다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
Cookie cookie = new Cookie("cookieN","cookieV"); //name, value
cookie.setMaxAge(60*60); //1시간 동안 유지
response.addCookie(cookie);//응답에 쿠키 객체를 줌
%>
<a href="cookieget.jsp">cookie get</a>
</body>
</html>
Cookie 객체를 생성한 후에 다음 메서드를 사용하여 쿠키의 특징을 변경하거나 읽어올 수 있다.
메서드 |
리턴타입 |
설명 |
getName() |
String |
쿠키 이름을 구한다. |
getValue() |
String |
쿠키 값을 정한다. |
setValue(String value) |
void |
쿠키 값을 지정한다. |
setDomain(String patter) |
void |
이 쿠키가 전송될 서버의 도메인을 지정한다. |
getDomain(String pattern) |
void |
이 쿠키가 전송될 서버의 도메인을 지정한다. |
getDomain() |
String |
쿠키의 도메인을 구한다. |
setPath(String uri) |
void |
쿠키를 전송할 경로를 지정한다. |
getPath() |
String |
쿠키의 전송 경로를 구한다. |
setMaxAge(int expiry) |
void |
쿠키의 유효 시간을 초단위로 지정한다. 음수면 웹 브라우저를 닫을 때 쿠키가 삭제된다. |
getMaxAge() | int | 쿠키의 유효시간을 구한다. |
쿠키 값 읽어오기
웹 브라우저는 요청 헤더에 쿠키를 저장해서 보내며, JSP는 다음 코드를 사용해서 쿠키 값을 읽어올 수 있다.
Cookie[] cookies = request.getCookies(); //request.getCookies() 메서드는 Cookie 배열을 리턴한다.
cookieget.jsp 코드는 아래와 같다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
for (int i=0;i<cookies.length;i++){
String str = cookies[i].getName();
if(str.equals("cookieN")){
out.println("cookies["+i+"]name:"+cookies[i].getName()+"<br/>");
out.println("cookies["+i+"]value:"+cookies[i].getValue()+"<br/>");
out.println("=============================<br/>");
}
}
%>
<a href="cookiedel.jsp">cookie delete</a>
</body>
</html>
cookieset.jsp에서 쿠키가 생성되고 응답 데이터에 쿠키객체를 추가한다. cookieget.jsp에서 쿠키를 요청하면 아래와 같이 출력된다.
cookies[0]name:cookieN
cookies[0]value:cookieV
=============================
cookie delete
쿠키의 유효시간
쿠키는 유효시간이 있다. 유효시간을 지정하지 않으면 브라우저가 종료될 때 쿠키가 삭제된다. 종료한 다음 브라우저를 켜면 삭제한 쿠키는 웹 서버에 전송되지 않는다. 유효시간을 정해 놓으면 그 시간 동안 쿠키가 존재한다. 유효시간이 지나지 않았으면 브라우저를 종료해도 쿠키가 삭제되지 않는다.
유효시간은 getMaxAge() 메서드로 지정한다. 초단위로 유효시간을 지정한다. 위에 cookieset.jsp 코드를 보면 cookie.setMaxAge(60*60) 메서드가 있는데 이는 60초 * 60초이므로 1시간을 뜻한다. 아이디 기억, 자동 로그인 기능은 쿠키를 사용한다.
쿠키를 사용한 로그인
아이디란과 비밀번호란을 채우고 로그인 버튼을 누르면 loginOk.jsp로 페이지 이동한다.
login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<form action="loginOk.jsp" method="post">
아이디:<input type="text" name="id" size="10"><br/>
비밀번호:<input type="password" name="pw" size="10"><br/>
<input type="submit" value="로그인">
</form>
</body>
</html>
아이디에 abc 비밀번호에 1234가 들어왔다면 welcom.jsp 페이지로 이동하고 아니라면 다시 login.html 페이지를 띄워준다.
loginOk.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%!
String id,pw;
%>
<%
id = request.getParameter("id");
pw = request.getParameter("pw");
if(id.equals("abc")&&pw.equals("1234")){ //나중에 디비 접속해서 회원인지 확인해야 함.
Cookie cookie = new Cookie("id",id);
cookie.setMaxAge(60);
response.addCookie(cookie);
response.sendRedirect("welcome.jsp");
}else{
response.sendRedirect("login.html");
}
%>
</body>
</html>
로그인 성공이면 welcome.jsp로 이동한다. 그 아래 로그아웃 버튼을 누르면 logout.jsp 페이지로 이동한다.
welcome.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
for(int i=0;i<cookies.length;i++){
String id = cookies[i].getValue();
if(id.equals("abc")) out.println(id+"님 안녕하세요."+"<br/>");
}
%>
<a href="logout.jsp">로그아웃</a>
</body>
</html>
logout.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(int i=0; i<cookies.length;i++){
if(cookies[i].getValue().equals("abc")){
cookies[i].setMaxAge(0);
response.addCookie(cookies[i]);
}
}
}
response.sendRedirect("cookietest.jsp");
%>
</body>
</html>