[Web] 쿠키 / Persistence 쿠키 / Session 쿠키

2024. 8. 18. 00:00자바 웹 개발/세션 쿠키 필터 리스너

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

 

1. 정보가 클라이언트PC에 저장된다. 

2. 4kb 용량 제한이 있다. 

3. 보안이 취약하다. 

4. 클라이언트 브라우저에서 사용 유무를 설정할 수 있다. 

5. 도메인당 쿠키가 만들어진다. 

 

클라이언트 PC에 정보가 저장되니 보안이 취약하다. 따라서 보안과 무관한 경우에 한해 사용한다. 

 

쿠키는 두 종류가 있다. Persistence 쿠키는 사용자가 만료 시간을 지정할 수 있지만, Session 쿠키는 브라우저 종료 시 자동 소멸한다. 

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

 

크롬의 쿠키 파일 위치는 다음과 같다. 

쿠키 실행 과정

1. 브라우저로 사이트에 접속한다. 

2. 서버는 정보를 저장한 쿠키를 생성한다.

3. 생성된 쿠키를 브라우저로 전송한다. 

4. 브라우저는 서버로부터 받은 쿠키 정보를 쿠키 파일에 저장한다. 

5. 브라우저가 다시 접속해 서버가 브라우저에 쿠키 정보를 요청하면 브라우저는 쿠키 정보를 서버에 넘겨준다. 

6. 서버는 쿠키 정보를 이용해 작업을 한다. 

 

쿠키 관련 API

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

 

1. HttpServletResponse의 addCookie 메서드를 이용하여 브라우저에 쿠키를 전달

2. HttpServletRequest의 getCookie 메서드를 이용하여 쿠키를 서버로 가져옴

 

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

 

여기서 setMaxAge 인자값으로 양수를 지정하면 Persistence 쿠키로 저장되고, 음수로 설정하거나 setMaxAge 메서드를 사용하지 않으면 Session쿠키로 저장된다. 

 

Persistence 쿠키 사용하기

Cookie c = new Cookie(이름, 값)

@WebServlet("/set")
public class SetCookieValue extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		Date d = new Date();
		Cookie c = new Cookie("cookieTest", URLEncoder.encode("JSP프로그래밍입니다.", "utf-8"));
		c.setMaxAge(24*60*60); // c.setMaxAge(-1)
		resp.addCookie(c);
		out.println("현재시간 : " + d);
		out.println("문자열을 Cookie에 저장합니다.");
	}
}

 

Cookie c = new Cookie(이름, 값) : 쿠키 이름과 값을 설정한다. 한글인 경우 인코딩이 필요하다. 

 

Cookie (Java(TM) EE 7 Specification APIs)

Creates a cookie, a small amount of information sent by a servlet to a Web browser, saved by the browser, and later sent back to the server. A cookie's value can uniquely identify a client, so cookies are commonly used for session management. A cookie has

docs.oracle.com

c.setMaxAge: 유효 기간 설정

response.addCookie(Cookie cookie): 생성된 쿠키를 브라우저로 전달

 

아래는 쿠키를 전달받은 GetCookieValue 클래스의 코드이다. for문을 통해서  쿠키이름이 cookieTest인 것을 검색하여 쿠키 값을 가져온다. 

@WebServlet("/get")
public class GetCookieValue extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		Cookie[] allValues = req.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"));
			}
		}
	}
}

 

request.getCookie: 브라우저에게 쿠키 정보를 요청한 후 쿠키 정보를 배열로 가져온다. 

 

Session 쿠키 사용하기 

setMaxAge 메서드에 유효 시간을 -1로 설정하면 세션 쿠키가 생성된다. 

@WebServlet("/sess")
public class SessionTest extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		HttpSession session = req.getSession();
		out.println("세션 아이디: " + session.getId() + "<br>");
		out.println("최초 세션 생성 시각: " + new Date(session.getCreationTime()) + "<br>");
		out.println("최근 세션 접근 시각: " + new Date(session.getLastAccessedTime()) + "<br>");
		out.println("세션 유효 시간: " + session.getMaxInactiveInterval() + "<br>");
		if(session.isNew()) {
			out.print("새 세션이 만들어졌습니다.");
		}	
	}	
}