JSP

세션(Session)과 쿠키(Cookie)

태로미 2023. 2. 23. 21:57

 

 

 

 

 

 

 

 

 

 

▶▶   세션(Session)과 쿠키(Cookie)

–  HTTP프로토콜의 대표적은 특성 중 하나는 상태가 유지되지 않는다는 것!

–  클라이언트가 서버로 요청을 하고 서버가 요청에 대한 응답을 하면, 이 둘의 관계는 소멸됨.  

    즉,  데이터 송/수신을 완료하면 바로 연결이 끊어짐.

–  로그인이나 장바구니 같은 서버와 클라이언트의 상태가 유지되어야 하는 프로그램을 구현하기 어려움.

–  그래서 클라이언트와 서버의 관계(상태)를 유지하기 위해 제공되는 기능이 바로 세션(Session).

 

ex )   카페에 내 정보를 등록하면 '세션'       →   '카페'가 관리함

         카페에서 나에게 쿠폰을 주면 '쿠키'    →    '내'가 관리함 

 

 

 

 

 

▶  세션 (Session)

–  서버측의 컨테이너에서 관리되는 정보.

–  세션의 정보는 컨테이너에 접속해서 종료되기까지(브라우저를 종료할 때까지)유지되며,  

    접속시간에 제한을 두어 일정 시간 응답이 없다면 정보는 더이상 유지되지 않게 설정도 가능함.

–  정보가 서버측에서 저장된다는 면에서 보안적으로 유리함.

 

 

 

▸   개요

–  세션은 클라이언트와 서버 간의 접속을 유지시켜주는 역할을 함.

–  클라이언트가 세션에 요청할 경우,  서버측에서는 클라이언트에게 클라이언트를 구분할 수 있는 식별자(세션ID)를 부여.

    →  여러 클라이언트가 요청하는 정보들은 이 세션ID를 통하여 각 클라이언트를 구분해 정보를 저장할 수 있는 것.

 

→  세션은 기본적으로 서버에 저장되지만,  사용자도 들고는 있어야 하므로 클라이언트의 쿠키에도 저장됨.


EX1   )

 

•   지금부터 Server를 '카페'로,  Client를 '고객'으로 생각하기.

•   sessionSet.jsp 페이지에서 세션 정보를 저장하고 sessionTest.jsp 페이지에서 정보를 가져와 출력해보기.

•   세션값 생성 버튼을 만들어 onclick 이벤트 처리하기.

 

—   sessionSet 페이지 만들기 (서버/카페)

<body>

<h1>sessionSet.jsp</h1>	
<h2>서버(카페)</h2>
	
	<%
		System.out.println(" 정보 요청! ");
		System.out.println(" 아아 한 잔 주세요~~~ ");
		System.out.println(" 포인트 적립 할게요. ");	
		session.setAttribute("point", "100");		// 세션에 정보를 저장
	%>
	
	<script type="text/javascript">
		alert("작업 완료!(커피 완료—세션값 생성!)");
		location.href("sessionTest.jsp");		// 페이지 이동
	</script>
	
</body>

→   스크립틀릿에서 클라이언트(고객)가 서버(카페)에게 정보(아아 한 잔)를 요청,  세션에 정보를 저장(포인트 적립)함.

→   script 태그에서 서버(카페)가 클라이언트(고객)에게 정보(아아 한 잔)을 응답하고 페이지 이동함. (카페 → 고객)

→   setAttribute() 메서드를 사용할때는 차례대로 name속성과 그에 따른 value값을 넣어주면 됨.

   실행 결과

더보기
console창에 해당 문구가 출력됨.

 

작업완료 알림창이 뜸.

 

확인 버튼을 누르면 클라이언트(고객)페이지로 넘어옴.

 

 

 

—   sessionTest 페이지 만들기 (클라이언트/고객)

<body>
<h1>sessionTest.jsp</h1>
<h2>클라이언트(고객)</h2>

	<%
		// 세션의 정보 가져오기
		String point = (String)session.getAttribute("point");	// 강제형변환
		
		if(point == null){
			System.out.println("서버 안 다녀옴! 커피 안삼");
		}else{
			System.out.println("서버 다녀옴!, 커피 삼");
		}
	%>
    
	포인트(세션값) : <%=point %> <br>

		<input type="button" value="세션값 생성" 
	      	 onclick="location.href='sessionSet.jsp';"   >

</body>

→   getAttribute() 메서드를 사용하여 앞서 저장했던 'point' 데이터를 가져와String타입의 point변수에 저장해야 함.

      그러기 위해선 강제형변환을 해줘야하는데,  이유는 뒤에가서 배우고 그렇다는 것만 알아두기.

→   if문을 사용하여,  만약 point에 데이터값이 없다면(null) '서버 안 다녀옴! 커피 안삼'을 출력하고,

      서버(카페)를 다녀와서 point가 생겨 데이터값이 있다면 '서버 다녀옴! 커피 삼'을 출력함.

→   '세션값 생성'이라는 버튼을 만들어,  버튼을 클릭하면 서버(카페) 페이지로 이동함.

→   클라이언트(고객) 페이지에서 실행하여 과정을 살펴보겠음.

   실행 결과

더보기
서버(카페)를 다녀오지 않았으므로 point값이 null이 되어 if문이 출력됨.

 

포인트, 즉 세션값이 생성되지 않았으므로 데이터는 'null'이 출력됨. 세션값 생성 버튼을 눌러 세션값을 생성해보겠음.

 

서버(카페) 페이지로 이동하여 코드가 실행되므로, 출력문이 console창에 출력됨.

 

세션값이 생성되고 이를 알리는 알림창이 뜸.

 

다시 클라이언트(고객) 페이지를 실행시켜보면 포인트 값이 출력되어 있음.

✓   session 내장객체영역객체로서 브라우저를 종료하지 않으면 데이터를 계속 공유할 수 있으므로,

      처음에 클라이언트 페이지에서 세션값 없이(포인트 : nlull) 실행했다가, 

      서버 페이지로 넘어가면서 세션값을 생성(포인트 : 100)하고,

      다시 클라이언트 페이지를 실행하면 세션값이 생성되어있는 걸 볼 수 있음.

 

 

 

EX2   )   세션 정보 추가하고,  세션값 삭제 & 초기화 버튼 만들기

 

•   sessionSet.jsp 페이지에서 세션 정보를 저장하고,  sessionTest.jsp 페이지에서 출력하기.

•   point의 값이 null일 때,  point가 null인건 이상하니까 "0"으로 바꿔주기.

•   세션값 삭제 & 초기화 버튼 만들어 메서드를 활용하여 각 기능 구현하기.

 

—   sessionSet 페이지 만들기 (서버 / 카페)

<body>

<h1>sessionSet.jsp</h1>	
<h2>서버(카페)</h2>
	
	<%
		System.out.println(" 정보 요청! ");
		System.out.println(" 아아 한 잔 주세요~~~ ");
		System.out.println(" 포인트 적립 할게요. ");
        
		// 세션에 정보 저장
		session.setAttribute("point", "100");	// 포인트
		session.setAttribute("name", "itwill");	// 이름
	%>
	
	<script type="text/javascript">
		alert("작업 완료!(커피 완료-세션값 생성!)");
		location.href="sessionTest.jsp";
	</script>

</body>

→   위의 코드에서 세션에 정보를 추가로 저장함.  'name'이라는 이름에 'itwill'이라는 데이터를 저장함.

→   서버(카페)에 오면 console창에 출력문이 출력되고,  화면에 '세션값 생성' 알림창이 뜨며 Test 페이지로 넘어감.

 

 

 

—   sessionTest 페이지 만들기 (클라이언트 / 고객)

<body>

<h1>sessionTest.jsp</h1>
<h2> 클라이언트(고객) </h2>
	
	<%
		// 세션의 정보를 가져오기
		String point = (String)session.getAttribute("point");	// 강제형변환
		String name = (String)session.getAttribute("name");		
		
		if(point == null){
			System.out.println("서버 안 다녀옴! 커피 안삼");
			point = "0";
		}else{
			System.out.println("서버 다녀옴!, 커피 삼");
		}
	%>
	
	
	이름 : <%=name %> <br>
	포인트(세션값) : <%=point %> <br>
	
	
	<input type="button" value="세션값 생성" 
	       onclick="location.href='sessionSet.jsp';"   >
	       
	<input type="button" value="세션값 삭제" 
	       onclick="location.href='sessionDel.jsp';"   >

	<input type="button" value="세션값 초기화" 
	       onclick="location.href='sessionInv.jsp';"   >
           
</body>

→   session객체의 getAttribute("이름값") 메서드를 사용하여 String타입의 변수에 넣어주기 위해 강제형변환을 함.

       즉,  세션은 데이터를 가져와서 저장할 때 강제형변환을 해야 하는데,  이에 대한 이유는 상속 배우고나서 설명함.

→   서버 페이지가 아닌 클라이언트 페이지에서 실행했다면 서버를 다녀오지 않았으므로 if문이 출력되는데,

       point가 null인건 이상하므로 point의 값을 "0"으로 바꿔줌.

→   버튼을 만들 때는 버튼의 이름(value)을 만들어주고 onclick 속성으로 클릭하면 이동할 페이지를 지정해줌.

→   서버(카페) 페이지에서 실행함.

   실행결과

더보기
서버(카페) 페이지에 있는 출력문이 출력되고, 세션에 이름과 포인트가 저장됨.

 

세션값이 생성되었다는 알림창이 뜸

 

클라이언트(고객)페이지로 넘어오고 이름과 포인트에 세션값이 출력됨.

 

'세션값 삭제' 버튼을 누르면 Del 페이지로 이동함.

 

'세션값 초기화' 버튼을 누르면 Inv 페이지로 이동함.

 

 

 

—   sessionDel 페이지 만들기 (세션값 삭제)

<body>

<h1>sessionDel.jsp</h1>

	<%
		// point 세션 정보 삭제하기
		session.removeAttribute("point");
 		System.out.println("포인트정보 삭제");	
	%>
	
	<script type="text/javascript">
    		// 서버(카페)혼자 삭제할게 아니라 클라이언트(고객)에게 알려줘야함(공유)
		alert("세션값 삭제 완료");
		location.href="sessionTest.jsp";
	</script>

</body>

→   point 세션 정보를 삭제하기 위해 session객체의 removeAttribute("이름값") 메서드를 사용함.

→   session 영역에서 공유되는 데이터를 삭제함.  포인트를 다 써서 0으로 만들어야 한다면 서버(카페)에서 지워야 함.

→  서버(카페)에서 혼자 삭제할게 아니라,  클라이언트(고객)에게도 알려줘야 함(공유) 

      세션값 삭제 완료 알림창을 띄우고 클라이언트(고객) 페이지로 이동함. 

✓   실행 결과

더보기
'세션값 삭제' 버튼을 클릭하여 point 세션값을 삭제해봄.

 

알림창이 실행되며 point의 세션값이 삭제됨.

 

point 세션값이 삭제되어 null에서 if문에 의해 0으로 출력 되고, 클라이언트(고객) 페이지로 이동함.

 

 

 

—   sessionInv 페이지 만들기 (세션값 초기화)

<body>

<h1>sessionInv.jsp</h1>

	<%
		// 세션 정보 초기화 (reset)
		session.invalidate();
		System.out.println("세션 정보 초기화");
	%>
	
	<script type="text/javascript">
	alert("세션 정보 초기화");
	location.href="sessionTest.jsp";
	</script>

</body>

→   세션 정보 초기화는 reset의 개념,  모든 세션 정보를 없애는 기능이며 session객체의 invalidate() 메서드를 사용함.

→   스크립 태그를 열어 '세션 정보 초기화' 알림창을 띄워주고 클라이언트(고객) 페이지로 돌아감.

   실행 결과

더보기
세션은 브라우저가 종료되기 전까지 데이터를 공유하므로 다시 test 페이지를 띄워도 세션 정보가 그대로 남아 있음.&nbsp; &nbsp; &nbsp; &nbsp; 세션값 초기화 버튼을 눌러봄.

 

'세션 정보 초기화' 알림창이 뜸 &rarr; 클라이언트(고객)에게 알리기 위함.'

 

모든 정보가 초기화되어 이름값도 포인트값도 없어짐.

✓   페이지를 이동할 때 JSP의 response.sendRedirect("페이지.jsp")로 이동해도 세션 정보는 저장되므로 사용 가능.
     그러나 alert기능으로 눈에 보이게끔 단계를 확인시키기 위해 JS를 사용하여 페이지 이동함.
     개발자 입장에서 사용자에게 페이지 넘어간다고 알려주고 싶으면 JS를 사용하고,

     깔끔하게 데이터만 바뀌었으면 좋겠다 싶으면 JSP 사용하면 됨.

 

 

 

EX3   )   로그인 기능 만들어보기

 

—   sessionLoginForm.jsp  페이지 만들기 (아이디 & 비밀번호 데이터 입력 받기)

<body>

<h1>sessionLoginForm.jsp</h1>

	<fieldset>
		<legend> ITWILL 로그인 </legend>
		
		<form action="sessionLoginPro.jsp" method="post">
		아이디 : <input type="Text" name="id"> <br>
		비밀번호 : <input type="Text" name="pw"> <br><hr>
		
		<input type="submit" value="로그인">
       
		</form>
	</fieldset>
	
	
</body>

→   보기좋게 하나의 그룹으로 만들기 위해 fieldset태그를 사용하고 legend태그로 제목을 지어줌.

→   전송 기능을 실행하는 '로그인'을 만들어주고,  form태그의 action속성을 사용하여 Pro페이지로 이동하게끔 설정함.

       아무래도 아이디 비밀번호는 보안이 중요하므로 post방식을 사용함.

→   사용자의 아이디, 비밀번호 정보를 입력 받고 Pro 페이지로 전달하여 해당 정보가 맞는지 아닌지 체크해야함.

   실행 결과

더보기
데이터를 입력하고 로그인을 클릭함.

 

post방식이라 주소줄에 데이터가 표시되지 않으며 Pro페이지로 이동함.

 

 

 

—   sessionLoginPro  페이지 만들기 (아이디 & 비밀번호 맞는지 확인)

<h1>sessionLoginPro.jsp</h1>
	
	<%!
		// 선언문! 멤버변수 선언
		String DBID = "apple";
		String DBPW = "1234";
	%>
	
    
	<%
		// 한글 처리
		request.setCharacterEncoding("UTF-8");
        
		// Form에서 파라미터로 전달된 정보 저장
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");

		System.out.println("입력한 ID : " + id);
		System.out.println("입력한 PW : " + pw);
		System.out.println("-----------------");
   	 %>

→   <%!   %> 선언문을 사용하여 멤버변수를 선언함. 

→   From 페이지에서 post방식으로 정보를 전달했으므로 한글 처리 해줌.

→   파라미터로 전달된 정보를 각 각 id와 pw 변수에 저장함.

   실행 결과

더보기
아이디와 비밀번호 입력 후 로그인함.

 

console창에 입력한 아이디와 비밀번호 출력됨.

 

form태그의 action속성으로 Pro페이지로 이동함.

 

 

 

—   로그인 처리 로직에 따라 코드 작성하기

 

	<%
		if(id.equals(DBID)){						
 			// 아이디 같음
			if(pw.equals(DBPW)){
 				// 아이디, 비밀번호 모두 같음
 				// 로그인 정보를 모든 페이지에 공유 → 세션에 저장
 				session.setAttribute("id", id); 
                		// 세션id만 있어도 로그인했다는걸 알 수 있음!
				response.sendRedirect("sessionMain.jsp");
			}else{
 				// 아이디만 같음
	 %>
			 	
			 	
		 <script type="text/javascript">
		 	alert("비밀번호가 다릅니다.");
		 	history.back();
		 </script>
		 	
		 	
	<%
			}
		}else{
 			//아이디 다름
 	%>
 	
 	
 		<script type="text/javascript">
 			alert("회원정보가 없습니다.");
 			history.back();
 		</script>
 	
 	
	<%
		}
	%>

→    스크립틀릿을 사용하여 JSP(Java)코드와 HTML(JS코드)로 영역을 나눠줌.

→    문자열의 값(참조형타입 데이터)을 비교할 때는 equals를 사용해야 정확한 비교 가능함.

        문자열.equals(비교대상문자열)

→    로그인 성공했을 때는 보통 알림창 잘 안뜨니까 JSP respose객체의 sendRedirect() 로 페이지 이동함.

→    location.href로 이동하면 refresh기능이 들어있으므로 새로고침되어 데이터가 reset됨.

       그런데 history.back()을 하면 기록이 남아있어서 사용자가 비밀번호만 고칠수있게끔 해줌.

   실행 결과

더보기
아이디와 비밀번호를 알맞게 입력하고 로그인함.

 

로그인이 성공하여 Main페이지로 이동함.

 

아이디는 같고 비밀번호를 다르게 입력하고 로그인함.

 

비밀번호가 다름을 알리고 다시 로그인 페이지로 돌아옴.

 

아이디를 다르게 입력하고 로그인함.

 

회원정보가 없음을 알리고 다시 로그인 페이지로 돌아옴.

 

 

 

—   sessionMain 페이지 만들기

       로그인 하고 들어오면 환영합니다 문구를 보여주고,  로그인 없이 들어오면 로그인 페이지로 이동시키기.

<h1>sessionMain.jsp</h1>

	<% 
		String id = (String)session.getAttribute("id");
	
		if(id ==null){		// 세션 아이디가 없다면 로그인정보가 없는것
			response.sendRedirect("sessionLoginForm.jsp");
		}
	%>
	
	
<h2><%=id %>님, 환영합니다!</h2>

→   위의 로그인 처리 로직에서 로그인이 성공했을 때 id값을 세션에 저장했었으므로,  해당 데이터를 가져옴.

       session 데이터는 가져와서 저장할 때,  String타입으로 강제형변환 해줘야 함.

→   세션 id값이 없다면 로그인 정보가 없는 것!  로그인 페이지로 이동시킴.

→   세션 id값이 있다면 환영문구를 보여줌.

   실행 결과

더보기
알맞은 아이디와 비밀번호를 입력후 로그인하면 Main 페이지로 이동하면서 환영문구가 보임.

 

 

 

—   로그아웃 기능을 가진 버튼 만들기

<script type="text/javascript">

function logout() {
	alert("회원님의 정보가 안전하게 로그아웃 되었습니다.");
	<%
	session.invalidate();	// 세션정보 없애기(초기화)
	%>
	location.href="sessionLoginForm.jsp";
}

</script>


<input type="button" value="로그아웃" onclick="logout();">

→   로그아웃 버튼을 만들고 클릭하면 logout() 함수가 실행되게끔 함.

→   알림창이 뜨고,  세션정보가 초기화되며 다시 로그인 페이지로 이동함.

→   

   실행 결과

더보기
아이디와 비밀번호를 입력하고 로그인하면 환영문구와 함께 Main 페이지가 보임. 이제 로그아웃 해보겠음.

 

로그아웃 알림창이 뜨며 세션 정보가 초기화되고 다시 로그인 페이지로 돌아옴.

 

 

 

 

 

 

 

 

 

 

▶  쿠키 (Cookie)

–  클라이언트측에서 관리되는 정보를 의미.

–  쿠키의 정보는 브라우저 종료와 동시에 사라지는 세션과 달리

    하드디스크에 파일로 저장되므로 그 파일이 남아있는 한 쿠키는 항상 유지되며, 

    생존 기간 또한 지정되면 생존 기간 동안 데이터가 사라지지 않음.

–  정보가 클라이언트에 저장되므로 데이터가 노출되어 보안적으로 심각한 문제가 발생할 수 있음.

    →  하드디스크에 있는 쿠키 파일을 수정할 수 있음.

–  회원제로 운영되는 웹 사이트에서 로그인 시 보이는 '아이디 저장' 기능은 쿠키의 기능임.

–  세션은 브라우저가 종료되면 정보가 사라질뿐더러 설사 저장된다하더라도 아이디는 클라이언트엔게만 필요하므로,

    굳이 서버에서 관리할 필요가 없는 정보라 서버에 부하만 주게 됨.

–  쿠키는 클라이언트에서만 사용될 데이터를 보관하고,  그 데이터는 보안적으로 문제를 일으키지 않는 데이터여야 함.

 

 

 

▸   서블릿 API를 이용한 쿠키 설정

–  쿠키 객체에서 사용할 메소드만을 선택하여 사용하면 되므로,  먼저 쿠키 객체를 생성해야 함.


Cookie cookie = new Cookie(name, value);

→  객체를 생성할 경우 바로 쿠키의 이름과 값을 입력할 수 있지만, 

     값을 입력했다고 쿠키가 메모리 또는 하드디스크에 저장된 것이 아님.

–  객체 생성 후,  생성한 쿠키를 클라이언트로 전송 해주어야 함.


response.addCookie(cookie);

→  response객체의 addCookie 메서드를 이용하면 생성한 쿠키 값을 클라이언트로 전송 가능.

 

 

 

▸   쿠키 메서드

속성 설명
  setValue(String value)   쿠키 값을 설정함.
  setMaxAge(int seconds)   쿠키 만료 기간을 지정함.
  getValue()   쿠키 값을 얻어옴.
  getMaxAge()   쿠키 만료 기간을 얻어옴.
  getName()   쿠키 이름을 얻어옴.

→  서블릿 API를 이용하여 쿠키를 사용할 때, 거의 필수적으로 사용되는 메서드이므로 외워두는게 좋음.


EX1   )   쿠키의 생성과 삭제

 

•   쿠키값 생성하고 초기화 하기

•   유효기간 설정하기

•   쿠키 정보를 전달하고 저장하기

 

—   cookieSet 페이지 만들기 (서버)

<h1>cookieSet.jsp</h1>

<h2> 서버 </h2>

	<%
    		// 쿠키 객체 생성
		Cookie cookie = new Cookie("name", "ITWILL");
	
		// 유효기간 설정
		// – int타입으로 초단위로 적어주기
		cookie.setMaxAge(600);	// = 10분 
		
		// 생성한 쿠키 클라이언트로 전달
		response.addCookie(cookie);
	%>
	
    
	<script type="text/javascript">
		alert("쿠키값 생성!");
		location.href="cookieTest.jsp";
	</script>

→   쿠키를 사용하기 위해 먼저 객체를 생성하여 쿠키의 이름과 값을 지정해줌.

→   cookie객체의 setMaxAge() 메서드로 유효기간을 초단위로 설정하고,

       response객체의 addcookie(cookie) 메서드 생성된 쿠키를 클라이언트로 전달하면,

      쿠키는 파일 형태로 클라이언트의 하드디스크에 저장됨.

→   JS를 이용하여 쿠키값이 생성되었음을 알리고 cookieTest 페이지로 이동함.

 

 

 

—   cookieTest 페이지 만들기 (클라이언트)

<h1>cookieTest.jsp</h1>

<h2>클라이언트</h2>

	<%
		// 생성된 쿠키값(정보) 가져오기
		Cookie[] cookies = request.getCookies();
		
		// 배열에서 이름으로 내가 만든 쿠키 찾기
		if(cookies != null){
			for(int i=0; i<cookies.length; i++){
				if(cookies[i].getName().equals("name")){
					// 내가 만든 쿠키가 있다면
					out.print("내가 만든 쿠키 이름 : " + cookies[i].getName() +"<br>");
					out.print("내가 만든 쿠키 값 : " + cookies[i].getValue() +"<br>");
				}		
			}
		}
	%>

	<br>
	<input type="button" value="쿠키값 생성" onclick="location.href='cookieSet.jsp';">
	<input type="button" value="쿠키값 삭제" onclick="location.href='cookieDel.jsp';">

 

→    request 객체의 getcookies() 메서드로 쿠키값을 가져오고,  쿠키는 하나가 아닌 여러 개이므로 배열에  저장함.

→   for문으로 배열의 처음부터 끝까지 접근하여,  배열에 들어있는 쿠키들 중에 내가 만든 쿠키가 있는지 이름으로 찾기.

       getName() 메서드를 사용하여 이름을 불러오고,  이는 참조형타입이므로 .equals() 비교함.

→   쿠키값 생성하는 버튼을 만들고,  클릭하면 Set 페이지로 이동하여 쿠키값을 생성시키도록 함.

→   쿠키값 삭제 버튼을 만들고,  클릭하면 Del 페이지로 이동하여 쿠키값을 삭제시킴.

 

 

 

—   cookieDel 페이지 만들기 (서버)

<h1>cookieDel.jsp</h1>

<h2>쿠키정보 삭제(서버)</h2>

	<%
		// 1. 쿠키값 가져오기
		// 2. 유효기간 만료시키기
		
		// 1.
		Cookie[] cookies = request.getCookies();
		
       	 	//2.
		if(cookies != null){
			for(int i=0; i<cookies.length; i++){
				// 해당 쿠키만 검색
				if(cookies[i].getName().equals("name")){
					// 쿠키값 삭제 (유효기간 만료시킴)
					cookies[i].setMaxAge(0);
					// 클라이언트에게 변경된 정보를 저장해서 전달
					response.addCookie(cookies[i]);
				}
			}
		}
	%>
	
	
	<script type="text/javascript">
		alert("쿠키 값 삭제완료!");
		location.href="cookieTest.jsp";
	</script>

→   쿠키는 세션처럼 초기화기능이 없으므로,  삭제하고 싶을 때는 쿠키값을 가져와 유효기간을 만료시키면 됨.

→   먼저 쿠키값을 가져오고 for문으로 쿠키 배열을 한 바퀴 돌면서 삭제하고자하는 쿠키의 이름을 찾아내게끔 조건을 검.

→   해당 쿠키의 유효기간을 setMaxAge(0)으로 설정하여 유효기간을 만료시킴. 

→   클라이언트에게 해당 쿠키의 변경된 정보를 다시 전달해야하므로,

       response객체의 addCookie메서드에 매개변수를 해당 쿠키의 인덱스로 설정하여 클라이언트에게 정보를 전달함.

   실행 결과

더보기
Test페이지에서 실행함. 쿠키값 생성 버튼을 눌러 쿠키값을 생성해보겠음.

 

쿠키값이 생성되었다는 알림창이 뜨고, 내가 입력한 쿠키의 이름과 값이 출력됨. 이제 쿠키값을 삭제해보겠음.

 

쿠키값이 삭제되었다는 알림창이 뜨고, 화면에서 쿠키값이 사라짐을 볼 수 있음.

 

 

 

EX2   )   버튼 선택에 따른 쿠키값 생성

 

—   라디오 버튼 만들기

<h1>cookieForm.jsp</h1>

	<form action="cookiePro.jsp" method="get">
	
		<input type="radio" name="language" value="kor"> 한국어
		<input type="radio" name="language" value="eng"> 영어
		
		<input type="submit" value="언어설정">
		
	</form>
	
	
	<!-- 언어 설정 
	     한국어 : "안녕하세요! 쿠키연습입니다!"
	     영어   : "Hello! CookieTest!"-->

–   언어설정버튼을 누르면 Pro페이지로 이동하여 쿠키를 생성하고 클라이언트에게 전달하는 코드를 작성해 보겠음.

 

 

 

—   쿠키 생성 & 전달

<h1>cookiePro.jsp</h1>

	<%
		// 쿠키 생성
		Cookie cookie
			= new Cookie("lang", request.getParameter("language"));
			
		// 쿠키 사용 설정(유효기간)
		cookie.setMaxAge(3600);			// = 1시간
		
		// 클라이언트에게 쿠키 정보 전달
		response.addCookie(cookie);		// 쿠키 객체를 담아서 보냄
	%>
	
	
	<script type="text/javascript">
		alert("언어 쿠키정보를 생성!");
		location.href="cookieForm.jsp";
	</script>

•   Cookie cookie = new Cookie("lang", "request.getParameter("language"));

→   lang이란 이름으로 쿠키를 생성한 것이며,  value는 파라미터로 전달된 name값 'language' 이므로,

       Form 페이지에서  '한국어'를 선택했다면 한국어 라디오버튼의 name이 'language'에 value가 'kor' 였음.

       따라서 lang 쿠키는 한국어의 쿠키를 생성한 것이 됨.

       + 파라미터로 전달된 데이터는 무조건 String타입이므로 큰따옴표 표시해줌.

•    cookie.setMaxAge(3600);

→   쿠키의 유효기간을 설정할 수 있으며,  int타입 초단위로 나타냄.  3600초 = 1시간이며 60*60 으로도 표현 가능함. 

 

–   쿠키 정보를 생성한 후에 다시 Form 페이지로 돌아감. 

 

 

 

—   생성된 쿠키 정보를 가져와 내가 원하는 쿠키 찾기

<h1>cookieForm.jsp</h1>

<%
	// 쿠키 정보 가져오기
	Cookie[] cookies = request.getCookies();
		
	// 이 중에서 내가 원하는 쿠키 찾아내기
	// 쿠키명 - lang
		
	String lang = ""; 	// 쿠키의 언어설정 정보를 저장
		
	if(cookies != null){
		for(int i=0; i<cookies.length; i++){
			// 모든 쿠키정보중에서 쿠키명-lang인 쿠키 찾기
			if(cookies[i].getName().equals("lang")){
				// 쿠키 메세지 출력 (한국어 or 영어)
				if(cookies[i].getValue().equals("kor")){
					out.println("안녕하세요! 쿠키연습입니다! <br>");
				}else{
					out.println("Hello! CookieTest! <br>");
				}
					
				lang = cookies[i].getValue();
			}
		}
	}
%>

•   Cookie[] cookies = request.getCookies();

→   쿠키는 배열로 저장이 되며,  브라우저에 저장되어있는 모든 쿠키의 정보를 들고옴.

•   String lang = "";

→   마지막에 결론나는 value값,  'kor' 또는 'eng'를 저장하는 변수를 만들어줌.

•   if(cookies[i].getName().equals("lang")){

→   cookies 배열에 값이 있을 때,  for문을 사용하여 모든 쿠키 정보에 접근하면서 내가 원하는 쿠키 정보를 찾음.

      내가 원하는 쿠키의 이름을 알고 있으므로,  배열 i번째의 쿠키의 이름이 'lang' 이 맞으면 내가 찾는 쿠키 정보임.

•   if(cookies[i].getValue().equals("kor")){

→   그런데 그 lang 쿠키의 배열 i번째의 value가 'kor'이라면,  이는 한국어 라디오 버튼을 선택한 것.

       따라서 아래의 출력문을 출력함.  아니라면 value가 'eng'고,  영어 라디오 버튼을 선택했으므로 영어 출력문을 출력함.

•   lang = cookies[i].getValue();

→   해당 쿠키의 value가 'kor'인지 'eng'인지 알아냈으면 그 값을 변수 lang에 저장함.

 

 

 

—   변수 lang의 데이터 즉,  쿠키정보가 뭐냐에 따라 라디오 박스 체크하기.

<h1>cookieForm.jsp</h1>

	
	<form action="cookiePro.jsp" method="get">
		<input type="radio" name="language" value="kor" 
        
        
        <!-- 쿠키정보가 뭐냐에 따라 라디오박스 체크하기 -->
		<% if(lang.equals("kor")){%>
		
			checked = "checked"
			
		<% } %>
		> 한국어
		
		
		<input type="radio" name="language" value="eng" 
		<% if(lang.equals("eng")){ %> 
        
        	checked = "checked" 
            
        	<% } %>
		> 영어
		
		
		<input type="submit" value="언어설정">
	</form>

–   맨 처음으로 작성했던 라디오버튼 만드는 코드에서 수정을 쫌 해보겠음.

     input 태그의 checked 앞에서 엔터를 쳐서 스크립틀릿 영역을 생성하여,  HTML영역과 Java영역으로 나눔.

     if문의 조건에 따라 전달받은 쿠키의 정보(변수 lang)가 'kor'이면 한국어 버튼이 선택되겠고,  아니면 영어가 선택됨.

   실행 결과

더보기
Form 페이지에서 실행하여 한국어를 클릭하고 언어설정 버튼을 누름.

 

내가 만든 쿠키 'lang'의  value가 'kor'이므로 한국어 출력문이 출력되고, 한국어 라디오버튼에 체크가 되어 있음.

 

개발자도구 → Application → Cookies에 들어가면 내가 생성한 쿠키가 보임. 삭제하기.

 

자, 쿠키를 삭제했으니 다시 새로운 마음으로 영어를 선택하고 새출발해보겠음. 언어설정 버튼 누름.

 

이제는 내가 만든 쿠키 'lang'의  value가 'eng'이므로 영어 출력문이 출력되고, 영어 라디오버튼에 체크가 되어 있음.

 

개발자도구를 열어 내가 만든 쿠키를 확인해봄. name은 'lang', vlaue는 'eng'. 확실함ㅋ

 

 

 

 

 

 

 

 

 

 


🐾 참조 도서 및 사이트 🐾

 

—   JSP 2.3 & Servlet 3.1