Life is Good

수콩이의 시선

Coding/JSP

[Servlet] Cookie(쿠키)/ Session(세션)

Soocong 2022. 4. 4. 11:29

Cookie(쿠키)

- 클라이언트 쿠키 폴더에 저장

- 예: 장바구니

 

Session(세션)

- 서버에 저장

- 예: 로그인/로그아웃

 

  • 웹 브라우저에서 서버로 어떤 데이터를 요청하면, 서버측에서는 알맞은 로직을 수행한 후 데이터를 웹 브라우저에 응답한 후 서버는 웹 브라우저와의 관계를 종료한다. 
  • 연결이 끊어졌을 때 어떤 정보를 지속적으로 유지하기 위한 수단으로 쿠키라는 방식을 사용한다.
  • 쿠키는 서버에서 생성하여 서버가 아닌 클라이언트측에 특정 정보를 저장한다.(4KB 용량 제한)
  • 세션도 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단입니다.  
    단, 쿠키와 달리 클라이언트의 특정 위치에 저장되는 것이 아니라, 서버상에 객체로 존재한다.
  • 따라서 세션은 서버에서만 접근이 가능하여 보안에 좋고, 데이터 용량 한계가 없다.

 


[예제] 장바구니 페이지를 만들어서 쿠키를 사용해보자.

 

 

09_example.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 장바구니 저장, 보기, 삭제  -->
	<form action="http://localhost:8181/webTesting/com/java/servlet/Example09_CookieSet" method="post">
		<table>
			<tr>
				<td>
					<img src="./../img/image1.jpg" width="200" height="150" />
				</td>
				<td>
					<img src="./../img/image2.jpg" width="200" height="150" />
				</td>
				<td>
					<img src="./../img/image3.jpg" width="200" height="150" />
				</td>
			</tr>
			<tr>
				<td align="center">
					<input type="checkbox" name="food" value="image1"/>고구마
				</td>
				<td align="center">
					<input type="checkbox" name="food" value="image2"/>옥수수
				</td>
				<td align="center">
					<input type="checkbox" name="food" value="image3"/>블루베리
				</td>	
			</tr>
			<tr>
				<td colspan="3" align="center">
					<input type="submit" value="장바구니"/>
					<input type="reset" value="취소"/>
				</td>
			</tr>
		</table>
		
		<div>
			<a href="http://localhost:8181/webTesting/com/java/servlet/Example09_CookieGet">
				장바구니 보기</a><br /><br />
			<a href="http://localhost:8181/webTesting/com/java/servlet/Example09_CookieDel">
				장바구니 삭제</a>
		</div>
	
	</form>
</body>
</html>

 

Example09_CoockieSet.java

package com.java.servlet;

import java.io.IOException;
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 Example09
 */
public class Example09_CookieSet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Example09_CookieSet() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String[] food = request.getParameterValues("food");
		System.out.println(food.length);
		
		// sessionScope : context(webTesting) 안에 모든 page에서 공유
		// response : 쿠키 설정(저장), request : 쿠키 읽기
		
		if(food.length != 0) {
			for(int i=0; i<food.length; i++) {
				// key, value
				String key = "food" + (i+1);
				String value = food[i];
				System.out.println(key + "\t" + value);
				
				Cookie cookie = new Cookie(key, value);
				// 쿠키가 살아있는 시간 10분
				cookie.setMaxAge(60*10);  //초*분*시*일 (60*60*24*365)
										  //사용자가 쿠키 폴더에서 지우면 
				response.addCookie(cookie);
			}
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

Example09_CoockieGet.java

package com.java.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Example09_CookieGet
 */

public class Example09_CookieGet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Example09_CookieGet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		Cookie[] cookies = request.getCookies();
		//System.out.println(cookies.length);
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();

		out.print("<html>");
		out.print("<head><title></title></head>");
		out.print("<body>");
		
		if(cookies != null) {
			for(int i=0; i<cookies.length;i++) {
				out.print("<h3>" + cookies[i].getName() + "</h3>");
				out.print("<h3>" + cookies[i].getValue() + "</h3>");
			}
			String contextPath = request.getContextPath();
			for(int i=0; i<cookies.length;i++) {
				String imgStr = contextPath+"/img/"+ cookies[i].getValue() + ".jpg";
				System.out.println(imgStr);
				out.print("<img src='"+ imgStr +"' width='200' height='150' />");
			}
		}else {
			out.print("<h3>장바구니가 비었습니다.</h3>");
		}
		
		out.print("</body>");				
		out.print("</html>");				
		out.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

 

Example09_CoockieDel.java

package com.java.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;

/**
 * Servlet implementation class Example09_CookieDel
 */
@WebServlet("/Example09_CookieDel")
public class Example09_CookieDel extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Example09_CookieDel() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		Cookie[] cookies = request.getCookies();
		if(cookies!=null) {
			for(int i=0; i<cookies.length; i++) {
				// 쿠키를 지운다.
				cookies[i].setMaxAge(0);
				response.addCookie(cookies[i]);
			}
		}
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<html>");
		out.print("<head><title></title></head>");
		out.print("<body>");
		
		out.print("<script type='text/javascript'>");
		out.print("alert('장바구니를 비웠습니다.');");
		out.print("location.href='http://localhost:8181/webTesting/Servlet/09_example.html';");
		out.print("</script>");
		out.print("</body>");				
		out.print("</html>");				
		out.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  <display-name>webTesting</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
	<servlet-name>Example09_CookieSet</servlet-name>
	<servlet-class>com.java.servlet.Example09_CookieSet</servlet-class>	
  </servlet>

  <servlet-mapping>
	<servlet-name>Example09_CookieSet</servlet-name>
	<url-pattern>/com/java/servlet/Example09_CookieSet</url-pattern>
  </servlet-mapping>
  
  <servlet>
	<servlet-name>Example09_CookieGet</servlet-name>
	<servlet-class>com.java.servlet.Example09_CookieGet</servlet-class>	
  </servlet>

  <servlet-mapping>
	<servlet-name>Example09_CookieGet</servlet-name>
	<url-pattern>/com/java/servlet/Example09_CookieGet</url-pattern>
  </servlet-mapping>
  
  <servlet>
	<servlet-name>Example09_CookieDel</servlet-name>
	<servlet-class>com.java.servlet.Example09_CookieDel</servlet-class>	
  </servlet>

  <servlet-mapping>
	<servlet-name>Example09_CookieDel</servlet-name>
	<url-pattern>/com/java/servlet/Example09_CookieDel</url-pattern>
  </servlet-mapping>
  
</web-app>

 

 

 

 

쿠키 확인

크롬 설정 > 개인정보 및 보안 > 사이트 설정 > 쿠키 및 사이트 데이터 > 모든 쿠키 및 사이트 데이터 보기

선택한 고구마, 옥수수 쿠키를 볼 수 있다

설정한 유효시간인 10분 후 쿠키가 사라졌음을 확인할 수 있다. 

 

 

 

고구마, 옥수수, 블루베리 선택 후 장바구니 추가

장바구니 비우기 클릭

비운 후 장바구니 보기 클릭

 

 


[예제] 로그인 페이지를 만들어서 세션을 사용해보자.

 

10_example.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <form action="http://localhost:8181/webTesting/com/java/servlet/Example10_SessionSet" method="post">
 	<label>아이디</label>
	<input type="text" name="id"/>
	<br /><br />
	
	<label>비밀번호</label>
	<input type="text" name="pwd"/>
	<br /><br />
   
   	<input type="submit" value="로그인"/>
	<input type="reset" value="취소" />
   </form>
   <br /><br />
   
   <div>
	<a href="http://localhost:8181/webTesting/com/java/servlet/Example10_SessionGet">
		세션 보기</a><br /><br />
	<a href="http://localhost:8181/webTesting/com/java/servlet/Example10_SessionDel">
		로그아웃</a>
	</div>
</body>
</html>

 

 

 

Example10_SessionSet.java

package com.java.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class Example10_SessionSet
 */
public class Example10_SessionSet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Example10_SessionSet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    /* 웹 브라우저에서 서버로 어떤 데이터를 요청하면, 서버측에서는 알맞은 로직을 수행한 후
     * 데이터를 웹 브라우저에 응답한 후 서버는 웹 브라우저와의 관계를 종료한다. 
     * 연결이 끊어졌을 때 어떤 정보를 지속적으로 유지하기 위한 수단으로 쿠키라는 방식을 사용한다.
     * 쿠키는 서버에서 생성하여 서버가 아닌 클라이언트측에 특정 정보를 저장한다.(4KB 용량 제한)
     * 
     * 세션도 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단입니다. 
     * 단, 쿠키와 달리 클라이언트의 특정 위치에 저장되는 것이 아니라, 서버상에 객체로 존재한다.
     * 따라서 세션은 서버에서만 접근이 가능하여 보안에 좋고, 데이터 용량 한계가 없다.
     */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		System.out.println(id + "\t" + pwd);
		
		// 현재 session 이 존재하면 기존 session 리턴하고, 존재하지 않은 새로운 session 리턴
		HttpSession session = request.getSession();
		String msg = "";
		if(session.isNew()) {
			msg= "새로운 세션이 생성";
			
			session.setAttribute("id", id);
			session.setAttribute("pwd", pwd);
		}else {
			msg= "기존 세션이 반환";
		}
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<html>");
		out.print("<head><title></title></head>");
		out.print("<body>");
		
		out.print("<script type='text/javascript'>");
		out.print("alert('"+ msg +": 로그인 성공');");
		out.print("location.href='http://localhost:8181/webTesting/Servlet/10_example.html';");
		out.print("</script>");
		out.print("</body>");				
		out.print("</html>");				
		out.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

 

 

 

Example10_SessionGet.java

package com.java.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class Example10_SessionGet
 */
public class Example10_SessionGet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Example10_SessionGet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		
		if(!session.isNew()) {
			String id= (String) session.getAttribute("id");
			String pwd = (String) session.getAttribute("pwd");
			
			System.out.println(id + "\t" + pwd + "\t" + session.getId());
			
			response.setContentType("text/html;charset=utf-8");
			PrintWriter out = response.getWriter();
			out.print("<html>");
			out.print("<head><title></title></head>");
			out.print("<body>");
			
			out.print("<h3> 아이디:" +id+ "</h3>");
			out.print("<h3> 비밀번호:" +pwd+ "</h3>");

			out.print("</body>");				
			out.print("</html>");				
			out.close();
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

 

 


Example10_SessionDel.java

package com.java.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class Example10_SessionDel
 */
public class Example10_SessionDel extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Example10_SessionDel() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		if(request.isRequestedSessionIdValid()) {
			System.out.println("세션 아이디가 유효합니다.");
		}else {
			System.out.println("세션 아이디가 유효하지 않습니다.");
		}
		
		HttpSession session = request.getSession();
		
		if(!session.isNew()) {
			session.invalidate();	//세션종료
			
			if(request.isRequestedSessionIdValid()) {
				System.out.println("세션 아이디가 유효합니다.");
			}else {
				System.out.println("세션 아이디가 유효하지 않습니다.");
			}
		}
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<html>");
		out.print("<head><title></title></head>");
		out.print("<body>");
		
		out.print("<h3> 로그아웃 되었습니다. </h3>");
		
		out.print("</body>");
		out.print("</html>");
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

 


Example11.java

package com.java.servlet;

import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class Example11
 */
@WebServlet("/Example11")
public class Example11 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Example11() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		
		// 세션 생성시간
		long createTime = session.getCreationTime();
		
		// 세션 마지막 접근시간
		long lastTime = session.getLastAccessedTime();
		
		// 사이트 머문 시간 = 마지막 접근시간 - 생성시간 
		long userTime = (lastTime - createTime)/60000;
		
		Date date = new Date(createTime);
		System.out.println("생성시간: "+createTime + "\t" + date);
		System.out.println("마지막 접근시간:" +lastTime + "\t" + new Date(lastTime).toString());
		System.out.println("머문시간:" +userTime);
		
		/*if(userTime < 5) { // 5분이 안되면 세션자동으로 끊어준다.
			session.invalidate();
		}*/
		
		int max = session.getMaxInactiveInterval() / 60; // 30분부여 - 서버
		System.out.println(max + "분");
		
		// 액션이 없을 경우 세션 시간 설정으로 자동 종료
		if(request.isRequestedSessionIdValid()) {
			System.out.println("세션 아이디가 유효합니다.");
		}else {
			System.out.println("세션 아이디가 유효하지 않습니다.");
		}
		
		// 액션(마우스나 키보드)이 없을때 세션 시간 설정으로 자동 종료
		session.setMaxInactiveInterval(60); 
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

세션 테스트 클릭

 

 

 

 

Example11.java

package com.java.servlet;

import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @author : 김소현
 * @Date : 2020. 6. 10.
 * @Description :
 */

public class Example11 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Example11() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		
		// 세션 생성시간
		long createTime = session.getCreationTime();
		
		// 세션 마지막 접근시간
		long lastTime = session.getLastAccessedTime();
		
		// 사이트 머문 시간 = 마지막 접근시간 - 생성시간 
		long userTime = (lastTime - createTime)/60000;
		
		Date date = new Date(createTime);
		System.out.println("생성시간: "+createTime + "\t" + date);
		System.out.println("마지막 접근시간:" +lastTime + "\t" + new Date(lastTime).toString());
		System.out.println("머문시간:" +userTime);
		
		/*if(userTime < 5) { // 5분이 안되면 세션자동으로 끊어준다.
			session.invalidate();
		}*/
		
		int max = session.getMaxInactiveInterval() / 60; // 30분부여 - 서버
		System.out.println(max + "분");
		
		// 액션이 없을 경우 세션 시간 설정으로 자동 종료
		if(request.isRequestedSessionIdValid()) {
			System.out.println("세션 아이디가 유효합니다.");
		}else {
			System.out.println("세션 아이디가 유효하지 않습니다.");
		}
		
		// 액션(마우스나 키보드)이 없을때 세션 시간 설정으로 자동 종료
		session.setMaxInactiveInterval(60); 
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

 

ContextLifeCycle.java

package com.java.contextLifeCycle;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * @author : 김소현
 * @Date : 2020. 6. 10.
 * @Description : 웹 어플리케이션(webTesting / context) 생명주기
 * 
 *  
 * <listener>
 * 	<listener-class>com.java.contextLifeCycle.ContextListener</listener-class>
 * </listener>
 *  
 */
public class ContextListener implements ServletContextListener{
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized~~~~~~~~~~~~~~~~~~~~~~~");
    }
    
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
	System.out.println("contextDestroyed~~~~~~~~~~~~~~~~~~~~~~~");
    }
}