쿠키(Cookie)
쿠키(Cookie)는 서버(웹프로그램)와 클라이언트(브라우저)의 연결 지속성을 제공하기 위해 클라이언트에 저장하는 문자값을 뜻한다.
클라이언트는 접속 서버의 정보를 식별자로 하여 쿠키 정보를 저장한다.
예제)
클라이언트에게 쿠키를 전달하고 처리결과를 웹문서로 응답하는 서블릿 생성
→ 서블릿에 의해 전달받은 쿠키는 클라이언트에 저장된다.
@WebServlet("/create.itwill")
public class CookieCreateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//파일형태(MimeType)를 변경
response.setContentType("text/html;charset=utf-8");
//응답파일을 생성하기 위한 출력스트림을 반환받아 저장
PrintWriter out=response.getWriter();
//코드작성
//코드작성
// ...
}
}
1) Cookie 객체 생성 - Cookie 객체를 클라이언트에 전달하여 클라이언트에 쿠키 저장
→ Cooke 객체 : 쿠키 관련 정보를 저장하기 위한 객체
Cookie(String name, String value) 생성자로 매개변수에 쿠키명과 쿠키값을 전달하여 객체를 생성한다.
→ 쿠키명 : 쿠키값을 구분하기 위한 식별자 / 쿠키값 : 연결 지속성을 제공하기 위한 문자값
→ 쿠키명과 쿠키값은 영문자, 숫자, 일부 특수문자만 사용하여 작성이 가능하다. (한글 사용 X)
Cookie idCookie=new Cookie("id", "abc123");//id라는 이름으로 abc123 저장
Cookie countCookie=new Cookie("count", "0");//count라는 이름으로 0 저장
2) 클라이언트에 전달되어 저장될 쿠키의 유지시간을 변경한다.
Cookie.setMaxAge(int expiry) : 쿠키의 유지시간을 변경하는 메소드
→ 매개변수에 쿠키를 유지하기 위한 시간(초)를 전달하면 클라이언트는 해당 시간 동안 쿠키를 유지한다.
setMaxAge() 메소드를 호출하지 않은 경우엔 쿠키 유지시간의 기본값이 [-1]로 설정되며, 쿠키 유지시간이 [-1]로 설정된 쿠키는 브라우저 종료시 자동으로 소멸된다.
countCookie.setMaxAge(24*60*60);//쿠키 유지시간을 1일로 변경
3) 클라이언트에게 Cookie 객체를 전달한다. (클라이언트에 쿠키가 저장된다.)
→ Cookie 객체의 유지시간이 [-1]인 쿠키는 클라이언트 브라우저 메모리에 저장되며 브라우저 종료시 소멸된다.
→ Cookie 객체의 유지시간이 [-1]이 아닌 쿠키는 클라이언트의 쿠키파일로 저장되며 유지시간 경과 후 소멸된다.
HttpServletResponse.addCookie(Cookie cookie) : 클라이언트에게 Cookie 객체를 전달하는 메소드
response.addCookie(idCookie);
response.addCookie(countCookie);
4) HTML 문서 만들어 응답
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>쿠키(Cookie) 생성</h1>");
out.println("<hr>");
out.println("<p>네 안에 쿠키 있다.</p>");
out.println("<hr>");
out.println("<p><a href='read.itwill'>쿠키 읽기</a></p>");
out.println("</body>");
out.println("</html>");
클라이언트로 전달받은 쿠키값을 반환받아 클라이언트에게 전달하여 응답하는 서블릿 생성 (read.itwill 서블릿)
→ 클라이언트는 서버에 접속해서 웹프로그램을 요청할 때 서버 정보로 저장된 모든 쿠키를 리퀘스트 메세지에 담아 제공한다.
@WebServlet("/read.itwill")
public class CookieReadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//파일형태(MimeType)를 변경
response.setContentType("text/html;charset=utf-8");
//응답파일을 생성하기 위한 출력스트림을 반환받아 저장
PrintWriter out=response.getWriter();
//코드작성
//코드작성
// ...
}
}
1) 클라이언트에게 전달받은 모든 쿠키를 반환받아 저장
HttpServletRequest.getCookies() : 클라이언트에게 전달받은 모든 쿠키를 얻어와 Cookie 객체 배열로 반환하는 메소드
Cookie[] cookies=request.getCookies();
2) HTML 문서 만들어 응답
[전체 소스코드]
package xyz.itwill.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//클라이언트로 전달받은 쿠키값을 반환받아 클라이언트에게 전달하여 응답하는 서블릿
@WebServlet("/read.itwill")
public class CookieReadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//클라이언트에게 전달받은 모든 쿠키를 반환받아 저장
Cookie[] cookies=request.getCookies();
//HTML 문서 만들어 응답
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>쿠키 읽기</h1>");
out.println("<hr>");
if(cookies==null) {//클라이언트로부터 전달받은 쿠키가 없는 경우
out.println("<p>네 안에 쿠키 없다.</p>");
} else {
String id="";
String count="";
//Cookie 객체 배열에 있는 요소(Cookie 객체)를 차례대로 제공받아 사용하기 위한 반복문
for(Cookie cookie : cookies) {
//클라이언트로부터 전달받은 쿠키에서 필요로 하는 쿠키값을 반환받아 저장
//Cookie.getName() : Cookie 객체에 저장된 쿠키명을 반환하는 메소드
if(cookie.getName().equals("id")) {
//Cookie.getValue() : Cookie 객체에 저장된 쿠키값을 반환하는 메소드
id=cookie.getValue();
} else if(cookie.getName().equals("count")) {
count=cookie.getValue();
}
}
//클라이언트에게 쿠키값을 HTML 문서에 포함하여 출력
if(!id.equals("")) {//쿠키값이 있는 경우
out.println("<p>아이디 = "+id+"</p>");
}
if(!count.equals("")) {//쿠키값이 있는 경우
int cnt=Integer.parseInt(count)+1;
out.println("<p>서블릿 요청횟수 = "+cnt+"</p>");
//클라이언트에게 Cookie 객체를 전달하여 저장
// => 전달되는 Cookie 객체의 쿠키명과 같은 쿠키가 이미 클라이언트에 저장되어
//있는 경우 덮어씌우기한다. (쿠키를 변경한다.)
Cookie cookie=new Cookie("count", cnt+"");
cookie.setMaxAge(86400);
response.addCookie(cookie);
}
}
out.println("<hr>");
out.println("<p><a href='create.itwill'>쿠키 생성</a></p>");
out.println("<p><a href='remove.itwill'>쿠키 삭제</a></p>");
out.println("</body>");
out.println("</html>");
}
}
클라이언트에 저장된 모든 쿠키를 삭제하고 실행결과를 전달하여 응답하는 서블릿 생성(remove.itwill 서블릿)
별도로 쿠키를 삭제하는 메소드는 존재하지 않으며,
쿠키의 유효시간을 0으로 지정하면 웹브라우저에 전달되자 마자 삭제된다.
@WebServlet("/remove.itwill")
public class CookieRemoveServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//파일형태(MimeType)를 변경
response.setContentType("text/html;charset=utf-8");
//응답파일을 생성하기 위한 출력스트림을 반환받아 저장
PrintWriter out=response.getWriter();
//코드작성
//코드작성
// ...
}
}
1) 클라이언트에게 전달받은 모든 쿠키를 반환받아 저장
Cookie[] cookies=request.getCookies();
2) 클라이언트에게 전달받은 쿠키의 유지시간을 [0]으로 변경하여 클라이언트에게 전달
→ 유지시간이 지난 쿠키는 클라이언트에서 자동으로 소멸되기 때문에 클라이언트에 저장된 쿠키는 삭제된다.
if(cookies != null) {//클라이언트에게 전달받은 쿠키가 있는 경우
//Cookie 객체 배열에 있는 요소(Cookie 객체)를 차례대로 제공받아 사용하기 위한 반복문
for(Cookie cookie : cookies) {
cookie.setMaxAge(0);
response.addCookie(cookie);//클라이언트에 저장된 기존 쿠키 덮어씌우기
}
}
3) HTML 문서 만들어 응답
[전체 소스코드]
package xyz.itwill.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//클라이언트에 저장된 모든 쿠키를 삭제하고 실행결과를 전달하여 응답하는 서블릿
@WebServlet("/remove.itwill")
public class CookieRemoveServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//클라이언트에게 전달받은 모든 쿠키를 반환받아 저장
Cookie[] cookies=request.getCookies();
if(cookies != null) {//클라이언트에게 전달받은 쿠키가 있는 경우
//Cookie 객체 배열에 있는 요소(Cookie 객체)를 차례대로 제공받아 사용하기 위한 반복문
for(Cookie cookie : cookies) {
cookie.setMaxAge(0);
response.addCookie(cookie);//클라이언트에 저장된 기존 쿠키 덮어씌우기
}
}
//HTML 문서 만들어 응답
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>쿠키(Cookie) 삭제</h1>");
out.println("<hr>");
out.println("<p>네 안에 쿠키 없다.</p>");
out.println("<hr>");
out.println("<p><a href='read.itwill'>쿠키 읽기</a></p>");
out.println("</body>");
out.println("</html>");
}
}
'학원 > 복기' 카테고리의 다른 글
[Servlet] Servelet과 JDBC 연동 (DAO 사용한 예제와 JNDI) (0) | 2023.06.19 |
---|---|
[Servlet] 세션(Session) (0) | 2023.06.18 |
[Servlet] 파일 업로드 서블릿 (0) | 2023.06.18 |
[Servlet] 생명주기(Lifecycle) (0) | 2023.06.15 |
[Servlet] 이미지 파일로 응답하기 위한 서블릿 만들기 (0) | 2023.06.15 |