고급자바_Cookie
쿠키 ?
- 서버가 사용자의 웹브라우저에 전송하는 작은 데이터 조각
- 브라우저는 쿠키를 저장했다가 동일한 서버에 재요청시 저장된 데이터를 함께 전송
- 두 요청이 동일한 브라우저에서 들어왔는지 아닌지 판단할 때 주로 사용함
- 하나의 쿠키값은 4KB까지 저장가능
- 사용자가 따로 요청하지 않아도 브라우저가 Request시 Header에 넣어서 자동으로 서버에 전송
쿠키를 사용하는 이유
- HTTP 프로토콜의 특징 보완
Connecetionless(비연결)
stateless(상태가 없는)
- 상태가 없는 HTTP 프로토콜에서 상태 정보를 기억시켜 줌
쿠키 구성요소
이름
값
유효시간(초)
- 쿠키가 생성된 이후에 사용될 수 있는 기간
- 유효시간이 경과된 쿠키는 클라이언트에서 자동으로 삭제됨
=> 쿠키를 삭제하려면 유효시간은 0으로 설정하면 됨.
- 기본 값은 -1 : 웹브라우저를 종료할 때 삭제됨
도메인
- 도메인은 현재 쿠키가 어떤 서버로 전송되어져야 하는지 지정할 수 있는 속성
- 지정하지 않으면 생성된 서버로만 전송(기본값)
- 지정할 수 있는 값 : 현재 서버의 주소 혹은 상위 도메인까지만
쿠키 동작방식
쿠키 생성단계
- 웹브라우저가 페이지 요청
- 웹 서버는 쿠키 생성
- 응답데이터의 헤더에 저장하여 웹브라우저에 전송
쿠키 저장단계
- 웹브라우저는 응답헤더의 set-Cookie 정보를 읽어 쿠키저장소에 쿠키 보관
- 쿠키 종류에 따라 메모리나 파일에 저장
쿠키 전송단계
- 웨브라우저는 저장한 쿠키를 요청이 있을 때마다 웹서버에 전송
- 웹서버는 브라우저가 전송한 쿠키를 사용하여 필요한 작업을 수행
: 정보 변경이 필요하면 쿠키 업데이트 후 응답과 함께 변경된 쿠키 전송
쿠키 생성
1. 쿠키 객체 생성
Cookie cookie = new Cookie("이름(key)", "값(value)");
- 사용불가 문자
공백, = , " / ? @ : ;
- 사용불가 문자를 제외한 나머지 출력가능한 아스키 문자 사용 가능
=> 이외의 값(ex.한글)을 사용시에는 URLEncoder.encode() 사용하여 인코딩 처리
Cookie userId = new Cookie("userId", req.getParameter("userId");
Cookie name = new Cookie("name", URLEncoder.encode(req.getParameter("name"), "UTF-8"));
2. 쿠키 최대지속시간 설정(초단위)
cookie.setMaxAge(초)
- 지정하지 않으면 브라우저를 종료할 때 쿠키를 함께 삭제
userId.setMaxAge(60*60*24); => 1일
name.setMaxAge(60*60*48); => 2일
3. 응답헤더에 쿠키객체 추가
resp.addCookie(cookie);
resp.addCookie(userId);
resp.addCookie(name);
쿠키 생성 예제 (P16_T06)
private void setCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 쿠키 생성하기
Cookie userId = new Cookie("userId", req.getParameter("userId"));
// 쿠키값에 한글을 사용시 인코딩 처리를 해준다.
Cookie name = new Cookie("name", URLEncoder.encode(req.getParameter("name"),"UTF-8"));
// URL인코더로 인코딩하면 모양이 %로 되있음 (%16진수 %16진수 .. )그래서 다른말로 퍼센트인코딩이라고도 함
// 쿠키 소멸 시간 설정 (초단위) => 지정하지 않으면 웹브라우저를 종료할 때 쿠키를 함께 삭제한다.
userId.setMaxAge(60*60*24); // 1일
name.setMaxAge(60*60*48); // 2일
// 응답헤더에 쿠키 추가하기
resp.addCookie(userId);
resp.addCookie(name);
// 응답헤더에 인코딩 및 Content-Type 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키설정 예제";
out.println("<!DOCTYPE html>\n"
+ " <html>\n"
+ " <head>\n"
+ " <title>" + title + "</title>"
+ " </head>\n"
+ " <body>"
+ " <h1 align=\"center\">" + title + "<h1>\n"
+ " <ul>\n "
+ " <li><b>ID</b>: "
+ req.getParameter("userId") + "</li>\n"
+ " <li><b>이름</b>: "
+ req.getParameter("name") + "</li>\n"
+ " </ul>\n"
+ " </body>"
+ " </html>");
}
Connecetionless(비연결)
stateless(상태가 없는)
=> 쿠키를 삭제하려면 유효시간은 0으로 설정하면 됨.
: 정보 변경이 필요하면 쿠키 업데이트 후 응답과 함께 변경된 쿠키 전송
1. 쿠키 객체 생성
Cookie cookie = new Cookie("이름(key)", "값(value)");
- 사용불가 문자
공백, = , " / ? @ : ; - 사용불가 문자를 제외한 나머지 출력가능한 아스키 문자 사용 가능
=> 이외의 값(ex.한글)을 사용시에는 URLEncoder.encode() 사용하여 인코딩 처리
Cookie userId = new Cookie("userId", req.getParameter("userId");
Cookie name = new Cookie("name", URLEncoder.encode(req.getParameter("name"), "UTF-8"));
2. 쿠키 최대지속시간 설정(초단위)
cookie.setMaxAge(초)
- 지정하지 않으면 브라우저를 종료할 때 쿠키를 함께 삭제
userId.setMaxAge(60*60*24); => 1일
name.setMaxAge(60*60*48); => 2일
3. 응답헤더에 쿠키객체 추가
resp.addCookie(cookie);
resp.addCookie(userId);
resp.addCookie(name);
쿠키 생성 예제 (P16_T06)
private void setCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 쿠키 생성하기
Cookie userId = new Cookie("userId", req.getParameter("userId"));
// 쿠키값에 한글을 사용시 인코딩 처리를 해준다.
Cookie name = new Cookie("name", URLEncoder.encode(req.getParameter("name"),"UTF-8"));
// URL인코더로 인코딩하면 모양이 %로 되있음 (%16진수 %16진수 .. )그래서 다른말로 퍼센트인코딩이라고도 함
// 쿠키 소멸 시간 설정 (초단위) => 지정하지 않으면 웹브라우저를 종료할 때 쿠키를 함께 삭제한다.
userId.setMaxAge(60*60*24); // 1일
name.setMaxAge(60*60*48); // 2일
// 응답헤더에 쿠키 추가하기
resp.addCookie(userId);
resp.addCookie(name);
// 응답헤더에 인코딩 및 Content-Type 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키설정 예제";
out.println("<!DOCTYPE html>\n"
+ " <html>\n"
+ " <head>\n"
+ " <title>" + title + "</title>"
+ " </head>\n"
+ " <body>"
+ " <h1 align=\"center\">" + title + "<h1>\n"
+ " <ul>\n "
+ " <li><b>ID</b>: "
+ req.getParameter("userId") + "</li>\n"
+ " <li><b>이름</b>: "
+ req.getParameter("name") + "</li>\n"
+ " </ul>\n"
+ " </body>"
+ " </html>");
}
쿠키 정보 읽기
쿠키 정보읽기 예제 (P16_T06)
private void readCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Cookie cookie = null;
// 현재 도메인에서 사용중인 쿠키정보배열 가져오기
Cookie[] cookies = req.getCookies();
// 응답헤더에 인코딩 및 Content-Type 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키정보 읽기 예제";
out.println("<!DOCTYPE html>\n"
+ "<html>\n"
+ "<head><title>" + title + "</title></head>\n"
+ "<body>\n");
if(cookies != null) {
out.println("<h2>" + title + "</h2>");
for(int i = 0 ; i < cookies.length ; i++) {
cookie = cookies[i];
out.println("name : " + cookie.getName() + "<br>");
out.println("value : " + URLDecoder.decode(cookie.getValue(),"UTF-8") + "<br>");
out.println("<br>");
}
}else {
out.println("<h2> 쿠키정보가 없습니다.<h2>");
}
out.println("</body>");
out.println("</html>");
}
쿠키 삭제
- 사용중인 쿠키 정보를 이용하여 쿠키 생성
- 쿠키객체의 최대 지속시간을 0으로 설정
- 설정한 쿠키객체를 응답헤더에 추가하여 전송
쿠키 삭제 예제 (P16_T06)
private void deleteCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Cookie cookie = null;
// 현재 도메인에서 사용중인 쿠키정보배열 가져오기
Cookie[] cookies = req.getCookies();
// 응답헤더에 인코딩 및 Content_Type 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키정보 삭제 예제";
out.println("<!DOCTYPE html>\n"
+ " <html>\n"
+ " <head>"
+ " <title>" + title + "</title>"
+ " </head>\n"
+ " <body>\n");
if(cookies != null) {
out.println("<h2>" + title + "</h2>");
for(int i = 0 ; i < cookies.length ; i++) {
cookie = cookies[i];
if(cookie.getName().equals("userId")) {
// 쿠키 제거하기
cookie.setMaxAge(0);
resp.addCookie(cookie);
out.println("삭제한 쿠키 : " + cookie.getName() + "<br>");
}
out.print("name : " + cookie.getName() + ", ");
out.print("value : " + URLDecoder.decode(cookie.getValue(),"UTF-8"));
out.println("<br>");
}
}else {
out.println("<h2> 쿠키정보가 없습니다.<h2>");
}
out.println("</body>");
out.println("</html>");
}
참고
- 쿠키
https://dololak.tistory.com/543
- 쿠키 동작방식
https://medium.com/@duddk1551/web-%EC%BF%A0%ED%82%A4-cookie-%EC%99%80-%EC%84%B8%EC%85%98-session-36ca55b4aa01
Author And Source
이 문제에 관하여(고급자바_Cookie), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@oungoo/자바세션
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
private void readCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Cookie cookie = null;
// 현재 도메인에서 사용중인 쿠키정보배열 가져오기
Cookie[] cookies = req.getCookies();
// 응답헤더에 인코딩 및 Content-Type 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키정보 읽기 예제";
out.println("<!DOCTYPE html>\n"
+ "<html>\n"
+ "<head><title>" + title + "</title></head>\n"
+ "<body>\n");
if(cookies != null) {
out.println("<h2>" + title + "</h2>");
for(int i = 0 ; i < cookies.length ; i++) {
cookie = cookies[i];
out.println("name : " + cookie.getName() + "<br>");
out.println("value : " + URLDecoder.decode(cookie.getValue(),"UTF-8") + "<br>");
out.println("<br>");
}
}else {
out.println("<h2> 쿠키정보가 없습니다.<h2>");
}
out.println("</body>");
out.println("</html>");
}
- 사용중인 쿠키 정보를 이용하여 쿠키 생성
- 쿠키객체의 최대 지속시간을 0으로 설정
- 설정한 쿠키객체를 응답헤더에 추가하여 전송
쿠키 삭제 예제 (P16_T06)
private void deleteCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Cookie cookie = null;
// 현재 도메인에서 사용중인 쿠키정보배열 가져오기
Cookie[] cookies = req.getCookies();
// 응답헤더에 인코딩 및 Content_Type 설정
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String title = "쿠키정보 삭제 예제";
out.println("<!DOCTYPE html>\n"
+ " <html>\n"
+ " <head>"
+ " <title>" + title + "</title>"
+ " </head>\n"
+ " <body>\n");
if(cookies != null) {
out.println("<h2>" + title + "</h2>");
for(int i = 0 ; i < cookies.length ; i++) {
cookie = cookies[i];
if(cookie.getName().equals("userId")) {
// 쿠키 제거하기
cookie.setMaxAge(0);
resp.addCookie(cookie);
out.println("삭제한 쿠키 : " + cookie.getName() + "<br>");
}
out.print("name : " + cookie.getName() + ", ");
out.print("value : " + URLDecoder.decode(cookie.getValue(),"UTF-8"));
out.println("<br>");
}
}else {
out.println("<h2> 쿠키정보가 없습니다.<h2>");
}
out.println("</body>");
out.println("</html>");
}
참고
- 쿠키
https://dololak.tistory.com/543 - 쿠키 동작방식
https://medium.com/@duddk1551/web-%EC%BF%A0%ED%82%A4-cookie-%EC%99%80-%EC%84%B8%EC%85%98-session-36ca55b4aa01
Author And Source
이 문제에 관하여(고급자바_Cookie), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@oungoo/자바세션저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)