쿠키와 세션 관리

목차

    1. 쿠키 개념과 사용법

    쿠키(Cookie) : 웹 브라우저에 저장되는 작은 데이터 조각. 서버는 클라이언트에게 쿠키를 설정할 수 있으며, 이후 클라이언트는 해당 쿠키를 서버로 전송한다. 쿠키는 주로 사용자 식별, 상태 유지, 개인 설정 등에 사용된다.

    특징

    • 클라이언트(브라우저)에 저장된다.
    • 유효 기간을 설정할 수 있다.
    • 보안이 상대적으로 낮다.
    • 작은 데이터 저장 용량(약 4KB)을 가진다.
    setCookie.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%
    	String username = "홍길동";
    	Cookie userCookie = new Cookie("username", username);
    	/**
    	쿠키는 요청한 사용자 브라우저에 저장된다.
    	즉, setCookie.jsp 요청한 사용자에 response 객체로 데이터 조각을 담아서 보내주어야 한다.
    	*/
    	userCookie.setMaxAge(60 * 60 * 30);
    	response.addCookie(userCookie);
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h1>사용자가 이 페이지 요청시에 서버측에서 쿠키를 생성해서 응답 합니다.</h1>
    
    	<a href="getCookie.jsp">쿠키 값 읽어 보는 페이지</a>
    </body>
    </html>

    getCookie.jsp
    <%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%
    	Cookie[] cookies = request.getCookies();
    	String cUsername = null;
    	if (cookies != null){
    		// 쿠키는 여러개 존재 가능하다. 여기 페이지에서 필요한
    		// 쿠키는 우리가 정의한 username 이름을 가진 녀석이다.
    		for (Cookie cookie : cookies ){
    			if (cookie.getName().equals("username")){
    				cUsername = cookie.getValue();
    				break;
    			}
    		}
    	}
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h2>쿠키 읽기</h2>
    	<%
    		if(cUsername != null) {
    			out.println("<p> 안녕하세요 " + cUsername + " 님 </p>");
    		} else {
    			out.println("<p> 쿠키가 설정되지 않았습니다. </p>");
    		}
    	%>
    	<a href="setCookie.jsp"> 쿠키 설정하러 가기</a>
    </body>
    </html>

    2. 세션 개념과 사용법

    세션(Session) : 서버에 저장되는 사용자별 데이터. 각 사용자는 고유한 세션 ID를 가지며, 세션 ID를 통해 서버는 사용자를 식별할 수 있다. 세션은 주로 로그인 정보, 사용자 설정, 애플리케이션 상태 등을 저장하는 데 사용된다.

    세션의 특징

    • 서버에 저장된다.
    • 클라이언트와 서버 간의 상태를 유지한다.
    • 비교적 큰 데이터 저장 용량을 가진다.
    • 보안이 상대적으로 높다.

    상태 유지란?

    • 세션 ID : 서버는 클라이언트와의 상호작용을 추적하기 위해 세션 ID를 사용한다. 클라이언트는 서버로부터 세션 ID를 쿠키로 전달받으며, 이후 모든 요청에 이 세션 ID를 포함하여 서버에 전송한다. 서버는 이 세션 ID를 통해 클라이언트의 상태를 유지한다.
    • 추상적인 개념 : 클라이언트와 서버 간의 상태 유지는 물리적인 연결을 의미하는 것이 아니라, 클라이언트의 상태 정보를 세션 ID를 통해 추적하고 관리하는 추상적인 개념이다.
    도전과제
    세션과 관련된 메소드들을 확인 및 활용하고 세션을 무효화 시키는 기능을 만들어 보세요
    메소드 이름 리턴 타입 설명
    getAttribute(String name) java.lang.Object 세션 속성명이 name인 속성의 값을 Object 타입으로 리턴한다. 해당 되는 속성명이 없을 경우에는 null 값을 리턴한다.
    getAttributeNames() java.util.Enumeration 세션 속성의 이름들을 Enumeration 객체 타입으로 리턴한다.
    getCreationTime() long 1970년 1월 1일 0시 0초를 기준으로 하여 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000초 값으로 리턴한다.
    getId() java.lang.String 세션에 할당된 고유 식별자를 String 타입으로 리턴한다.
    getMaxInactiveInterval() int 현재 생성된 세션을 유지하기 위해 설정된 세션 유지시간을 int형으로 리턴한다.
    invalidate() void 현재 생성된 세션을 무효화 시킨다.
    removeAttribute(String.name) void 세션 속성명이 name인 속성을 제거한다.
    setAttribute(String name, Object value) void 세션 속성명이 name인 속성에 속성값으로 value를 할당한다.
    setMaxInactiveInterval(int interval) void 세션을 유지하기 위한 세션 유지시간을 초 단위로 설정한다.
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>세션을 읽어 보는 페이지</title>
    </head>
    <body>
    	<h2>세션 읽기</h2>
    	<%
    	// 삼항연산자
    	// if else
    	// try catch 사용 가능
    	String username = (String) session.getAttribute("username");
    	Integer age = (Integer) session.getAttribute("age");
    
    	if (username != null) {
    		out.println("<p>안녕 " + username + "</p>");
    		out.println("<p>나이는 " + age + "이네요! </p>");
    		%><br><a href="delSession.jsp">세션 제거 하기</a> <%
    	} else {
    		out.println("세션 설정이 되지 않았습니다.");
    		%><br><a href="setSession.jsp">세션 설정 하러 가기</a> <%
    	}
    	%>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%
    	String username = "홍길동";
    	int age = 21;
    	
    	session.setAttribute("username", username);
    	session.setAttribute("age", age);
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>세션 설정 페이지</title>
    </head>
    <body>
    	<h2>세션 설정이 완료 되었습니다.</h2>
        <a href="getSession.jsp">세션 읽어 보기</a>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%
    	session.invalidate();
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h2>세션 제거 완료</h2>
    	<a href="setSession.jsp">세션 설정 하러 가기</a>
    </body>
    </html>

    3. 구구단 만들어보기

    <%@ 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 mHidden = "홍길동";
    	%>
    	<h2>출력하고 싶은 단을 선택하세요</h2>
    	<form action="gogodan.jsp" method="get">
    		<input type="hidden" name="mHidden" value="<%= mHidden%>">
    		<select name="num" id="num" style="width: 40px;">
    			<%	for (int i = 1; i <= 9; i++) {	%>
    			<option value="<%=i%>"><%=i%></option>
    			<%	}	%>
    		</select>
            <button type="submit">선택</button>
    	</form>
    </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>구구단 결과</h1>
    	<%
    	int num = 0;
    	String sessionId = session.getId();
    	out.print("sessionId : " + sessionId);
    	try {
    		num = Integer.parseInt(request.getParameter("num"));
    	%>
    	<h2><%=num%> 단</h2>
        <table border="1">
            <thead>
                <tr>
                    <th>계산식</th>
                    <th>결과</th>
                </tr>
            </thead>
            <tbody>
                <%for (int i = 1; i <= 9; i++) { %>
                    <tr>
                        <td><%= num %> x <%= i %> </td>
                        <td><%= num * i %> </td>
                    </tr>
                <%	}	%>
            </tbody>
            <tfoot></tfoot>
        </table border="1">
    	<%
    	} catch (Exception e) {
    	out.println("<p> 잘못된 접근 입니다.");
    	%><br>
    	<a href="form.jsp">구구단 선택 폼으로 돌아가기</a>
    	<%	}	%>
    
    	
    </body>
    </html>

    JSP 목차로 돌아가기

     

    'Java > JSP' 카테고리의 다른 글

    간단한 게시판 만들어 보기  (0) 2024.07.08
    서블릿과 JSP의 개념과 차이점  (0) 2024.07.05
    폼 처리와 요청 방식  (0) 2024.07.04
    JSP 내장 객체란 뭘까?  (0) 2024.07.04
    JSP 지시자(Directive) 간단 정리  (0) 2024.07.04