티스토리 뷰

JSP/인프런 JSP

11. 쿠키

GrapeMilk 2020. 2. 13. 23:05

Goal

 - 쿠키에 대해 이해한다.

 - 쿠키생성시 이용되는 메서드를 이해한다.

 - 코드와 예제를 통해 쿠키설정의 절차를 이해한다.

 - 일생생활과 관련된 로그인 예제를 통해 쿠키를 이해한다.

 

1. 쿠키란?

 - 웹브라우저에서 서버로 어떤 데이터를 요청 하면, 서버측에서는 알맞은 로직을 수행한 후 데이터를 웹브라우저에 응답하고, 웹브라우저와의 관계를 종료함. (웹브라우저에 응답후 서버가 관계를 끊는 것은 http프로토콜의 특징)

 

 - 관계를 종료하면 어떤 클라이언트가 어떤 정보를 요청했는지에 대한 정보도 사라짐.

 

클라이언트와 서버의 관계종료 흐름 예시) 1)클라이언트가 로그인 페이지에서 ID와 PW를 입력함 -> 2)서버가 처리하여 로그인 성공 -> 3)서버와 웹브라우저의 관계 종료 -> 4)클라이언트가 같은 사이트의 다른 페이지로 넘어가려 했을때 로그인 정보가 사라짐 -> 5)또 다시 로그인을 해야 함(페이지 이동할 때 마다),

 

 - 이러한 불편함을 해결하고, 연결이 끊겼을 때 어떤 정보를 지속적으로 유지하기 위한 수단으로 쿠키라는 방식을 사용.

 

쿠키 사용방식 예시) 1)쿠키 객체에 인증된 값을 저장 -> 2)다시 로그인을 요청할 때 쿠키 객체를 확인하여 기존과 동일한 값이 있으면 그대로 처리

 

 - 쿠키는 서버에서 생성되지만, 서버가 아닌 클라이언트측에 특정 정보를 저장함.

 - 서버에 요청할 때 마다 쿠키의 속성값을 참조 또는 변경 할 수 있음.

 - 쿠키는 4kb로 용량이 제한적이며, 300개까지 데이터 정보를 가질 수 있음

 

2. 쿠키 문법

 - 쿠키는 서버에서 생성되고, 클라이언트측에 전송되어 저장됨.

 

 2-1 쿠키 관련 메소드

 - setMaxAge() : 쿠키 유효기간을 설정 ex) 1시간, 하루

 - setpath() : 쿠키사용의 유효 디렉토리 설정 ex) 웹어플리케이션을 저장하는 폴더에서 유효한 디렉토리 설정

 - setValue() : 쿠키의 값을 설정

 - setVersion() : 쿠키 버전을 설정

 - getMaxAge() : 쿠키 유효기간 정보를 얻음

 - getName() : 쿠키 이름을 얻음

 - getPath() : 쿠키사용의 유효 디렉토리 정보를 얻음

 - getValue() : 쿠키의 값을 얻음

 - getVersion() : 쿠키 버전을 얻음 

 

3. 쿠키 예제

 - 쿠키를 1)생성하고 2)속성을 설정하고 3)response객체에 탑재해서 클라이언트 로컬 컴퓨터에 보냄.

 

1) cookieset

 - Cookie cookie = new Cookie("cookieN", "cookieV"); 

  -> 1)쿠키를 설정하기위한 쿠키 객체 생성, 인자값으로 앞에오는게 쿠키의 Name(cookieN) 뒤에오는 값이 Value(cookiev)

 - cookie.setMaxAge(60*60);

  - > 1시간동안 쿠기가 유지됨. 2)속성 값을줌

 - response.addCookie(cookie); 

  - > 응답(쿠키객체를 보냄)을 해야 하기 때문에 response객체에 cookie객체를 add해줌 3) response객체에 탑재 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<!-- cookieset.jsp에서 실행 즉, 서버에서 쿠키가 생성됨  -->
	<%
	  Cookie cookie = new Cookie("cookieN", "cookieV"); 
	  cookie.setMaxAge(60*60); 
	  response.addCookie(cookie);
	%>
	
	<a href="cookieget.jsp">cookie get</a> <!-- 4) cookieget.jsp로  값을 넘김. 1)번에서 생성한 쿠키가 cookie get이라는 버튼을 누르면 cookieget.jps로 넘어감-->

</body>
</html>

1-1) cookieset 실행결과

- <a href= ~,jsp">cookie get</a>태그를 통해 cookie get페이지로 이동할 수 있도록 링크가 설정되며 cookie get링크를 클릭하면 cookieset.jsp 정보가 cookieget.jsp로 넘어감.

 

 

2) cookieget

 - cookieset에서 보낸 데이터를 받아주는 Java 코드 작성 

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

  - > getCookies()를 통해 cookieset.jsp로부터 값(cookieN, cookieV)을 받음. 값이 여러개일 수 있으므로 배열로 받음

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<%
	  Cookie[] cookies = request.getCookies(); 
	  
	  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">cookie delete</a>

</body>
</html>

 

2) cookieget 출력결과

- 출력결과를 통해 값이 cookies[0] name, value에 각각 값이 들어가 있는 것을 볼 수 있다.

 - cookie delete를 통해 쿠키를 삭제할 수 있는 페이지로 이동.

 

3) cookiedel

 - cookies[i].setMaxAge(0);

  - >  유효기간을 0으로만듬. 즉, 해당 쿠키를 삭제

 - response.addCookie(cookies[i]);

  - > 그 쿠키를 다시 response객체에 탑재(수정하거나, 확인을 위해서는 바뀐 값을 다시 탑재해야함)

  - > 현재까지의 흐름: 생성 -> 속성변경(유효기간 0으로) -> 탑재 (현재코드)) 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

 <%
  Cookie[] cookies = request.getCookies();
  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); 
		  response.addCookie(cookies[i]); 
	  }
  }
  %>
  
  <a href="cookietest.jsp">쿠키확인</a>

</body>
</html>

 

3) cookiedel 실행결과

 - 삭제된 쿠키가 cookieN이라는 것을 출력 결과를 통해 확인할 수 있음.

4) cookietest

 - if(cookies != null){ :

  - > 쿠키객체가 null이 아니면 for문 실행(즉 값이 있으면 for문을 실행하고 값을 출력한다) , 여기에 cookie가 찍히면 안됨(다 null값이어야 함), 전에 del로 삭제했기 때문에.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
  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].getName() + "<br/>");
	  }
  }
%>

</body>
</html>

4) cookietest 실행결과

 - JSESSIONID는 기본적으로 웹서버에서 출력하는 문장.

 - 담겨있는 쿠키가 없으므로 완벽히 삭제 된 것을 확인할 수 있다.

4. 쿠키를 활용한 login 예제

 

1) login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

	<form action = "loginOk.jsp" method="post"> 
		아이디 : <input type="text" name="id" size="10"><br/>
		비밀번호 : <input type="password" name="pw" size="10"><br/>
		<input type="submit" value="로그인">
	</form>

</body>
</html>

2) loginOk.jsp

 - if(id.equals("abcde")&& pw.equals("12345")){

  - > 둘중에 하나라도 false값이면 else실행 -> 다시 로그인하라는 페이지로 포워딩

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<%! 
		String id, pw; //form 태그에서 온 정보들을 저장하기 위해 선언부에서 id, pw언선
	%>
	<%
		id = request.getParameter("id"); 
		pw = request.getParameter("pw");
		
		if(id.equals("abcde")&& pw.equals("12345")){ 
			Cookie cookie = new Cookie("id", id);
			cookie.setMaxAge(60);
			response.addCookie(cookie);
			response.sendRedirect("welcome.jsp"); //포워딩 to welcome.jsp
		}else {
			response.sendRedirect("login.html");	// 다시 로그인 하라! login.html로 포워딩	
		}
		
	%>

</body>
</html>

 

3) welcome.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

	<%
		Cookie[] cookies = request.getCookies();
	
	for(int i = 0; i < cookies.length; i++){
		String id = cookies[i].getValue(); 
		if(id.equals("abcde")) out.println(id + "님 안녕하세요." + "<br/>"); //id가 맞으면 인사말 출력
	}
	%>
	
	<a href = "logout.jsp">로그아웃</a>
</body>
</html>

 

4) logout.jsp

 - sendRedirect는 해당 URL로 direct로 보내고(URL도 실행도 보낸 파일에서), forwarding은 URL은 해당 forwarding을 실행한 곳이지만 실행되는 서버는 forwading대상임(URL은 현재파일, 실행은 forwarding한 파일). 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

<% 
  Cookie[] cookies = request.getCookies();
  
  if(cookies != null){
	  for(int i = 0; i < cookies.length; i++){
		  if(cookies[i].getValue().equals("abcde")){ //id가 abcde인 쿠키값을 삭제함
			  cookies[i].setMaxAge(0);
			  response.addCookie(cookies[i]); //변경된 속성은다시 탑재 (생성 -> 속성입력 -> 탑재원리)
		  }
	  }
  }
  
  //response.sendRedirect("login.html");
  response.sendRedirect("cookietest.jsp"); //cookiestest에는 abcde가 삭제돼있는지 확인
 
%>

</body>
</html>

 - sendRedirect코드가 수행되어 cookiestes.jsp 서버로 보내 페이지를 확인해보면, 로그아웃이 정상적으로 진행되어 쿠키가 삭제된 것을 볼 수 있다. 

 

 - 보안상의 문제로 점자적으로 쿠키를 사용하지 않지만, 중요한 기능임.

 

 

'JSP > 인프런 JSP' 카테고리의 다른 글

13. 예외 페이지  (0) 2020.02.18
12. 세션  (0) 2020.02.15
10. 액션태그  (0) 2020.02.12
9. JSP 본격적으로 살펴보기 -3  (0) 2020.02.07
8. JSP 본격적으로 살펴보기 -2  (0) 2020.02.07
댓글