본문 바로가기
JSP Servlet

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

by wanttosleep1111 2023. 2. 7.

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>

'JSP Servlet' 카테고리의 다른 글

JSP Servlet Web_MVC  (0) 2023.02.13
JSP Servlet Scope  (0) 2023.02.08
JSP Servlet 내장 객체 (Implicit Object)  (0) 2023.02.04
JSP Servlet Java Server Pages 기본  (0) 2023.01.30
JSP Servlet 데이터 전송 방식 Get, Post  (0) 2023.01.28

댓글