본문 바로가기
자바 풀스택 공부

Day 49. [JSP/Servlet] 쿠키 & 세션

by seung_nari 2022. 3. 16.

쿠키

쿠키란 웹 페이지들 사이의 공유 정보를 클라이언트 PC에 저장해놓고 필요할 때 여러 웹 페이지들이 공유해서 사용할 수 있도록 매개 역할을 하는 방법

 

-- 정보가 클라이언트 PC에 저장됩니다.

-- 저장 정보 용량에 제한이 있습니다(파일 용량은 4kb)

-- 보안이 취약합니다.

-- 클라이언트 브라우저에서 사용 유무를 설정할 수 있습니다.

-- 도메인당 쿠키가 만들어집니다(웹 사이트당 하나의 쿠키가 만들어집니다).

 

쿠키는 보안에 취약하기 때문에 주로 보안과 무관한 경우에 한해 사용합니다.

예) 웹 페이지를 방문했을 때 팝업창에 '오늘은 더 이상 보지 않기' 체크에 사용.

 

서버가 클라이언트한테 주는 정보조각 > 쿠키

 

 

콘텐츠에 들어가는 빨간색이 쿠키 아이디!

 

 

 

세션

쿠키와 같은 웹 페이지들 사이의 공유 정보를 서버에 저장해 두고 웹 페이지들을 매개해 주는 방법

하지만, 쿠키는 클라이언트 PC에 저장되어 보안에 약하다.

반면, 세션은 서버의 메모리에 생성되어 정보를 저장하기에 보안 굿.

 

세션은 각 브라우저당 한개, 즉 사용자당 한 개가 생성된다.

 

-- 정보가 서버의 메모리에 저장

-- 브라우저의 세션 연동은 세션 쿠키를 이용

-- 쿠키보다 보안에 유리

-- 서버에 부하를 줄 수 있음

-- 브라우저당 한 개의 세션이 생성

-- 세션은 유효 시간을 가집니다(기본 유효 시간은 30분)

-- 로그인 상태 유지 기능이나 쇼핑몰의 장바구니 담기 기능 등에 주로 사용

 

자바 스크립트는 쿠키만 확인 가능하다. (세션은 x)


회원가입

+ 로그인 상태

+ 로그아웃

 

member.controller

> Login.java

> Logout.java

 

package member.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import member.service.MemberService;
import member.service.MemberServiceImpl;
import member.vo.MemberVo;

@WebServlet("/member/login")
public class Login extends HttpServlet{
	private MemberService memberService = MemberServiceImpl.getInstatnce();

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 화면 (회원등록)
//		req.getRequestDispatcher("/WEB-INF/jsp/member/login.jsp").forward(req, resp);
		RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/jsp/member/login.jsp");
		rd.forward(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 로직 (회원등록)
		req.setCharacterEncoding("utf-8");
		
		String id = req.getParameter("id");
		String pwd = req.getParameter("pwd");
		
		System.out.println(id);
		System.out.println(pwd);
		
		MemberVo memberVo = memberService.login(id, pwd);
		if(memberVo != null) { // 로그인 성공
			HttpSession session = req.getSession();
			req.getSession().setMaxInactiveInterval(600);
			session.setAttribute("member", memberVo);
		} else { // 로그인 실패
			
		}
		
		resp.sendRedirect("list"); // list.jsp으로 이동
	}
}
package member.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/member/logout")
public class Logout extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.getSession().invalidate();
		resp.sendRedirect("list");
	}

}

 

member.dao

> MemberDao.java

 

memberDao

	public MemberVo login(String id, String pwd) {
		MemberVo memberVo = null;
		try {
			conn = DBConn.getConnection();
			String query = "SELECT * FROM T_MEMBER WHERE ID = ? AND PWD = ?";
			
			pstmt = conn.prepareStatement(query); // 전처리 시킴
			pstmt.setString(1, id);
			pstmt.setString(2, pwd);			
			
			ResultSet rs = pstmt.executeQuery();
			
			while(rs.next()) {
				int idx = 1;
				memberVo = new MemberVo(
						rs.getString(idx++),
						rs.getString(idx++),
						rs.getString(idx++),
						rs.getString(idx++),
						rs.getDate(idx++)
						);
			}
			rs.close();
			pstmt.close();
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return memberVo;
	}

 

WEB-INF

> jsp

  > member

    > list.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>${pageContext.session.id}</h2>
	<h2>${pageContext.session.maxInactiveInterval}</h2>
	<div>
		<c:if test="${empty member}">
		<p>로그인 하지 않은 상태</p>
		<a href="login">로그인 하러 가기</a>
		</c:if>
		<c:if test="${not empty member}">
		<p>로그인 한 상태</p>
		<p>${member.name} 님 환영합니다.</p>
		<a href="logout">로그아웃</a>
		</c:if>
	</div>
    <table>
        <tr>
            <th>아이디</th>
            <th>비밀번호</th>
            <th>이름</th>
            <th>이메일</th>
            <th>가입일</th>
        </tr>
        <c:forEach items="${sessionScope.members}" var="member">
        <tr>
            <td>${member.id}</td>
            <td>${member.pwd}</td>
            <td>${member.name}</td>
            <td>${member.email}</td>
            <td>${member.joinDate}</td>
            <td><a href="remove?id=${member.id}">삭제</a></td>
        </tr>
        </c:forEach>
    </table>
    <a href="register">회원등록</a>
</body>
</html>

 

댓글