본문 바로가기
프로그래밍 공부/JSP

[lesson] JSP - 쿠키(Cookie) + 세션(Session)

by Luna_lua 2023. 1. 10.
반응형

웹 브라우저가 보관하고 있는 데이터로, 웹서버에 요청을 보낼 때 헤더에 담아서 전송한다.

웹 브라우저는 쿠키가 삭제되기 전까지 웹서버에 쿠키를 전송한다.

 

장단점

- 클라이언트의 일정 폴더에 정보를 저장하기 때문에 서버의 부하를 줄일수 있다.

- 쿠키에는 식별값이 있는데 수정시 식별값이 달라진다. 서버 또한 식별값을 가지고 있기 때문에 쿠키는 매번보내면서 가지고 있는 식별값과 같은지 확인한다.(서버가 쿠키를 다가지고 있는것보다 식별값만 가지고 같은지만 판단)

- 정보가 사용자 컴퓨터(로컬)에 저장되기 때문에 보안에 위협받을 수 있다.

- 데이터 저장 용량에 한계가 있다.(상대적으로 로컬에 한계가 있고, 서버는 덜 하다)

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

 

1. 동작 방식

   1) 쿠키 생성 : 웹서버에서 쿠키를 생성하고 쿠키에 응답 데이터를 담아서 웹 브라우저에 전송한다.

       (세션보다 쿠키에 저장하는것이 대세!)

   2) 쿠키 저장 : 웹 브라우저는 응답 데이터를 담고 있는 쿠키를 메모리나 파일로 저장한다.

   3) 쿠키 전송 : 웹 브라우저는 쿠키 요청이 있을 때마다 웹 서버에 전송한다.

        웹 서버는 쿠키를 사용해서 필요한 작업을 수행할 수 있다.

 

2. 쿠키 생성 및 사용 방식

   1) 쿠키 생성 후  response 객체에 담아준다. (이미 쿠키 이름이 존재한다면 값 수정기능을 한다.)

// 쿠키 생성
Cookie cookie = new Cookie("쿠키 이름", "쿠키 값");
response.addCookie(cookie);

   2) 쿠키 유무를 확인하고 쿠키의 값을 얻어온다.

String cookieCheck = request.getHeader("Cookie");
if(cookieCheck != null){ // 쿠키 확인
	Cookie[] cookies = request.getCookie(); // 값 가져오기
    for(Cookie cookie : cookies){
    	cookie.getName();
    	cookie.getValue();
    }
}

   3) 쿠키 삭제

// 쿠키 삭제
String cookieCheck = request.getHeader("Cookie");
	if(cookieCheck != null){ // 쿠키 확인
		Cookie[] cookies = request.getCookie(); // 값 가져오기
		for(Cookie cookie : cookies){
			cookie.setMaxAge(0); // 해당 쿠키 삭제
			response.addCookie(cookie);
		}
	}

 

+ 통합 예제 (파일 4개 setCookie.jsp, getCookie1.jsp, getCookie2.jsp, delete_check)

//setCookie
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
   Cookie cookie = new Cookie("id", "apple");
   response.addCookie(cookie);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키 생성</title>
</head>
<body>
   <h3>쿠키 생성</h3>
   <a href="getCookie1.jsp">쿠키 전송</a>
</body>
</html>


//getCookie1
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키 출력, 쿠키 수정</title>
</head>
<body>
   <%
      String cookie_check = request.getHeader("Cookie");
      if(cookie_check != null){
         Cookie[] cookies = request.getCookies();
         for(Cookie cookie : cookies){
            if(cookie.getName().equals("id")){
   %>
         <p>아이디 : <%=cookie.getValue() %></p>
   <%
            }
         }
         for(Cookie cookie : cookies){
            if(cookie.getName().equals("id")){
               Cookie new_cookie = new Cookie("id", "banana");
               response.addCookie(new_cookie);
               break;
            }
         }
      }
   %>
   <a href="getCookie2.jsp">변경된 쿠키 값 확인</a>
</body>
</html>

// getCookie2
<%@ 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>
   <%
      String cookie_check = request.getHeader("Cookie");
      if(cookie_check != null){
         Cookie[] cookies = request.getCookies();
         for(Cookie cookie : cookies){
            if(cookie.getName().equals("id")){
   %>
         <p>아이디 : <%=cookie.getValue() %></p>
   <%
            }
         }
         for(Cookie cookie : cookies){
            cookie.setMaxAge(0);
            response.addCookie(cookie);
         }
      }
   %>
   <a href="delete_check.jsp">쿠키 삭제 확인</a>
</body>
</html>

// delete_check
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키 삭제 확인</title>
</head>
<body>
   <%
      String cookie_check = request.getHeader("Cookie");
      if(cookie_check == null){
   %>
   <p>쿠키가 삭제 되었습니다.</p>
   <%
      }else{
   %>
   <p>쿠키가 삭제되지 않았습니다. 기존 쿠키를 모두 지운 후 다시 시도해보세요!</p>
   <%
      }
   %>
</body>
</html>

<실행 화면>

 

 

+) 세션

내장 객체로서 브라우저마다 한 개씩 존재하고, 고유한 sessionID 생성 후 정보를 추출한다.

 

장단점 : JDP에서만 접근할 수 있기 때문에 보안성이 좋고, 저장 용량의 한계가 거의 없다.

서버에 데이터를 저장하므로, 서버에 부하가 걸릴 수 있다.

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

반응형