상태정보 유지기술 쿠키와 세션

3 minute read



상태정보 유지기술

  • 쿠키와 세션





쿠키(Cookie)

  • 사용자의 컴퓨터에 클라이언트(사용자) 정보를 저장
  • 서버의 부하가 분산
  • 보안상의 문제가 발생할 수 있다.
  • 정보저장 유효기간을 사용자가 설정한다.
    • 브라우저가 닫힌 이후에도 유지.
  • 한 사이트에서 저장할 수 있는 쿠키 객체는 20개로 한정되어 있음.
  • 하나의 쿠키에 저장할 수 있는 데이터는 브라우져별 한계가 있음(4k)
  • 컴퓨터에 쿠키 한계치(300개)가 오게 되면 랜덤하게 저장된 쿠키가 삭제됨.
  • 쿠키에 저장된 데이터 타입은 문자열만 가능.
  • 쿠키는 웹서버가 만든다.

동작방식

  1. 쿠키를 웹서버가 생성
  2. 클라이언트의 쿠키저장소에 쿠키저장
  3. 쿠키를 웹서버에 전송

쿠키생성


<% 
  Cookie cookie = new Cookie("cName", "cValue");
  response.addCookie(cookie);
%>

쿠키객체 얻어오기


Cookie[] cookies = request.getCookies();



메서드 리턴타입 설명
getName() String 쿠키의 이름을 추출
getValue() String 쿠키의 값을 추출



쿠키생성 예제

1. makeForm.jspjsp파일 생성


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<form action="set.jsp" method="post">
		쿠키이름 : <input type="text" name="cName"> <br>
		쿠키 값 : <input type="text" name="cValue"><br>
		<input type="submit" value="쿠키설정">	
	</form>
</body>
</html>


2. set.jsp 생성

  • 인코딩 후, cName, cValue getParameter()로 받아오기
  • 쿠키생성
  • 쿠키전송

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>   
 <%
 	request.setCharacterEncoding("utf-8");
 	String cName = request.getParameter("cName");
 	String cValue = request.getParameter("cValue");
 	
 	//쿠키생성
 	Cookie cookie = new Cookie(cName, cValue);
 	
 	//쿠키전송
 	response.addCookie(cookie);
 %>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h2>쿠키설정 완료</h2>
	<a href="get.jsp">설정된 쿠키조회</a>
	
</body>
</html>


3. get.jsp생성

  • 쿠키 값 받아오기
  • 쿠키 조회

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Cookie[] cookies = request.getCookies();

	StringBuilder sb = new StringBuilder();
	for(Cookie c : cookies) {
		String cName  = c.getName();
		String cValue = c.getValue();
		
		sb.append("쿠키이름 : " + cName + ", ");
		sb.append("쿠키값 : " + cValue + "<br>");
		
		// request영역에 올리기도 가능
		//pageContext.setAttribute("cookieData", sb.toString());
	}
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>설정된 쿠키정보</h2>
	<%= sb.toString() %>
	<%-- ${ cookieData } --%>
	
	<a href="makeForm.jsp">쿠키설정 이동</a>
</body>
</html>



쿠키의 구성

번호 명칭 설명
1 이름(name) 각각의 쿠키를 구별하는데 사용.
2 값(value) 쿠키의 이름과 관련된 값
3 유효시간(maxAge) 쿠키의 유지시간
4 도메인(domain) 쿠키를 전송할 도메인
5 경로(path) 쿠키를 전송할 경로

1.쿠키이름제약

  • 아스키코드의 알파벳과 숫자만을 포함할 수 있다.
  • 콤마(,) 세미콜론(;) 공백(‘ ‘) 등의 문자 포함 불가
  • ’$’로 시작할 수 있다.


2. 쿠키값 : 인코딩과 디코딩

  • 쿠키의 인코딩과 디코딩으로 한글과 같은 값 처리한다.
  • 인코딩 : 쿠키의 이름이 한글일때 그냥 넣을 수 없으므로, 인코딩을 해줘야함.
    • 인코딩 후 쿠키이름 : %EC%95%84%EC%95%84%EC%95%84, 쿠키값 : %EC%9D%B4%EC%9D%B4%EC%9D%B4 으로 출력되므로 우리가 이해할 수 있게 디코딩 필요

<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>   
 <%
 	request.setCharacterEncoding("utf-8");
 	String cName = request.getParameter("cName");
 	String cValue = request.getParameter("cValue");
 	
 	// encoding ( 쿠키값이 한글일  그냥 넣을  없음! )
 	cName = URLEncoder.encode(cName,"utf-8");
 	cValue = URLEncoder.encode(cValue,"utf-8");
  //쿠키이름 : %EC%95%84%EC%95%84%EC%95%84, 쿠키값 : %EC%9D%B4%EC%9D%B4%EC%9D%B4 으로 출력되므로 디코딩 필요
 	
 	//쿠키생성
 	Cookie cookie = new Cookie(cName, cValue);
 	
 	//쿠키전송
 	response.addCookie(cookie);
 	
 	
 %>

  • 디코딩 : get.jsp파일에서 수행
    • 디코딩을 해주어야 우리가 이해할 수 있는 한글형식이 됨.
    • 쿠키이름 : 아아아, 쿠키값 : 이이이

<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Cookie[] cookies = request.getCookies();

	StringBuilder sb = new StringBuilder();
	for(Cookie c : cookies) {
		String cName  = c.getName();
		String cValue = c.getValue();
		
		// decoding  해줘야 우리가 이해할  있게 출력됨
		cName = URLDecoder.decode(cName, "utf-8");
		cValue = URLDecoder.decode(cValue, "utf-8");
		
		sb.append("쿠키이름 : " + cName + ", ");
		sb.append("쿠키값 : " + cValue + "<br>");
		
		// request영역에 올리기도 가능
		//pageContext.setAttribute("cookieData", sb.toString());
	}
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>설정된 쿠키정보</h2>
	<%= sb.toString() %>
	<%-- ${ cookieData } --%>
	
	<a href="makeForm.jsp">쿠키설정 이동</a>
</body>
</html>
  


3. 쿠키 유효시간

  • Cookie.setmaxAge(int maxAge) : 초단위 설정
  • 유효기간 미 지정시, 웹브라우저 닫을 때 쿠키도 함께 삭제

//유효시간 설정.
if(cAge!= null && cAge.length() !=0 ){
  cookie.setMaxAge(Integer.parseInt(cAge) * 60);
}

  • 쿠키를 쓰면 보안이 취약.
  • 브라우저를 꺼도, 컴퓨터를 껐다켜도 남아있음.





세션(Session)

  • 정보저장 위치 : 서버
  • 서버의 부하가 가중된다.
  • 보안상의 문제 발생 소지를 줄인다.
  • 정보저장 최대 유효기간이 브라우저가 닫힐 때 까지 이다.
  • 정보 저장시 객체타입이 가능하다.
  • 클라이언트마다 세션생성
  • 웹 컨테이너에서 클라이언트의 정보를 보관할 때 사용
  • 별도의 속성을 사용하지 않은 경우 기본설정은 true (page session = “true”)

<%@ page session = "true" %>
<%
   ...
   session.setAttribute("userInfo", userInfo);
%>
  
  • Servlet에선 내장객체가 없어서 세션 객체를 얻어와야함. new로 만드는 경우는 없음


종료와 타임아웃

  • 세션 타임아웃 시간설정
  • web.xml에 설정(분 단위)

<session-config>
   <session-timeout>
     30
   </session-timeout>
</session-config>

  • 프로그램에서 설정(API활용 : 초단위)
    • session.setMaxInactiveInterval(int interval);

Servlet에서 세션객체 얻기


// 세션이 없을 경우 새롭게 생성, 존재한다면 존재하는 객체 반환
HttpSession session = request.getSession();
HttpSession session = request.getSession(true);

// 세션이 없을 경우 null, 존재한다면 존재하는 객체 반환
HttpSession session = request.getSession(false);

세션 값 설정, 추출

  • 설정 : session.setAttribute(“”);
  • 추출 : session.getAttribute(“”);
  • 삭제 :
    • session.removeAttribute(“”);
    • session.invalidate(); : 세션의 모든 객체 삭제