HttpSession 과 Cookie 인터페이스 정리

2025. 3. 5. 04:32·개발/servlet

1. 세션 (Session)

  • 개념: 사용자가 웹 사이트에 접속해서 머무르는 동안 (일정 시간 동안) 서버에 유지되는 사용자별 정보.
    • 특징:
      • 서버에 저장: 사용자 정보는 서버에 저장됨.
      • 고유 ID: 각 사용자에게 고유한 세션 ID가 부여됨. (주로 쿠키를 통해 전달)
      • 보안: 서버에 정보가 저장되므로 쿠키보다 상대적으로 안전.
      • 만료: 브라우저 종료, 지정된 시간 동안 활동 없음, 서버에서 명시적으로 세션 종료 시 만료됨.
    • 용도:
      • 로그인 정보 유지 (사용자 인증)
      • 장바구니 기능
      • 사용자별 맞춤 설정 (테마, 언어 등)
      • 최근 본 상품 목록

2. 쿠키 (Cookie)

  • 개념: 웹 사이트가 사용자의 브라우저에 저장하는 작은 텍스트 파일.
    • 특징:
      • 클라이언트에 저장: 사용자 정보는 브라우저에 저장됨.
      • 텍스트 형태: 이름-값 쌍으로 구성된 텍스트 데이터.
      • 만료 기간: 쿠키마다 만료 기간을 설정할 수 있다. (브라우저 종료 시, 특정 시간 후, 영구적)
      • 보안: 클라이언트에 저장되므로, 탈취나 변조 위험이 있다. (HTTPS, HttpOnly 설정 등으로 보안 강화)
      • 용량 제한: 브라우저마다 쿠키 개수와 크기에 제한이 있다.
    • 용도:
      • 자동 로그인
      • 팝업 "오늘 하루 보지 않기"
      • 장바구니 (세션 없이도 구현 가능)
      • 사용자 선호 설정 (테마, 언어 등)
      • 광고 타겟팅 (사용자 행동 추적)

핵심 비교

특징세션 (Session)쿠키 (Cookie)
저장 위치 서버 클라이언트 (브라우저)
정보 형태 객체 (Object) 텍스트 (String)
보안 상대적으로 안전 취약 (HTTPS, HttpOnly 등으로 보완)
용량 서버 메모리 허용 범위 내 브라우저별 제한 (개수, 크기)
만료 브라우저 종료, 설정된 시간, 명시적 종료 브라우저 종료(세션 쿠키), 설정된 시간, 명시적 삭제
 

3. HttpSession 인터페이스

HttpSession은 서버 측에 클라이언트별로 정보를 저장하는 기술. 각 클라이언트는 고유한 세션 ID를 가지며, 서버는 이 ID를 사용하여 클라이언트를 식별하고 해당 클라이언트의 세션 데이터를 관리.

  • 세션 생성 및 획득:
    • HttpServletRequest.getSession():
      • 현재 요청과 연결된 세션이 있으면 해당 세션을 반환.
      • 세션이 없으면 새로운 세션을 생성하여 반환.
    • HttpServletRequest.getSession(boolean create):
      • create가 true이면, 세션이 없으면 새 세션을 생성하고, 있으면 기존 세션을 반환.
      • create가 false이면, 세션이 없으면 null을 반환하고, 있으면 기존 세션을 반환.
  • 세션 ID:
    • HttpSession.getId(): String - 세션의 고유 ID를 반환. (서버가 자동으로 생성)
  • 세션 속성 (Attributes):
    • HttpSession.setAttribute(String name, Object value): 세션에 속성을 추가. (이름-값 쌍)
    • HttpSession.getAttribute(String name): Object - 지정된 이름의 속성 값을 반환. (없으면 null)
    • HttpSession.getAttributeNames(): Enumeration - 세션에 저장된 모든 속성 이름들을 반환.
    • HttpSession.removeAttribute(String name): 지정된 이름의 속성을 제거.
  • 세션 유효 시간 (Timeout):
    • setMaxInactiveInterval(int interval): 세션의 최대 비활성 시간(초 단위)을 설정. 이 시간 동안 클라이언트의 요청이 없으면 세션이 만료.
    • getMaxInactiveInterval(): int - 세션의 최대 비활성 시간(초)을 반환.
    • 기본값은 서버 설정에 따름. (일반적으로 30분)
    • 0 또는 음수 값을 설정하면 세션이 만료되지 않는다. (주의해서 사용)
  • 세션 무효화:
    • HttpSession.invalidate(): 세션을 무효화. 세션에 저장된 모든 데이터가 삭제되고, 해당 세션 ID는 더 이상 유효하지 않는다. (로그아웃 처리 시 사용)
  • 기타
    • isNew(): boolean, 해당 세션이 새롭게 만들어진 세션인가를 반환
    • getCreationTime(): long - 세션 생성 시간을 long 타입(timestamp)으로 반환.
    • getLastAccessedTime(): long - 마지막으로 세션에 접근한 시간을 long 타입(timestamp)으로 반환.

HttpSession 사용 예시 (로그인 정보 저장):

Java
 
// 로그인 처리 서블릿
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // ... (아이디, 비밀번호 확인) ...

    if (loginSuccess) {
        HttpSession session = request.getSession(); // 세션 생성 또는 획득
        session.setAttribute("userId", userId); // 세션에 사용자 ID 저장
        session.setMaxInactiveInterval(60 * 30); // 30분 동안 세션 유지 (선택 사항)

        response.sendRedirect("main.jsp"); // 메인 페이지로 이동
    } else {
        // ... (로그인 실패 처리) ...
    }
}
Java
 
<%-- main.jsp --%>
<%
    String userId = (String) session.getAttribute("userId"); // 세션에서 사용자 ID 가져오기
    if (userId != null) {
%>
        <p>Welcome, <%= userId %>!</p>
        <a href="logout">Logout</a>
<%
    } else {
%>
        <p>Please login.</p>
        <a href="login.jsp">Login</a>
<%
    }
%>

2. Cookie 클래스

Cookie는 클라이언트 측(웹 브라우저)에 저장되는 작은 텍스트 정보. 서버는 HttpServletResponse.addCookie() 메서드를 사용하여 클라이언트에 쿠키를 설정하고, 클라이언트는 이후 요청 시 HttpServletRequest.getCookies() 메서드를 통해 쿠키를 서버에 다시 보냄.

  • Cookie 객체 생성:
    • Cookie(String name, String value): 쿠키 이름과 값을 지정하여 Cookie 객체를 생성.
    • 쿠키 이름은 반드시 ASCII문자
  • 주요 Cookie 메서드:
    • getName(): String - 쿠키 이름을 반환.
    • getValue(): String - 쿠키 값을 반환.
    • setValue(String newValue): 쿠키 값을 설정.
    • setMaxAge(int expiry): 쿠키의 만료 시간(초 단위)을 설정.
      • 양수: 지정된 시간(초) 후에 만료
      • 0: 쿠키 즉시 삭제
      • -1 (기본값): 브라우저 종료 시 만료 (세션 쿠키)
    • getMaxAge(): int - 쿠키의 만료 시간(초)을 반환.
    • setPath(String uri): 쿠키가 유효한 경로를 설정. (해당 경로 및 하위 경로에서만 쿠키 전송)
      • / 일경우, 모든 경로에서 사용 가능
    • getPath(): String - 쿠키의 유효 경로를 반환.
    • setDomain(String domain): 쿠키가 유효한 도메인을 설정. (해당 도메인 및 서브 도메인에서만 쿠키 전송)
    • getDomain(): String - 쿠키의 유효 도메인을 반환.
    • setSecure(boolean flag): true로 설정하면 HTTPS 연결에서만 쿠키가 전송됨.
    • getSecure(): boolean - HTTPS 전용 쿠키인지 여부를 반환.
    • setHttpOnly(boolean httpOnly): true로 설정하면 JavaScript에서 쿠키에 접근할 수 없다. (XSS 공격 방지)
    • isHttpOnly() : boolean, HttpOnly 설정 여부 반환

Cookie 사용 예시 (자동 로그인):

Java
 
// 로그인 처리 서블릿
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // ... (아이디, 비밀번호 확인) ...
    
    if (loginSuccess) {
        // 자동 로그인 체크박스가 선택되었으면
        if (request.getParameter("rememberMe") != null) {
          // 쿠키 생성 및 설정
          Cookie idCookie = new Cookie("userId", userId); // 쿠키 이름: userId, 값: 사용자 ID
          idCookie.setMaxAge(60 * 60 * 24 * 7); // 7일 동안 유지
          idCookie.setPath("/");                // 웹 애플리케이션 전체에서 사용 가능
          response.addCookie(idCookie);          // 응답에 쿠키 추가
        }
      HttpSession session = request.getSession();
      session.setAttribute("userId", userId);
    }
}
Java
 
<%-- 로그인 페이지 (login.jsp) --%>
<%
    Cookie[] cookies = request.getCookies(); // 브라우저가 보낸 쿠키 가져오기
    String savedUserId = "";
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("userId")) {
                savedUserId = cookie.getValue();
                break;
            }
        }
    }
%>

<form action="login" method="post">
    ID: <input type="text" name="userId" value="<%= savedUserId %>"><br>
    Password: <input type="password" name="password"><br>
    <input type="checkbox" name="rememberMe"> Remember Me<br>
    <input type="submit" value="Login">
</form>

3. HttpSession vs. Cookie

특징HttpSessionCookie
저장 위치 서버 클라이언트 (웹 브라우저)
저장 데이터 타입 모든 Java 객체 문자열 (String)
보안 상대적으로 안전 (서버에 저장) 취약 (클라이언트에 저장, 탈취 가능성)
용량 제한 서버 메모리 허용 범위 내 브라우저별 제한 (개수, 크기)
사용 예시 로그인 정보, 장바구니, 사용자 설정 등 자동 로그인, 사용자 선호 설정(테마, 언어), 최근 본 상품 등
생명 주기 서버 설정 또는 setMaxInactiveInterval()로 지정한 시간 동안, 혹은 invalidate() 호출 시 setMaxAge()로 지정한 시간 동안, 브라우저 종료 시(세션 쿠키), 또는 명시적으로 삭제할 때까지
특징 서버 부하, 보안 좋음, 데이터 타입 제한 없음 서버 부하 적음, 클라이언트에 정보 저장, 보안 취약(HTTPS, HttpOnly 등으로 보완 필요), 문자열만 저장 가능

 

저작자표시 비영리 변경금지 (새창열림)

'개발 > servlet' 카테고리의 다른 글

PRG(Post-Redirect-Get) 패턴  (0) 2025.03.05
MVC 패턴  (0) 2025.03.05
ServletConfig 인터페이스 정리  (0) 2025.03.05
ServletContext 인터페이스 정리  (0) 2025.03.05
Servlet RequestDispatcher 정리  (0) 2025.03.05
'개발/servlet' 카테고리의 다른 글
  • PRG(Post-Redirect-Get) 패턴
  • MVC 패턴
  • ServletConfig 인터페이스 정리
  • ServletContext 인터페이스 정리
함수형 인간
함수형 인간
잘 까먹는 개발자의 두뇌 확장 장치
  • 함수형 인간
    개발 기록 노트
    함수형 인간
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 글 목록 (84)
      • 기타 (1)
      • 개발 (82)
        • Java (6)
        • Javascript (1)
        • Spring (20)
        • jQuery (0)
        • Git (0)
        • servlet (11)
        • JSP (6)
        • HTML (0)
        • CSS (10)
        • SQL (9)
        • JSTL (3)
        • Mybatis (4)
        • Design Patterns (0)
        • HTTP (2)
        • Devtools (0)
        • IntelliJ (5)
        • JDBC (1)
        • Lombok (3)
        • Logging (1)
      • 책 리뷰 (0)
  • hELLO· Designed By정상우.v4.10.3
함수형 인간
HttpSession 과 Cookie 인터페이스 정리
상단으로

티스토리툴바