본문 바로가기
멀티캠퍼스 풀스택 과정/백엔드

백엔드1-7. JSP-6 : 내장객체 Cookie와 Session

by 이쟝 2022. 3. 4.
Cookie란 ?
웹 브라우저가 보관하고 있는 데이터로, 웹 서버에 요청을 보낼 때 쿠키를 헤더에 담아 전송한다. 
웹 브라우저는 쿠키가 삭제되기 전까지(소멸되기 전)웹 서버에 쿠키를 전송한다. 
http 프로토콜은 request(클라이언트 -> 서버) 한 번과, response(응답)(서버 -> 클라이언트) 한 번이 이루어지고 나면
연결을 해제하게 되는데, 연결을 계속 유지시 서버 과부하가 걸릴 수 있기 떄문이다.

그래서 연결이 끊겼을 때 기존 연결 정보를 유지하기 위해 cookie나 session을 사용해서 정보를 저장했다가 보여준다.

쿠키보다 세션을 쓰는 것이 더 안정적이고, 안전하지만 세션에 저장할 공간이 부족할 경우 쿠키가 사용된다.

 

쿠키의 특징

세션(session)과 달리 사용자 PC에 저장되기 때문에(서버가 아닌 클라이언트쪽) 서버의 부하를 줄일 수 있지만 보안적인 면에서 취약하다. 

데이터 저장 용량에 한계가 있다. 

일반 사용자가 브라우저 내의 기능인 "쿠키 차단"을 했을 경우 쿠키는 무용지물이 된다.

쿠키는 웹 브라우저의 정보를 웹 브라우저에 저장해서, 이후에 서버로 전송되는 요청에는 쿠키가 가지고 있는 정보가 같이 포함돼 전송된다. 이 때 웹 서버는 웹 브라우저의 요청 속에 포함되어 있을 쿠키를 읽어서 새로운 웹 브라우저인지 이전에 요청을 했던 웹 브라우저인지 판단할 수 있다.

이러한 방법으로 웹 브라우저를 통해서 특정 사이트에 접속하면 웹 브라우저에 쿠키가 저장되어 접속한 사용자의 정보가 유지되는 것이다. 

 

쿠키의 메서드

setMaxAge( ) 쿠키 유효기간을 설정 getMaxAge( ) 쿠키 유효기간 정보를 얻음
setPath( ) 쿠키사용 유효 디렉토리를 설정 getPath( ) 쿠키사용의 유효 디렉토리 정보를 얻음
setValue( ) 쿠키의 값을 설정 getValue( ) 쿠키의 값을 얻음
setVersion( )  쿠키 버전을 설정 getVersion( ) 쿠키 버전을 얻음
    getName( ) 쿠키의 이름을 가져옴

 

쿠키의 동작방식

쿠키 생성  웹 서버에서 쿠키를 생성하고 쿠키에 응답데이터를 담아서 웹 브라우저에 전송한다. 
쿠키 저장 웹 브라우저(클라이언트)는 응답 데이터를 담고 있는 쿠키를 메모리나 파일로 저장한다.
쿠키 전송 웹 브라우저(클라이언트)는 쿠키를 요청이 있을 때마다 웹 서버에 전송한다.
웹 서버는 쿠키를 사용해서 필요한 작업을 수행할 수 있다.

 

쿠키의 생성방식

  1. 쿠키를 생성하고 response 객체에 담는다.(이미 쿠키 이름이 존재하면 값 수정기능을 한다.)
  2. 페이지가 이동되면 쿠키는 헤더에 포함되어 다른 페이지에 전송된다. 
  3. 받은 쿠키배열 이용한다.

 

쿠키 예제

1. 클라이언트 컴퓨터에 쿠키 저장하기 위한 createCookie.jsp 파일 생성하고  Cookie 객체 생성

쿠키 객체 생성하기  Cookie 변수 = new Cookie(이름, 값);

쿠키의 생명주기를 설정하는 메서드도 작성

js에서도 쿠키를 사용할 수 있기 때문에 <script>를 이용해 쿠키를 생성한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>create cookie</title>
<script>
	// js에서 쿠키 생성하기
	document.cookie = "food=cookie;path=/;expires=2022";
	document.cookie = "notice=yes"
</script>
</head>
<body>
<h2>JSP에서 쿠키생성하기</h2>
<% 
	// JSP에서 클라이언트 컴퓨터에 쿠키 저장하기
	// 1. Cookie 객체 생성
	Cookie cookie = new Cookie("username","천사");
        // 쿠키의 생명주기 설정(초단위)
        cookie.setMaxAge(300);
    
%>
<!--쿠키 확인하는 a 태그 생성 -->
<a href="cookieView.jsp">쿠키확인하기</a>
</body>
</html>

 

2. response 내장객체를 이용해서 클라이언트(접속자)에게 쿠키정보를 보낸다.

쿠키 저장하기 response.addCookie( );
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
...
<h2>JSP에서 쿠키생성하기</h2>
<% 
	// JSP에서 클라이언트 컴퓨터에 쿠키 저장하기
	// 1. Cookie 객체 생성
		...
	// 2. 클라이언트에게 쿠키 정보 보내기
	response.addCookie(cookie);
%>
<a href="cookieView.jsp">쿠키확인하기</a>
</body>
</html>

 

3. 쿠키정보를 확인할 수 있는 cookieView.jsp 파일 생성하고 클라이언트 쿠키 가져오기(request 사용)

쿠키 받아오기 Cookie[ ] 변수 = request.getCookies( );

cookie는 다양한 정보가 들어갈 수 있어서,  쿠키 배열로 받아와야한다.

쿠키 배열로 받아올 때 향상된 for문을 사용해서 Name과 Value를 화면에 표시한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
...
<body>
<h2>접속자의 쿠키 확인하기</h2>
<ol>
<%
	// 클라이언트의 쿠키 가져오기(request)
	Cookie cookie[] = request.getCookies();

	for(Cookie c:cookie) {
		// 쿠키 안에 변수(name)와 데이터(value)가 있음
		%>
		<li><%=c.getName()%> : <%=c.getValue()%></li>
		<%
	}
%>
</ol>
</body>
</html>

 

4. 결과

더보기
  • Expires가 세션이면 딱히 시간을 정해놓지 않았다는 뜻이다.

 

  • 클라이언트 cookie를 서버로 가져올 때는 request 객체
  • 서버 cookie를 클라이언트에게 보내주는 것은 response 객체

 

  • request는 이전 페이지에서 보내준 것만 가져갈 수 있다.

 


Session 이란?
웹 사이트의 여러 페이지에 걸쳐 사용되는 사용자 정보를 저장하는 방법
request와 response가 이루어지고 나면 session을 사용해 서버에서 해당 정보를 저장한다.

 

Session의 특징

사용자가 브라우저를 닫아 서버와의 연결을 끝내는 시점까지가 세션이다. (즉 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 한다.)
 
세션객체는 JSP컨테이너에서 브라우저 하나당 고유id를 가진 session을 생성해준다. 따라서 여러 브라우저가 요청을 해도 그 브라우저 고유 id의 session을 각각 만들어 준다.

기본적으로 세션은 30분 유지되고, 세션 유지 기간은 서버에 접속한 후 서버에 요청을 하지 않는 최대 시간을 말한다. 세션 유지 시간은 web.xml파일에서 설정가능하다.(Program Files > Apache > Tomcat > conf > web.xml > Ctrl + F (session-config))

 

session의 메서드

session.getId( ) 세션 고유의 ID를 문자열 형태로 변환
request.getSession( ) 세션 생성 및 얻기
서버에 생성된 세션이 있다면 세션을 반환하고, 없다면 새 세션을 생성해 반환한다.(default가 true)
 파라미터로 false를 전달하면, 이미 생성된 세션이 있을 때 그 세션을 반환하고, 없으면 null
setAttribute( ) 세션 값 저장하기
setAttribute(String name, Object value) 쌍으로 객체 Object를 저장하는 메서드
getAttribute( ) 세션 값 조회하기
getAttribute(String name) 리턴타입은 Object로 형변환 필요함
removeAttribute( ) 세션 값 삭제하기
removeAttribute(String name) name 값에 해당하는 세션 정보 삭제 할 수 있음
invalidate( )로 모든 세션 정보를 한 번에 삭제할 수 있다.

 

세션 예제

1. session에 데이터 저장하는 sessionSave.jsp 파일 생성

이 파일을 실행하면 session이라는 공간에 데이터 저장
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>session save</title>
</head>
<body>
<h2>session 데이터 저장하기</h2>
<p>할당된 sessionId : <%=session.getId()%></p>
<%
	session.setAttribute("userid", "hobak");
	session.setAttribute("username", "pumpkin");
	session.setAttribute("usertel", "010-2330-5039");
%>
<a href="sessionView.jsp">세션확인하기</a>
</body>
</html>

 

2. session 데이터를 확인할 수 있는 sessionView.jsp 생성  

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>session view</title>
</head>
<body>
<h2>session 데이터 확인하기</h2>
<ul>
	<li>아이디 : <%=session.getAttribute("userid")%></li>
	<li>이름 : <%=session.getAttribute("username")%></li>
	<li>연락처 : <%=session.getAttribute("usertel") %></li>
</ul>
<a href="/webJSP/index.jsp">홈으로</a>
</body>
</html>

 

3. session 객체의 로그인 상태와 로그아웃 상태 처리하기( 홈 페이지 index.jsp에서)

userId 변수에 값이 있으면 로그인 상태 userId 변수에 값이 없으면 (" ", null) 로그아웃상태로 처리
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.jsp</title>
</head>
<body>
<h1>홈</h1>
	<%if(session.getAttribute("userid")!=null && !session.getAttribute("userid").equals("")){ %>
		<a href="/webJSP/J04_session/sessionDel.jsp">로그아웃</a><br/> <!-- 로그인 상태일때는 로그아웃 표시 -->
	<%}else{%>	
		<a href="/webJSP/J04_sesion/sessionSave.jsp">로그인</a><br/>
	<%} %>
</body>
</html>

 

4. session 객체의 로그아웃을 처리하기 위해서 session 정보 삭제하는 sessionDel.jsp 파일 생성

Session이 삭제된다는 것은 새로운 session이 할당된다는 것이다. 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	// 모든 정보 삭제
	session.invalidate();
	
	// 삭제하고 다시 홈으로
	response.sendRedirect("/webJSP/index.jsp");
%>

 

5. 파일의 구조

index.jsp 파일 실행

 

 

로그인 클릭

세션확인하기 클릭

홈으로 클릭(현재 로그인 상태)

로그아웃 버튼 클릭(로그아웃이 되면서 session에 있는 모든 정보 삭제됨)

 


쿠키와 세션의 차이

  Cookie Session
저장 위치 클라이언트(=접속자 PC) 웹 서버
저장 형식 text Object
만료 시점 쿠키 저장시 설정(브라우저가 종료되어도, 만료시점이 지나지 않으면 자동 삭제 안됨) 브라우저 종료시 삭제(기간 지정 가능)
사용하는 자원(리소스) 클라이언트 리소스 웹 서버 리소스
용량 제한  총 300개
하나의 도메인 당 20개
하나의 쿠키 당 4KB(=4096byte)
서버가 허용하는 한 용량제한 없음
속도  세션보다 빠름 쿠키보다 느림
보안 취약함 강함

 


https://itsaessak.tistory.com/49

https://luna-lua.tistory.com/entry/lesson-JSP-%EC%BF%A0%ED%82%A4Cookie

https://araikuma.tistory.com/272

https://hahahoho5915.tistory.com/32

https://enai.tistory.com/29