쿠키

    연결이 끊겼을때 어떤 정보를 지속적으로 유지하기 위해서 쿠키 사용한다,

    현제 보안에 취약하기 때문에 거의 쓰이지 않는다. => 현재는 세션사용

    맥락 이해 필요.

     

    쿠키 생성 삭제 예제

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!-- 쿠키(Cookie) 
    	: 웹 페이지들 사이의 공유 정보를 클라이언트 PC에 저장해 놓고 사용하는 방법.
    	  보안이 취약함
    	  클라이언트 브라우저에서 사용 유무를 설정할수 있음.
    	 
    -->
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>쿠키 만들기</title>
    </head>
    <body>
    	<h1>서버에서 쿠키를 생성하는 cookieSet.jsp페이지 입니다.</h1>
    	<%
    		System.out.println("(아래)서버에서 쿠키를 생성하였으며, 응답하기 위해서 reponse객체에 추가 하였습니다.");
    		
    		request.setCharacterEncoding("UTF-8");
    		
    		/*
    			1)쿠키는 보통 클라이언트가 접속을 하면 서버쪽에서 생성하여 
    			  해당 클라이언트에게 보내어 로컬 PC에 저장하는 방식임.
    			2)쿠키속성(이름, 값)을 설정할때는 한글로 만들어지지 않기 때문에
      			  반드시 영문이나 숫자로만 설정해야함.
    		*/
    		
    		Cookie cookie = new Cookie("gumi", "202101");
    		cookie.setMaxAge(60*60); //쿠키의 유효시간 설정(1시간)
    		//쿠키속성을 지정했다면, 반드시 reponse객체에 추가해줘야 함.(변경이 있어도 재추가)
    		response.addCookie(cookie);
    	%>
    	<br/><br/>
    	<a href="cookieGet.jsp">쿠키값 확인</a>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>쿠키 속성 읽기</title>
    </head>
    <body>
    	<h1>쿠키 속성들의 내용을 읽는 cookieGet.jsp페이지 입니다.</h1>
    	
    	<%
    		System.out.println("서버에서 쿠키를 생성하였으며, 생성된 쿠키의 값을 출력해봅니다.");
    		
    		//요청들어오는 쿠키들의 값들을 받음.
    		Cookie[] cookies = request.getCookies();
    		
    		for(int i = 0; i<cookies.length; i++){
    			String name = cookies[i].getName();
    			String value = cookies[i].getValue();
    			if(name.equals("gumi")) {
    				out.println("cookies[" +i+ "]'s name : " +name);
    				out.println("<br/>");
    				out.println("cookies[" +i+ "]'s value : " +value);
    			}
    		}
    	%>
    	<br/><br/>
    	<a href="cookieDel.jsp">쿠키 삭제</a>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>쿠키 삭제</title>
    </head>
    <body>
    	<h1>쿠키 속성을 삭제하는 cookieDel.jsp페이지 입니다.</h1>
    	
    	<%
    		System.out.println("(아래) 서버에서 쿠키를 삭제하였습니다.");
    		
    		//요청들어오는 쿠키들의 값들을 받음.
    		Cookie[] cookies = request.getCookies();
    		
    		for(int i = 0; i<cookies.length; i++){
    			String name = cookies[i].getName();		//쿠키 이름을 얻음
    			String value = cookies[i].getValue();	//쿠키 값을 얻음
    			if(name.equals("gumi")) {
    				out.println("cookies[" +i+ "]'s name : " +name);
    				out.println("<br/>");
    				out.println("cookies[" +i+ "]'s value : " +value);
    				cookies[i].setMaxAge(0);	//유효기간을 0초로 설정 => 삭제하는 효과와 동일 
    				//쿠키 수정이 있었으므로 다시 reponse객체에 쿠키를 추가 
    				response.addCookie(cookies[i]);
    			}
    		}
    	%>
    	<br/><br/>
    	<a href="cookieCheck.jsp">쿠키 확인</a>
    </body>
    </html>

    (여기서 반드시 기억해야 할것은) 쿠키를 생성하고 reponse객체에 추가해주어야한다.
    또한 변경이 일어나면 반드시 response객체에 재추가 해주어야한다.
    => 쿠키값이 일관성 있게 유지된다.

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>쿠키 확인</title>
    </head>
    <body>
    	<h1>쿠키 속성이 삭제된 것을 확인하는 cookieCheck.jsp페이지 입니다.</h1>
    	
    	<%
    		System.out.println("현재 쿠키 체크합니다.");
    		
    		Cookie[] cookies = request.getCookies();
    		
    		//유효한 쿠키 체크
    		if(cookies != null) {
    			for(int i = 0; i<cookies.length; i++) {
    				out.println("현재 남아있는 쿠키 이름 : " +cookies[i].getName()+ "<br/>");
    				out.println("현재 남아있는 쿠키 값 : " +cookies[i].getValue()+ "<br/>");
    			}
    		}
    		
    		/* 
    			확인해보니
    			현재 남아있는 쿠키 이름 : JSESSIONID					--> 서버에서 생성함
    			현재 남아있는 쿠키 값 : C44E49D6AA8F55CC86AAAD2ABBFB936F --> 서버에서 생성함
    			위의 이름과 값은 그냥 무시하면 됨.(이부분은 항상 출력됨)
    		*/
    		/* 
    			(여기서 반드시 기억해야 할것은) 쿠키를 생성하고 reponse객체에 추가해주어야한다.
    			또한 변경이 일어나면 반드시 response객체에 재추가 해주어야한다.
    			=> 쿠키값이 일관성 있게 유지된다.
    		*/
    	%>
    </body>
    </html>

    로그인 활용 쿠기 적용확인 => (세션과 이어진다.)

    login.html

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<title>로그인 페이지</title>
    </head>
    <body>
    	<h1>로그인 페이지입니다.</h1>
    	<form action="loginOk.jsp" method="post">
    		아이디 : <input type="text" name="id" size="12" required="required" /><br/>
    		비밀번호 : <input type="password" name="pw" size="12" required="required" /><br/>
    		
    		<input type="submit" value="로그인" />
    		<input type="reset" value="초기화" />
    	</form>
    </body>
    </html>

     

    loginOk.jsp

     

    <%@ 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 id, pw;
    	%>
    	
    	<%
    		id = request.getParameter("id");
    		pw = request.getParameter("pw");
    		
    		/* 
    			지금은 DB를 설정하지 않아서 아래와 같이 코드 작성함.
    			추후 DB연동하고 난뒤 코드 볁경.
    		*/
    		if(id.equals("gumi") && pw.equals("202101")) {
    			//쿠키 이름은 id, 값은 gumi
    			Cookie cookie = new Cookie("id", id);
    			cookie.setMaxAge(60); //유효기간 설정
    			response.addCookie(cookie);
    			
    			//로그인 성공하면 sendRedirect() 이용하여 login_success.jsp파일로 이동. 
    			response.sendRedirect("login_success.jsp"); 
    		}
    		else {
    			//로그인 실패하면 sendRedirect() 이용하여 login_fail.jsp파일로 이동. 
    			response.sendRedirect("login_fail.jsp");
    		}
    	%>
    </body>
    </html>

     

    login_success.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>로그인 성공</title>
    </head>
    <body>
    	<%
    		Cookie[] cookies = request.getCookies();
    		for(int i = 0; i<cookies.length; i++){
    			String id = cookies[i].getValue(); //실제 아이디 값 얻는 코드
    			if(id.equals("gumi")) {
    				out.println(id +"님 반값습니다.");
    			}		
    		}
    	%>
    	<h1>환영합니다.</h1>
    	<a href="logout.jsp">로그아웃</a>
    	
    	<script type="text/javascript">
    		alert("로그인 성공");
    	</script>
    </body>
    </html>

    logout.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>로그아웃</title>
    </head>
    <body>
    	<%
    		Cookie[] cookies = request.getCookies();
    	
    		if(cookies != null){
    			for(int i = 0; i<cookies.length; i++){
    				String id = cookies[i].getValue(); //실제 아이디 값 얻는 코드
    				if(id.equals("gumi")) {
    					cookies[i].setMaxAge(0); //쿠키 삭제됨.
    					response.addCookie(cookies[i]); //쿠키가 변경되어 다시 추가함.
    					out.println(id + "님이 로그아웃 하셨습니다.");
    				}		
    			}
    		}
    	%>
    	<br/><br/>
    	<a href="cookieCheck.jsp">쿠키 확인</a>
    </body>
    </html>

     

    login_fail.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>로그인 실패</title>
    </head>
    <body>
    	<!-- 자바스크립트 alert함수 이용해서 메시지 창 띄우고
    		 다시 login.html 파일로 이동시킴 -->
    	<script type="text/javascript">
    		alert("로그인 실패");
    		location.href="login.html";
    	</script>
    </body>
    </html>

     


    세션이란?

    세션도 쿠키와 마찬가지로 서버와의 관꼐를 유지하기 위한 수단이다.

    단, 쿠키와 달리 클라이언트의 특정 위치에 저장되는 것이 아니라, 서버 상에 객체로 존재한다.

     

    세션의 흐름도

    세션 관련 메서드

    1. 세션(Session)
    - 웹 페이지들 사이의 공유 정보를 서버의 메모리에 저장해 놓고 사용하는 방법
    2. 세션의 특징
    - 정보가 서버의 메모리에 저장
    - 쿠키보다 보안에 유리
    - 브라우저(사용자)당 한개의 세션(sessionId)이 생성됨.
    - 세션은 유효 시간을 가짐(30분)
    - 로그인 상태 유지 기능이나 소핑몰은 장바구니 담기 기능들에 주로 사용됨.


    세션 만들기 예제

    sessionInit.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!-- 
    	1. 세션(Session)
    		- 웹 페이지들 사이의 공유 정보를 서버의 메모리에 저장해 놓고 사용하는 방법
    	2. 세션의 특징
    		- 정보가 서버의 메모리에 저장
    		- 쿠키보다 보안에 유리
    		- 브라우저(사용자)당 한개의 세션(sessionId)이 생성됨.
    		- 세션은 유효 시간을 가짐(30분)
    		- 로그인 상태 유지 기능이나 소핑몰은 장바구니 담기 기능들에 주로 사용됨.
     -->
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>세션만들기</title>
    </head>
    <body>
    	<%
    		//세션의 속성을 지정하는 코드
    		session.setAttribute("gumi", 202102);
    		session.setAttribute("zoom", "jsp");
    		session.setAttribute("daegu", "mysql");
    		
    		/* 스크립트릿으로 내부객체인 session객체를 이용하여 값을 설정함
    		   현재 이 jsp파일이 서버에 요청을 하게되면 컨테이너가 jsp파일 서블릿으로 변환함.
    		   =>session객체가 자동으로 생성되면서 컴파일이 이루어진다.*/
    	%>
    	<a href="sessionGet.jsp">세션값 확인</a>
    </body>
    </html>

     

    sessionGet.jsp

    <%@page import="java.util.Enumeration"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>세션 값 확인</title>
    </head>
    <body>
    	<%  
    		/* 
    			세션에 저장한 각 속성의 Name에 대한 value를 출력함.
    			=> session의 getAttribute()의 변환타입이 Object타입이라서
    			강제로 다운케스팅 했다.
    		*/
    		Object obj1 = session.getAttribute("gumi"); //속성값 얻기
    		Integer intValue = (Integer)obj1; //downcasting
    		out.print("gumi : " +intValue+ "<br/>"); //출력
    		
    		Object obj2 = session.getAttribute("zoom"); //속성값 얻기
    		String str = (String)obj2; //downcasting
    		out.print("zoom : " +str+ "<br/>"); //출력
    	%>
    	<br/>
    	
    	<%
    		out.println("==============================================<br/>");
    		
    		String sName;
    		String sValue;
    		
    		Enumeration<String> enumeration = session.getAttributeNames();
    		
    		//가져올 데이터가 있느냐?
    		while(enumeration.hasMoreElements()){
    			sName = enumeration.nextElement(); //있으면 가져와라
    			sValue = session.getAttribute(sName).toString();
    			
    			out.println("sName : " +sName+ "<br/>");
    			out.println("sValue : " +sValue+ "<br/>");
    		}
    		
    		out.println("==============================================<br/>");
    		
    		/* 
    			sessionId는 웹브라우저당 하나가 생기는 유니크한 값임.
    			당연히 서버에서 생성해준다.
    			
    		*/
    		String sessionId = session.getId();
    		out.println("sessionId : " +sessionId+ "<br/>");
    		
    		out.println("==============================================<br/>");
    		int sessionInterval = session.getMaxInactiveInterval();
    		out.println("세션 유효시간(초) : " +sessionInterval+ "<br/>");
    	%>
    </body>
    </html>

    C:\Program Files\Apache Software Foundation\Tomcat 8.5\conf\web.xml에서 유효시간(서버설정) 변경가능

     

    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기
    loading