IT 개발노트

쿠키와 세션 본문

기초튼튼/JSP

쿠키와 세션

limsungju 2019. 4. 30. 13:37

HTTP의 비연결성
- 웹 프로그램은 기본적으로 현재 페이지에서 다른 페이지로 이동하면 현재 페이지에 저장된 값들이 모두 소멸된다.
- 다수의 페이지로 구성된 웹애플리케이션에서 사용자의 편의를 위해 인증 후의 값을 유지할 필요가 있다.
- 웹을 지원하는 통신 규약 HTTP는 비연결 또는 무상태 특성을 가진다.

장점
- 서버에 접속한 클라이언트 수가 많아도 서버의 부담이 적다.
- 웹의 비연결 특성은 초기에 웹 서비스를 빠르게 성장시킨 계기이다.

단점
- 정보를 유지해야 할 부분도 있는데 정보를 유지할 수가 없다.
ex) 인터넷 쇼핑몰에서 상품을 구매할 경우, 사용자는 장바구니에 상품을 담기도 하고 삭제하기도 한다.
이럴경우, 장바구니 페이지는 다른 페이지로 이동해도 장바구니의 정보를 유지해야 하는데 HTTP의 비연결성이 이것을 어렵게 한다.
- 이러한 비연결성을 보완하고 페이지 간의 지속성 서비스를 제공하기 위해서 쿠키, 세션이 있다.

cookie
- 클라이언트에 저장
- 보안에 취약
- 쿠키 조작 및 변조 가능
- 복잡한 코드 작성

session
- 서버에 저장
- 보안이 우수
- 사용자 수가 증가할 경우, 서버의 성능 저하 주의
- 쿠키보다 코드 작성 방법이 쉽다.

쿠키 생성 및 수정

response.addCookie(new Cookie("쿠키변수명", "값"));
response.addCookie(new Cookie("age", "10"));

쿠키 읽기
- java code 방식

Cookie[] cookies = request.getCookies();
if(cookies != null) {
	for(int i=0; i<cookies.length; i++) {
    	if(cookies[i].getName().equals("쿠키변수명")) {
        	out.println("이름 : " + URLDecoder.decode(cookies[i].getValue(), "utf-8"));
     	}
 	}
}

- EL(Expression Language) 방식

${cookie.쿠키변수명.value}

쿠키 변수는 String Type만 가능하며 특수문자, 한글을 사용하고자 할 경우 인코딩시켜야 한다.(톰캣 하위 버전에만 해당된다.)

response.addCookie(new Cookie("name", URLEncoder.encode("김기사", "UTF-8")));

쿠키 삭제

Cookie cookie = new Cookie("name", ""); // name 변수값을 빈값으로 설정
cookie.setMaxAge(seconds) // 쿠키의 유효기간을 초단위로 설정
cookie.setMaxAge(0) // 쿠키가 즉시 삭제됨
cookie.setMaxAge(-1) // 브라우저를 닫으면 쿠키가 삭제됨

실습 코드

- 쿠키 만들기

<%
  	// new Cookie("쿠키변수명","값")
  	Cookie cookie = 
		new Cookie("id", URLEncoder.encode("김철수","utf-8"));
  	Cookie cookie2 = new Cookie("pwd", "1234");
  	//쿠키는 스트링만 저장할 수 있음
  	Cookie cookie3 = new Cookie("age", "20");
  	// 쿠키의 유효시간 설정(초단위)
  	cookie.setMaxAge(10);
  	// 쿠키가 클라이언트에 저장됨
  	response.addCookie(cookie);
  	response.addCookie(cookie2);
  %>
  쿠키가 생성되었습니다.
<!-- URLEncoder.encode("인코딩할 문자열", "캐릭터셋")
URLDecoder.decode("디코딩할 문자열", "캐릭터셋") -->  
  <br>
  <a href="useCookie.jsp?name=<%=URLEncoder.encode("김철수","utf-8")%>">
	쿠키 확인</a>

- 쿠키 확인하기

<%
  	Cookie[] cookies = request.getCookies(); //쿠키배열
  	if (cookies != null) {
  		for (int i = 0; i < cookies.length; i++) {
  			//if(cookies[i].getName().equals("age")){
  				out.println("쿠키이름:" + cookies[i].getName());
  				out.println(",쿠키값:" + 
						URLDecoder.decode(cookies[i].getValue(),"utf-8") + "<br>");
  			//}
  		}
  	}
  %>
  <!-- cookie.쿠키변수명.value => 쿠키변수의 값 -->
  <!-- EL(Expression Language, 표현언어) 
JSESSIONID 클라이언트의 식별자
	웹브라우저가 다르거나 닫았다가 다시 열면 부여
	새탭, 새창으로 열면 같음
-->
  아이디 : ${cookie.id.name} ${cookie.id.value}
  <br>
  비번 : ${cookie.pwd.name} ${cookie.pwd.value}
  <br>
  이름 : ${param.name}
  <br>

  <a href="deleteCookie.jsp?name=${param.name}">쿠키 삭제</a>
  <br>
  <a href="editCookie.jsp">쿠키 변경</a>
  <br>

- 쿠키 삭제하기

<%
	// new Cookie("쿠키변수명",""); 쿠키가 삭제됨
	Cookie cookie = new Cookie("id", "");
	cookie.setMaxAge(0); //즉시 삭제
	//cookie.setMaxAge(-1); //브라우저를 닫을 때 삭제
	response.addCookie(cookie);
	//pwd 쿠키변수 삭제
	Cookie cookie2 = new Cookie("pwd", "");
	cookie2.setMaxAge(0);
	response.addCookie(cookie2);
%>
쿠키가 삭제되었습니다.
<a href="useCookie.jsp">쿠키 확인</a>

- 쿠키 변경하기

  <%
  	// addCookie( new Cookie("변수명","새로운 값"))
  	response.addCookie(new Cookie("id", "park"));
  %>
  아이디 : ${cookie.id.value}
  <br>
  쿠키가 변경되었습니다.
  <br>
  <a href="useCookie.jsp">쿠키 확인</a>

- 쿠키 개수 확인하기

public class Util {
	// 쿠키변수명을 입력받아 쿠키값을 리턴하는 method
	// 쿠키 배열에서 쿠키 값을 찾는 함수
	// 쿠키.getName() 쿠키변수이름, 쿠키.getValue() 쿠키값
	public static String getCookie(Cookie[] cookies, String name) {
		String result = "";
		if (cookies != null) {
			for (int i = 0; i < cookies.length; i++) {
				//쿠키변수명이 같으면
				if (cookies[i].getName().equals(name)) {
					result = cookies[i].getValue(); //쿠키값을 저장
        break;
				}
			}
		}
		return result; 
	}
}
<%@ page import="java.util.Data"%>
<%@ page import="Util 클래스 경로"%>

<%
	// Integer.parseInt(스트링) => 스트링을 숫자로
	// Integer.toString(숫자) => 숫자를 스트링으로
	String count = Util.getCookie(request.getCookies(), "count"); // 카운트 쿠키값을 가져온다.
 	int intCount=0;
	//최근 방문 시간을 쿠키에 저장
	Date date = new Date(); // 날짜 객체
	long now_time = date.getTime(); // 현재 시간
	//out.println("현재 시간 : " + now_time);
	String visitTime = Util.getCookie(
			request.getCookies(), "visit_time");
	long visit_time = 0;
	//쿠키가 존재하면
	if (visitTime != null && !visitTime.equals("")) { // 첫 방문이 아닌 경우
		visit_time = Long.parseLong(visitTime); //스트링을 long으로 
	}
	// Long.toString(숫자) 숫자를 스트링으로
	// Long.parseLong(스트링) 스트링을 숫자로
	//처음 방문하면 쿠키 신규 생성
	if (count == null || count.equals("")) { // 첫 방문인 경우
		response.addCookie(new Cookie("count", "1")); // 카운트를 1로 설정
		//방문시간을 쿠키에 저장
		response.addCookie(
				new Cookie("visit_time", Long.toString(now_time)));
		out.println("첫방문을 환영합니다.");
	} else {
		//최근 방문시간과 현재 시간을 비교
		long period = now_time - visit_time;
		out.println("현재:" + now_time + "<br>");
		out.println("최근:" + visit_time + "<br>");
		out.println("시차:" + period + "<br>");
		intCount = Integer.parseInt(count);
		if (period > 3 * 1000) { // 일정시간 경과 후 카운트를 올리기 위한 코드
			//카운트 증가       
			intCount++;
			// 쿠키 업데이트
			response.addCookie(
					new Cookie("count", Integer.toString(intCount)));
			//방문시간 업데이트
			response.addCookie(
					new Cookie("visit_time", Long.toString(now_time)));
		}
		out.println("방문횟수:" + intCount + "<br>");
		String counter = Integer.toString(intCount);
		
		/* 숫자를 이미지로 보여지게 해주는 코드
		//문자열.charAt(인덱스) 
		// 547 charAt(0) => 5, charAt(1) => 4
		for (int i = 0; i < counter.length(); i++) {
			// 이미지 경로
			String img = "<img src='../images/" 
				+ counter.charAt(i) + ".gif'>";
			out.println(img);
		}
		*/
	}
%>

세션 생성 및 수정

session.setAttribute("세션변수명", 세션값) // 세션값에는 모든 Type을 저장할 수 있음, 특수문자/한글도 사용가능

세션 읽기

session.getAttribute("세션변수명")

세션의 유효시간 설정

- 코드에 직접 설정하는 방법

session.setMaxInactiveInterval(초);

- web.xml에 설정하는 방법(분 단위)

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

세션 삭제

- 개별 삭제

session.removeAttribute("세션변수명");

- 전체 삭제

session.invalidate();

실습 코드

- 세션 만들기

<%
	// pageContext < request < session < application
	// 현재          요청+응답  세션만료   모든사용자 
	String id = "kim@nate.com";
	String passwd = "1234";
	int age = 20;
	double height = 170.5;
	// 세션변수 저장, setAttribute(변수명, 값)
	// 모든 자료형을 저장할 수 있음
	session.setAttribute("id", id);
	session.setAttribute("passwd", passwd);
	session.setAttribute("age", age);
	session.setAttribute("height", height);
	out.println("세션에 값을 저장했습니다.");
%>
<a href="viewSession.jsp">세션 확인</a>

- 세션 확인

<%
  	//세션 수정 method는 별도로 없음
  	//session.setAttribute("id", "park");
  	Enumeration<String> attr = session.getAttributeNames();
  	while (attr.hasMoreElements()) { //다음 요소가 있으면
  		//다음 요소
  		String key = attr.nextElement();
  		//session.getAttribute("세션변수명") 세션값 조회
  		Object value = session.getAttribute(key);
  		out.println("세션변수명:" + key);
  		out.println(",세션값:" + value + "<br>");
  	}
  	// 자바코드를 이용하는 방법
  	// 자바코드는 null처리 안됌
	//세션에 저장된 개별값 조회 
	//session.getAttribute("세션변수명") 
   	String id = (String) session.getAttribute("id");
  	Integer age = (Integer) session.getAttribute("age");
  	Object a = session.getAttribute("age");
  	Double height = (Double) session.getAttribute("height");
  	out.println("아이디:"+id+"<br>");
  	out.println("나이:"+age+"<br>");
  	out.println("나이:"+a+"<br>");
  	out.println("키:"+height+"<br>");
  	//나이를 20=>30으로 수정
  	session.setAttribute("age", 30); 
%>
<!-- EL(표현언어) 사용 방법 -->
<!-- EL로 세션을 받으면 null처리까지 해줌 -->
  아이디 : ${sessionScope.id} <%-- <%=session.getAttribute("id") %> --%>
  <br>
  비번 : ${sessionScope.passwd}
  <br>
  나이 : ${sessionScope.age}
  <br>
  키 : ${sessionScope.height}
  <br>
	세션ID : <%=session.getId()%>
  <a href="deleteSession.jsp">세션 삭제</a>

- 세션 삭제

<%
//세션에 저장된 개별값 삭제
//session.removeAttribute("id"); 
//session.removeAttribute("age");
//모든 세션변수 삭제, 세션 초기화 
session.invalidate();
%>
<%-- 아이디 : ${sessionScope.id}<br> 
비밀번호 : ${sessionScope.passwd}<br>
나이 : ${sessionScope.age}<br>
키 : ${sessionScope.height}<br> --%>
세션ID : <%=session.getId() %><br>
<a href="viewSession.jsp">세션 확인</a>

- 세션 유효시간 코드에서 설정

<%
//세션의 유효시간 변경 
//session.setMaxInactiveInterval(3600);  

//세션의 유효시간(초) : 기본값 1800초(30분) 
int timeout=session.getMaxInactiveInterval();
out.println("세션의 유효시간:"+timeout);
%>

- 세션 유효시간 web.xml에서 설정

<session-config>
	<session-timeout>15</session-timeout>
</session-config>

- 세션 개수 확인하기

<%
Integer countNum =(Integer)session.getAttribute("counter"); // 세션변수 읽기
int num=0;
// counter 이름의 세션값을 저장
// counter란 이름의 세션값이 없으면
if(countNum == null) { // 첫 방문인 경우
	countNum = 1; // 초기값 저장
} else { // 첫 방문이 아닌 경우
	num = countNum.intValue(); // Integer 객체를 정수값으로 변환
	num++; // 카운트 증가
	countNum = num; 
}
//세션값 변경
session.setAttribute("counter", countNum);
%>
당신은 <%=countNum.intValue()%>번째 방문하셨습니다.<br>
<%
String counter=Integer.toString(num); //숫자를 문자열로
/*
for(int i=0; i<counter.length(); i++){
	// 문자열.charAt(인덱스) 문자열의 n번째 문자 리턴
	String img
		="<img src='../images/"+counter.charAt(i)+".gif'>";
	out.println(img);
}
*/
%>

'기초튼튼 > JSP' 카테고리의 다른 글

JSP문서 작성하기  (0) 2019.04.06
웹프로그래밍  (0) 2019.04.05