티스토리 뷰

Servlet

세션 트래킹 - 쿠키

dev23 2024. 8. 12. 20:01
반응형

쿠키(Cookie)

- 쿠키(Cookie) 페이지들 사이의 공유 정보를 클라이언트 PC에 저장해 놓고 필요할 때 여러 웹 페이지들이 공유해서 사용할 있도록 매개 역할을 하는 방법이다.

 

쿠키의 특징

  • 정보가 클라이언트 PC에 저장된다.
  • 저장 정보 용량에 제한이 있다( 파일 용량은 4kb)
  • 보안이 취약하다.
  • 클라이언트 브라우저에서 사용 유무를 설정할 수 있다.
  • 도메인당 쿠키가 만들어진다( 웹 사이트당 하나의 쿠키 생성 ).

- 쿠키는 클라이언트 PC 정보를 저장해서 사용하므로 보안에 취약하다. 따라서 쿠키를 이용한 방법은 주로 보안과
무관한 경우에 한해 사용한다. ( 팝업창 표시 여부 )

 

쿠키의 종류

속성 Persistence 쿠키 Session 쿠키
생성 위치 파일로 생성 브라우저 메모리에 생성
종료 시기 쿠키를 삭제하거나 쿠키 설정 값이 종료된 경우 브라우저를 종료한 경우
최초 접속 전송 여부 최초 접속 서버로 전송 최초 접속 서버로 전송되지 않음
용도 로그인 유무 또는 팝업창 제한 사이트 접속 Session 인증 정보 유지

- Persistence 쿠키는 클라이언트에 파일로 정보를 저장하는 기능을 한다.

- 파일로 생성된 쿠키는 사용자가 만료 시간을 지정할 있는 반면에 Session 쿠키는 브라우저가 사용하는 메모리에 
생성되는 쿠키다.

- 브라우저가 종료되면 메모리의 Session 쿠키도 자동으로 소멸된다.

- 쿠키 생성 위치(크롬)

C:\Users\user\AppData\Local\Google\Chrome\User Data\Default\Cache

 => 크롬에서 사용하는 쿠키 파일

 

쿠키 기능 실행 과정

  1. 브라우저에서 웹사이트에 최초 접속하면 웹 서버에서 쿠키를 생성해 클라이언트로 전송
  2. 브라우저는 쿠키를 파일로 저장
  3. 이후 다시 접속해 서버가 브라우저에게 쿠키 전송을 요청하면 브라우저는 쿠키 정보를 서버에 전송
  4. 서버는 쿠키 정보를 이용해 작업

 

쿠키 API

- 쿠키는 Cookie 클래스 객체를 생성하여 정보를 저장한 후 서버에서 클라이언트로 전송해 파일로 저장된다.

- 쿠키 관련 API 특징은 다음과 같다.

  • javax.servlet.http.Cookie를 이용한다.
  • HttpServletResponse의 addCookie() 메서드를 이용해 클라이언트 브라우저에 쿠키를 전송한 후 저장한다.
  • HttpServletRequest의 getCookie() 메서드를 이용해 쿠키를 서버로 가져온다.

쿠키 클래스 메서드

메서드 설명
getComment() 쿠키에 대한 설명을 가져온다.
getDomain() 쿠키의 유효한 도메인 정보를 가져온다.
getMaxAge() 쿠키 유효 기간을 가져온다.
getName() 쿠키 이름을 가져온다.
getPath() 쿠키의 디렉터리 정보를 가져온다.
getValue() 쿠키의 설정 값을 가져온다.
setComment(String) 쿠키에 대한 설명을 설정한다.
setDomain(String) 쿠키의 유효한 도메인을 설정한다.
setMaxAge(int) 쿠키 유효 기간을 설정한다.
setValue(String) 쿠키 값을 설정한다.

- 쿠키 생성 setMaxAge() 메서드 인자 값의 종류를 지정해서 파일에 저장하는 Persistence 쿠키를 만들거나 메모리에만 저장하는 Session 쿠키를 만들 있다.

- , setMaxAge() 메서드를 이용한 쿠키저장 방식은 다음 가지로 나눌 있다.

  • 인자 값으로 음수나 setMaxAge() 메서드를 사용하지 않고 쿠키를 만들면 Session 쿠키로 저장된다.
  • 인자 값으로 양수를 지정하면 Persistence 쿠키로 저장된다.

쿠키 사용

- 서블릿에서 쿠키 API 이용해 쿠키를 만들어본다.

- Cookie객체를 생성한 쿠키 이름을 cookieTest 저장한다.

- setMaxAge() 메서드를 이용해 쿠키 유효 시간을 24시간으로 설정한다.

- response.addCookie() 메서드를 이용해 생성된 쿠키를 브라우저로 전송한다.

 

* SetCookieValue.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Date;

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;

/**
 * Servlet implementation class SetCookieValue
 */
@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 객체를 생성한 후 cookieTest 이름으로 한글 정보를 인코딩해서 쿠키에 저장한다.
		Cookie c = new Cookie("cookieTest",URLEncoder.encode("JSP 프로그래밍입니다.","utf-8"));
		c.setMaxAge(24*60*60); // 유효 기간을 설정
		response.addCookie(c); // 생성된 쿠키를 브라우저로 전송
		
		out.print("현재시간 : " + d);
		out.print("현재시간을 Cookie로 저장합니다.");
	}

}

 

* GetCookieValue.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;

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;

/**
 * Servlet implementation class GetCookieValue
 */
@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();

		// request의 getCookies() 메서드를 이용해 브라우저에게 쿠키 정보를 요청한 후 쿠키 정보를 배열로 가져온다. 
		Cookie[] allValues = request.getCookies();
		// 배열에 저장할 때 사용한 쿠키 이름인 cookieTest로 검색해 쿠키 값을 가져온다.
		for(int i = 0 ; i < allValues.length; i++) {
			if(allValues[i].getName().equals("cookieTest")) {
				out.print("<h2>Cookie 값 가져오기 : " + URLDecoder.decode(allValues[i].getValue(),"utf-8"));
			}
		}

	}

}

 

- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/set 을 입력한다.

쿠키 설정

- 설정 후 /get 주소로 접속해 본다.

저장된 쿠키 값

 

세션 쿠키

- 이번 예제는 쿠키를 파일에 저장하는 것이 아닌, 브라우저가 사용하는 메모리에 저장하는 Session 쿠키 만든다.

- Cookie setMaxAge() 메서드를 이용해 유효시간을 -1로 설정하면 세션 쿠키가 생성된다.

 

* SetCookieValue.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Date;

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;

/**
 * Servlet implementation class SetCookieValue
 */
@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 객체를 생성한 후 cookieTest 이름으로 한글 정보를 인코딩해서 쿠키에 저장한다.
		Cookie c = new Cookie("cookieTest",URLEncoder.encode("JSP 프로그래밍입니다.","utf-8"));
		c.setMaxAge(-1); // 유효 시간을 음수로 지정하여 Session 쿠키를 만든다.
		response.addCookie(c); // 생성된 쿠키를 브라우저로 전송
		
		out.print("현재시간 : " + d);
		out.print("현재시간을 Cookie로 저장합니다.");
	}

}

 

반응형

'Servlet' 카테고리의 다른 글

서블릿 - 세션 로그인 예제  (0) 2024.08.12
세션 트래킹 - 세션  (0) 2024.08.12
세션 트래킹  (0) 2024.08.12
서블릿 컨텍스트(ServletContext)  (0) 2024.08.12
서블릿 - 바인딩  (1) 2024.08.12
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함