JSP Servlet

JSP Servlet 쿠키, 세션 (Cookie, Session)

wanttosleep1111 2023. 2. 7. 21:31

JSP Servlet 쿠키, 세션 (Cookie, Session)

 

1. 쿠키와 세션의 필요성

  • HTTP 특징
    connectionless(비연결성) : 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어버리는 특징
    stateless(무상태) : 통신이 끝나면 상태를 유지하지 않는 특징
    쿠키와 세션을 사용해 사용자의 상태를 유지할 수 있음

 


 

2. 쿠키 (Cookie)

  • 클라이언트(브라우저)에 저장되는 키와 값이 들어있는 작은 데이터 파일

 

  • 쿠키 동작 방식

 

  • 쿠키 사용 예시
    ① ID 저장, 로그인 상태 유지
    ② 일주일간 다시 보지 않기
    ③ 쇼핑몰 장바구니 기능
  • 쿠키 단점
    ① 보안에 취약
    ② 작은 허용 용량
    ③ 브라우저를 변경할 경우 다른 브라우저에게 저장한 쿠키 값을 사용할 수 없음

 


 

3. 쿠키 생성, 전달, 확인, 제거하기

  • 쿠키 생성
    Cookie cookie = new Cookie(String, String);
    유지 기간 설정 (초)
    cookie.setMaxAge(int);

  • 생성한 쿠키를 response에 담아 클라이언트에게 전달
    response.addCookie(cookie);
    ※ 쿠키 생성과 클라이언트에게 전달을 한 번에 하기 (유지 기간은 생략)
    reponse.addCookie(new Cookie(String, String));

  • 쿠키 확인 : Cookie(n, v); 값을 가져올 때 이름과 데이터를 무조건 같이 가져옴
    Cookie[] cookies = request.getCookies();
    ※ for문과 .getName() .getValue()를 사용해보기

    for (int i = 0; i < cookies.lengthi++) {
    out.print(cookies[i].getName() + " : " + cookies[i].getValue());}


  • 쿠키 삭제 : 쿠키를 삭제하는 메소드는 없음
    쿠키 자체를 새로 덮어씌워 만들고 유지 시간을 0초로 만든 후, 클라이언트에게 전달
    Cookie cookie = new Cookie("name", null);
    cookie.setMaxAge(0);

    response.addCookie(cookie);
 

 

 

<%@ 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>
	
	<%
		// Cookie(String, String)
		Cookie cookie = new Cookie("test", "testCookie");
	
		cookie.setMaxAge(60*60*24*365);

		response.addCookie(cookie);
		response.addCookie(new Cookie("test2","test2Cookie"));
	
	%>
	
	<a href="Ex01GetCookie.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>Insert title here</title>
</head>
<body>

	<!-- 생성된 쿠키 값을 확인하는 페이지 -->
	<%
		// Cookie(n, v);
		Cookie[] cookies = request.getCookies();
		
		for (int i = 0; i < cookies.length; i++) {
			out.print(cookies[i].getName() + " : " + cookies[i].getValue());
			out.print("<br>");
		}
	%>
	
	<a href="Ex01RemoveCookie.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>Insert title here</title>
</head>
<body>
	
	<!-- 요청에 의해 쿠키의 값을 삭제하는 페이지 -->
	<%
		Cookie cookie = new Cookie("test", null);
		cookie.setMaxAge(0); // 유지 시간 0초
		
		response.addCookie(cookie);
	
	%>
	
	<a href = "Ex01GetCookie.jsp">쿠키 확인</a>
</body>
</html>

 

3. 세션 (Session)

  • 브라우저가 종료되기 전까지 클라이언트의 정보를 유지하게 해주는 기술
    사용자 정보 파일을 서버 측에서 관리

 

  • 세션 동작 방식

 

  • 세션 특징
    ① 각 클라이언트에게 고유 ID를 부여
    ② 보안 면에서 쿠키보다 우수
    ③ 사용자가 많아질수록 서버 메모리를 많이 차지하게 되고, 속도가 느려짐

  • 세션 사용 예시
    로그인 같이 보안상 중요한 작업을 수행할 때 사용

  쿠키 (Cookie) 세션 (Session)
사용자 정보 저장 위치 클라이언트 서버
보안 상대적으로 불안전 상대적으로 안전
속도 상대적으로 빠름 상대적으로 느림
생명주기 만료일이 되면 삭제 브라우저 종료 시 삭제

 


 

4. 세션 생성, 확인

  • 세션 생성 : 내장 객체가 이미 존재함으로 따로 선언하지 않아도 된다.
    session.setAttribute(String, Object);

  • 세션 확인
    ① 하나씩 값 가져오기 : Object형태로 반환되므로, 다운캐스팅 필요
    (type) session.getAttribute(String);
    ② 한 번에 모든 세션을 가져오기
    Enumeration 변수명 = session.getAttributeNames();
    ※ import Enumertaion 필요

    가져온 세션을 출력해보기(Enumeration 타입의 세션들에서 세션을 하나씩 꺼내오기)
    while(세션변수명.hasMoreElements()) {
    String 변수명 = 세션변수명.nextElement().toString();
    out.print(변수명);
    out.print(session.getAttribute(변수명));}

<%@ 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>

	<%	
		// 1. 세션 값 설정
		// Cookie(String, String);
		// session(String, Object);
		session.setAttribute("id", "onlyPractice");
		session.setAttribute("pw", 123);
	%>

	<a href = "Ex02GetSession.jsp">1. 세션 확인하기</a>
	<a href = "Ex02GetSessions.jsp">2. 세션들 확인하기</a>
	
	
</body>
</html>

 

<%@ 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>
	
	<!-- 1. 따로따로 값 가져오기-->
	
	<%
		String id = (String) session.getAttribute("id");
		int pw = (int) session.getAttribute("pw");
	
	%>
	
	id : <%= id %> <br>
	pw : <%= pw %>
	
</body>
</html>

 

<%@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>Insert title here</title>
</head>
<body>
	
	<!-- 세션의 값을 한 번에 확인할 수 있는 페이지 -->
	
	<%
		Enumeration names = session.getAttributeNames();	
		
		// 이름의 개수가 몇 개인지 모르므로 while문 사용
		while(names.hasMoreElements()) {
			String name = names.nextElement().toString();
			out.print(name + " : ");
			out.print(session.getAttribute(name));
			out.print("<br>");
		}
	%>
</body>
</html>

 


 

▶ 실습

<%@ 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>

	<form action="logincheck.jsp" method="post">
		아이디 : <input type='text' name='id'> <br>
		비밀번호 : <input type='text' name='pw'> <br>
		<input type="submit" value="로그인">
	</form>
	
</body>
</html>

 

<%@ 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>
	<%
		request.setCharacterEncoding("UTF-8");
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		if (id.equals("test") && pw.equals("12345")) {
			session.setAttribute("name", "쿠키몬스터");
			RequestDispatcher rd = request.getRequestDispatcher("main.jsp");
			rd.forward(request, response);
		} else {
			RequestDispatcher rd = request.getRequestDispatcher("logininfom.jsp");
			rd.forward(request, response);
		}
	
	%>
</body>
</html>

 

<%@ 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>
	<%
		session.removeAttribute("name");
		response.sendRedirect("loginform.jsp");
	%>
</body>
</html>

 

<%@ 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 name = (String) session.getAttribute("name");
		
		out.print(name+"님 환영합니다.");
	%>
	<br>
	<a href=logout.jsp>로그아웃</a>
</body>
</html>