JSP 정리 - 5일차

이원섭·2020년 2월 6일
0

JSP 공부

목록 보기
5/11
post-thumbnail

11.쿠키(Cookie)와 세션(Session)

11-1. 쿠키와 세션의 개념 이해

쿠키와 세션에 대해 알아보기 전에 이 두가지를 왜 사용하는 것인가?

  • HTTP 프로토콜 환경에서 서버는 클라이언트가 누군지 확인해야한다. 그 이유는 HTTP 프로토콜이 connectionless,stateless한 특성이 있기 때문이다.
  1. Connectionless --> 요청과 응답의 과정이 끝나면 연결을 끊어버리는 특징
  2. Stateless --> 통신이 끝나면 상태를 유지하지 않는 특징
    위에서 언급한 두가지의 특징을 해결하기 위해서 쿠키와 세션을 사용한다.
    이 두가지를 사용하지 않았을 떄의 예시를 들면, 쇼핑몰에서 옷을 구매하려고 로그인을 했음에도 페이지를 이동할 때마다
    로그인을 해줘야하는 불편함을 겪는다.

쉽게 말하면 쿠키와 세션은 한번 로그인을 하면 어떠한 방식에 의해서 그 사용자에 대한 인증을 유지하게 해주는 것이다.

11-1. 쿠키란?

웹브라우저에서 서버로 어떤 데이터를 요청하면, 서버측에선 알맞은 로직을 수행한 후 데이터를 웹브라우저로 응답한다. 그리고 서버는 웹 브라우저와의 관계를 종료한다. 웹브라우저에 응답 후 관계를 끊는 것은 HTTP프로토콜의 특징이다.
연결이 끊겼을 떄 어떤 정보를 지속적으로 유지하기 위한 수단으로 쿠키라는 방식을 사용한다.
쿠키는 서버에서 생성하여 서버가 아닌 클라이언트속에 특정 정보를 저장한다.
그리고 서버에 요청할 때 마다 쿠키의 속성값을 참조 또는 변경할 수 있다.
--> 쿠키란 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일(.txt형식)을 일컫는다.
--> 예시) 사용자가 로그인을 한번 하고나면 다음에 로그인 할 때 계정 정보가 자동입력되는 경우
쇼핑몰의 장바구니 기능
팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크기능


11-2. 쿠키 파헤치기

  • 쿠키는 4kb 용량으로 제한적이며, 300개까지 데이터 정보를 가질 수 있다.
  • 사용자 인증이 유효한 시간을 명시할 수 있고, 유효시간이 정해지면 브라우저가 종료되어도 인증이 유지된다.
  • 하나의 도메인당 20개의 값만 가질 수 있다.
  • 쿠키는 서버에서 생성되고 클라이언트측에 전송되어 저장된다.
  • 쿠키는 사용자가 따로 요청하지 않아도 브라우저가 request시 자동으로 서버에 전송한다.

생성 과정
캡처.PNG
쿠키클래스를 이용하여 쿠키를 생성 -> 속성 설정(ex: id="wonseob", pw="asd" ..) -> response객체에 쿠키 탑재


11-3. 쿠키 문법

  • 쿠키 관련 메소드(getter, setter)
  • setMaxAge() : 쿠키 유효기간을 설정한다.
  • setPath() : 쿠키사용의 유효 디렉토리를 설정한다.(별로 안쓰임)
  • setValue() : 쿠키의 값을 설정한다. ★
  • setVersion() : 쿠키 버전을 설정한다.
  • getMaxAge() : 쿠키 유효기간 정보를 얻는다.
  • getName() : 쿠키 이름을 얻는다.
  • getPath() : 쿠키사용의 유효 디렉토리 정보를 얻는다.
  • getValue() : 쿠키의 값을 얻는다. ★
  • getVersion() : 쿠키 버전을 얻는다.

11-4. 쿠키 예제

  1. CookieSet.jsp --> 쿠키를 생성, 설정, 탑재하는 클래스
<body>
	<%  
      	//쿠키 클래스 생성 -> 속성 설정 -> 쿠키 탑재
		Cookie cookie = new Cookie("cookieN", "cookieV"); //name과 value(둘 다 String)
		cookie.setMaxAge(60*60); //60초 * 60초 = 1시간
		response.addCookie(cookie); //response 객체를 이용해 쿠키 탑재
	%>
		<a href="CookieGet.jsp">쿠키 얻으러 가자</a>
</body>
  1. CookieGet.jsp --> 탑재된 쿠키의 정보를 확인하는 클래스
<body>
	<%
		Cookie[] cookies = request.getCookies(); //request로 쿠키를 받음
		
		for(int i=0; i<cookies.length; i++)
		{
			String str = cookies[i].getName(); //쿠키의 이름을 받는다.
		
			if(str.equals("cookieN"))
			{ //출력해주는 것
				out.println("cookies[" +i+ "] name : "+ cookies[i].getName()+"<br/>"); //쿠키의 이름
				out.println("cookies[" +i+ "] value : "+ cookies[i].getValue()+"<br/>"); //쿠키의 값
				out.println("===================<br/>");
			}
		}
	%>
	<a href="CookieDel.jsp">쿠키 지우러 가자</a>
</body>
  1. CookieDel.jsp --> 쿠키 삭제 클래스
<body>
	<%
		Cookie[] cookies = request.getCookies();//request로 쿠키를 받음
		for(int i=0; i<cookies.length; i++)
        {
			String str = cookies[i].getName();
			if(str.equals("cookieN"))
            {
				out.println("name : "+cookies[i].getName() + "<br/>");
				cookies[i].setMaxAge(0); //쿠키의 유효기간을 0으로 만들기 -> 삭제
				response.addCookie(cookies[i]); //response에 탑재를 꼭 해줘야함
			}
		}
	%>
	
	<a href="CookieTest.jsp">쿠키 확인하기</a>
</body>
  1. CookieTest.jsp --> 쿠키 확인 클래스
<body>
	<%
		Cookie[] cookies = request.getCookies(); //request로 받고
		if(cookies != null) //null이 아니면 
		{
			for(int i=0; i<cookies.length; i++) //모든 쿠키 출력
			{
				out.println(cookies[i].getName()+"<br/>");
				out.println(cookies[i].getValue()+"<br/>");
			} //cookieN에 대한 정보가 다 사라져있어야 함
		}
	%>
</body>

11-4. 세션이란?

  • 세션은 쿠키를 기반하고 있지만, 사용자 정보 파일을 클라이언트에 저장하는 쿠키와 달리 세션은 서버측에서 관리한다.
  • 세션은 서버에서만 접근이 가능하여 보안이 좋고, 저장할 수 있는 데이터에 한계가 없다.
  • 보안이 쿠키보다 좋긴하지만 사용자가 많아질수록 서버 메모리를 많이 차지하게 된다.

11-5. 세션 파헤치기

  • 세션은 각 클라이언트에게 고유 ID를 부여한다.
  • 세션 ID로 클라이언트를 구분해서 클라이언트의 요구에 맞는 서비스를 제공한다.
  • 로그인같이 보안상 중요한 작업을 수행할 때 사용한다.
  • 접속 시간에 제한을 두어 일정시간 응답이 없으면 정보가 유지되지 않게 설정이 가능하다.(세션 만료)

생성 과정
Z.PNG
Session은 JSP컨테이너에서 자동으로 생성해줌


11-6. 세션 문법

세션 관련 메소드

  • setAttribute() : 세션에 데이터를 저장한다.
  • getAttribute() : 세션에서 데이터를 얻는다.
  • getAttributeNames() : 세션에 저장되어 있는 모든 데이터의 이름(고유한 키값)을 얻는다.
  • getId() : 자동 생성된 세션의 고유한 아이디를 얻는다.
  • isNew() : 세션이 최초 생성되었는지, 이전에 생성된 세션인지를 구분한다.
  • getMaxinactiveInterval() : 세션의 유효시간을 얻습니다. 가장 최근 요청시점을 기준으로 카운트 된다.(default = 30분)
  • removeAttribute() : 세션에서 특정 데이터를 제거한다.
  • Invalidate() : 세션의 모든 데이터를 삭제한다.

11-7. 세션 예제

  1. SessionInit.jsp --> 세션 생성 클래스
<body>
	<%
		//세션 속성 생성 쿠키와 다르게 데이터의 자료형이 Object형이다.
		session.setAttribute("MySessionName", "mySessionData"); //세션1
		session.setAttribute("myNum", 12345); //세션2
	%>
	<a href="SessionGet.jsp">세션 얻으러 가자</a>
</body>
  1. SessionGet.jsp --> 세션 정보 출력 클래스
<body>
	<%
		Object obj1 = session.getAttribute("MySessionName"); //mySessionName이라는 세션의 정보를 받는다.
		String MySessionName = (String)obj1;
		out.println(MySessionName + "<br/>");
		
		Object obj2 = session.getAttribute("myNum"); //myNum이라는 세션의 정보를 받는다.
		int myNum = (Integer)obj2;
		out.println(myNum + "<br/>");
		
		out.println("**************************<br/>");
		
		String sName;
		String sValue;
		
		//Enumeration은 인터페이스다. 객체들의 집합(Vector)에서 객체들을 
		//한순간에 하나씩 처리할 수 있는 메소드를 제공하는 컬렉션이다.
		Enumeration enumeration = session.getAttributeNames(); //모든 session 얻기
		while(enumeration.hasMoreElements()){ //데이터가 있다면
			sName = enumeration.nextElement().toString(); //세션 이름담기
			sValue = session.getAttribute(sName).toString();//해당되는 세션 이름의 값을 담는다.
			out.println("sName : "+sName+"<br/>");
			out.println("sValue : "+sValue+"<br/>");
		}
		
		out.println("**************************<br/>");
		
		String sessionID = session.getId(); //컨테이너가 자동으로 생성해주는 id 가져오기
		out.println("sessionID : "+sessionID + "<br/>");
		int sessionInter = session.getMaxInactiveInterval(); //유효시간, 초단위로 출력됨. 
		out.println("sessionInter : "+sessionInter + "<br/>");
		
		out.println("**************************<br/>");
		
		session.removeAttribute("MySessionName"); //세션1 데이터 삭제
		Enumeration enumeration1 = session.getAttributeNames();
		while(enumeration1.hasMoreElements())
		{
			sName = enumeration1.nextElement().toString();
			sValue = session.getAttribute(sName).toString();
			out.println("sName : "+sName+"<br/>");
			out.println("sValue : "+sValue+"<br/>");
		}
		
		out.println("**************************<br/>");
		
		session.invalidate(); //세션의 모든 데이터 삭제
		if(request.isRequestedSessionIdValid()) //유효한 세션이 있는지 체크
		{
			out.println("session valid"); //있으면 출력
		}
		else
		{
			out.println("session invalid"); //없으면 출력
		}
	%>
</body>

11-8. 쿠키와 세션의 차이

  • 둘 다 비슷한 역할을 하며, 동작원리도 비슷하다.
  • 가장 큰 차이점은 사용자의 정보가 저장되는 위치다. 쿠키는 서버의 자원을 사용하지 않고 세션은 사용한다.
  • 보안 면에서 세션이 우수하며, 요청속도는 쿠키가 세션보다 빠르다. 세션은 서버에서 처리가 필요하기 때문이다.
  • 쿠키는 로컬에 저장되기 때문에 변질되거나 보안에 취약하지만 세션은 서버에서 처리하기 때문에 보안성이 좋다.
  • 쿠키는 만료시간이 있지만 파일로 저장되기 때문에 계속해서 정보가 남아있을 수 있다.
  • 세션은 만료시간을 정할 수 있지만 브라우저가 종료되면 시간과 상관없이 자동 삭제된다.
  • 쿠키는 정보가 있기때문에 서버에 요청시 속도가 빠르고 세션은 정보가 서버에 있기 때문에 처리가 요구되어 느리다.

11-9. 단점이 명확한 쿠키를 사용하는 이유

세션은 서버의 자원을 사용하기 때문에 무분별하게 생성되면 서버의 메모리가 감당할 수 없어지고 그러면 속도가 느려지기 때문이다.

profile
개발 공부 가즈아-!

0개의 댓글