[Servlet] Cookie & Session

컨테이너·2025년 11월 18일
0

SpringFramework

목록 보기
8/15
post-thumbnail

01. HTTP의 한계와 상태 유지 문제

HTTP 특징

  1. 무 연결(Connectionless)

    요청 순간만 연결·응답 직후 바로 끊김

  2. 무 상태(Stateless)

    이전 요청 상태를 기억하지 않음

    모든 요청은 독립적

문제점

  • 로그인 유지 불가
  • 장바구니 데이터 유지 안됨
  • 사용자별 상태 저장 불가

이 문제를 해결하는 대표 기술이 Cookie(클라이언트 저장), Session(서버 저장).


02. Cookie

  • 클라이언트(로컬 브라우저)에 저장되는 데이터
  • name=value 형태
  • 브라우저 종료와 상관없이 지정된 기간 동안 유지 가능
  • 보안 취약(클라이언트에 저장되기 때문)
  • 데이터 용량·개수 제한 존재

1) 쿠키 생성

Cookie cookie = new Cookie("firstName", "file01");

2) 속성 설정

cookie.setMaxAge(60 * 60);   // 1시간 유지
cookie.setPath("/");

3) 클라이언트에게 전달

response.addCookie(cookie);

4) redirect로 페이지 이동

response.sendRedirect("/cookie-redirect");

전체 쿠키 조회

Cookie[] cookies = request.getCookies();

원하는 쿠키 찾기

String firstName = null;
String lastName = null;

if (cookies != null) {
    for (Cookie c : cookies) {
        if ("firstName".equals(c.getName())) firstName = c.getValue();
        if ("lastName".equals(c.getName())) lastName = c.getValue();
    }
}

응답 출력

PrintWriter out = response.getWriter();
out.println("Your first name is " + firstName + ", last name is " + lastName);

CookieHandler.java

@WebServlet("/cookie-handler")
public class CookieHandler extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String firstName = request.getParameter("firstName");
        String lastName = request.getParameter("lastName");

        Cookie first = new Cookie("firstName", firstName);
        Cookie last = new Cookie("lastName", lastName);

        first.setMaxAge(60 * 5); // 5분
        last.setMaxAge(60 * 5);

        response.addCookie(first);
        response.addCookie(last);

        response.sendRedirect("/cookie-redirect");
    }
}

CookieRedirect.java

@WebServlet("/cookie-redirect")
public class CookieRedirect extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {

        String firstName = null;
        String lastName = null;

        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("firstName".equals(cookie.getName())) firstName = cookie.getValue();
                if ("lastName".equals(cookie.getName())) lastName = cookie.getValue();
            }
        }

        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("Your first name is " + firstName + ", last name is " + lastName);
        out.close();
    }
}

03. Session

03-01. Session 핵심 요약

  • 서버 메모리에 저장되는 사용자 정보
  • 클라이언트는 Session ID만 가짐
  • 브라우저 종료 시 세션도 종료(기본)
  • 쿠키보다 안전함
  • 로그인 정보, 인증 상태, 장바구니 등 상태 유지에 필수

03-02. Session 생성

세션 가져오기 또는 생성

HttpSession session = request.getSession();        // 없으면 자동 생성
HttpSession session = request.getSession(true);    // 없으면 생성
HttpSession session = request.getSession(false);   // 없으면 null

03-03. Session 데이터 저장/조회

저장

session.setAttribute("firstName", "name01");
session.setMaxInactiveInterval(600); // 10분 유지

조회

String name = (String) session.getAttribute("firstName");

모든 속성 확인

Enumeration<String> names = session.getAttributeNames();
while (names.hasMoreElements()) {
    String key = names.nextElement();
    System.out.println(key + " : " + session.getAttribute(key));
}

03-04. Session 종료

특정 데이터 삭제

session.removeAttribute("firstName");

전체 세션 종료

session.invalidate();

invalidate 이후에는 반드시 새로운 세션을 받아야 함.


03-05. Session 예제 (파일 기반 재구성)

SessionHandler.java

@WebServlet("/session-handler")
public class SessionHandler extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException {

        HttpSession session = request.getSession();

        String firstName = request.getParameter("firstName");
        String lastName = request.getParameter("lastName");

        session.setAttribute("firstName", firstName);
        session.setAttribute("lastName", lastName);

        response.sendRedirect("/session-redirect");
    }
}

SessionRedirect.java

@WebServlet("/session-redirect")
public class SessionRedirect extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {

        HttpSession session = request.getSession();

        String firstName = (String) session.getAttribute("firstName");
        String lastName = (String) session.getAttribute("lastName");

        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("Session data: " + firstName + " " + lastName);
        out.close();
    }
}

DeleteSessionData.java

@WebServlet("/session-delete")
public class DeleteSessionData extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {

        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }

        response.sendRedirect("/session-redirect");
    }
}

04. Cookie vs Session 비교 표

구분CookieSession
저장 위치클라이언트서버
보안낮음높음
용량제한 있음서버 메모리 사용
유지 기간직접 설정기본은 브라우저 종료 시까지
대표 용도팝업 유지, 자동로그인, 간단 데이터로그인, 장바구니, 인증정보
식별 방식name=valueJSESSIONID로 식별

05. 정리

  1. HTTP는 Stateless이기 때문에 로그인 상태를 기억할 수 없다.
  2. Cookie는 클라이언트 PC에 저장된다.
  3. Session은 서버 메모리에 저장된다.
  4. Cookie 데이터는 노출되며 보안에 취약하다.
  5. Session은 JSESSIONID 쿠키로 식별된다.
  6. Session은 request.getSession() 으로 가져온다.
  7. redirect 후에도 Session 데이터는 유지된다.
  8. Cookie는 response.addCookie() 로 클라이언트로 보낸다.
  9. Session은 invalidate() 하면 완전히 삭제된다.
  10. 로그인 유지 = 쿠키 또는 세션 기반 인증이 반드시 필요하다.
profile
백엔드

0개의 댓글