기본 콘텐츠로 건너뛰기

JSP/Servlet 세션(Session)과 쿠키(Cookie) 완벽 정리 – HttpSession, Cookie 사용법

세션(Session)과 쿠키(Cookie) 완벽 정리 | 차이점, 동작 원리, 사용 예제

세션(Session)과 쿠키(Cookie) 완벽 정리: 정의, 동작 원리, 차이점

웹 애플리케이션을 개발하다 보면 반드시 만나게 되는 개념이 바로 세션(Session)쿠키(Cookie)입니다. HTTP는 기본적으로 상태가 없는(stateless) 프로토콜이기 때문에, 로그인 정보나 장바구니처럼 “사용자 상태”를 유지하려면 별도의 메커니즘이 필요합니다. 이 글에서는 Servlet 기반 환경을 기준으로 HttpSessionCookie를 어떻게 사용하는지, 그리고 두 방식의 차이점과 장단점까지 한 번에 정리합니다.

목차

  1. 세션(Session)의 정의와 특징
  2. HttpSession 주요 메서드 정리
  3. 쿠키(Cookie)의 정의와 동작 방식
  4. 쿠키 생성 및 전송 방법
  5. 세션과 쿠키의 차이점 비교
  6. 자주 묻는 질문(FAQ)

1. 세션(Session)의 정의와 특징

세션(Session)은 웹 서버 쪽의 웹 컨테이너에 사용자 상태 정보를 저장해 두고, 이후 요청에서도 동일한 사용자인지를 식별하기 위해 사용하는 기술입니다. Java Servlet 환경에서는 javax.servlet.http 패키지의 HttpSession 인터페이스를 통해 세션을 사용할 수 있습니다.

세션의 핵심 특징

  • 서버 측 저장 사용자의 상태 정보는 브라우저가 아니라 웹 서버(웹 컨테이너)에 저장됩니다.
  • 고유 ID로 식별 서버는 각 클라이언트에 대해 고유한 세션 ID를 부여하고, 브라우저에서 오는 요청의 세션 ID를 비교하여 같은 사용자임을 구분합니다.
  • 브라우저 단위로 생성 일반적으로 웹 브라우저 1개당 세션 1개가 생성되며, 같은 창/탭에서 열려 있는 페이지들은 동일한 session 객체를 공유합니다.
  • 보안 측면에서 쿠키보다 유리 민감한 정보는 브라우저에 직접 저장하지 않고 서버에 저장하기 때문에 단순 쿠키보다 보안에 유리한 편입니다.

즉, 세션은 서버에 상태를 저장하고, 세션 ID만을 클라이언트와 주고받는 방식으로 상태를 유지합니다.

2. HttpSession 주요 메서드 정리

HttpSession 객체는 로그인 정보, 사용자 권한, 장바구니 데이터 등 여러 상태 값을 저장하고 관리할 수 있게 해 줍니다. 아래는 자주 사용하는 메서드들입니다.

2-1. 세션 속성 접근: getAttribute / setAttribute / removeAttribute

  • Object getAttribute(String name)
    지정한 name에 해당하는 세션 속성값을 반환합니다. 해당 이름이 없으면 null을 반환합니다.
    예)
    String memId = (String) session.getAttribute("memId");
  • void setAttribute(String name, Object value)
    세션에 새로운 속성값을 저장 예)
    session.setAttribute("memId", "testUser");
  • void removeAttribute(String name)
    지정한 이름의 세션 속성을 삭제합니다.
    예)
    session.removeAttribute("memId");

2-2. 세션 생성 시간, ID, 유지 시간

  • long getCreationTime()
    현재 세션이 언제 생성되었는지를 밀리초(1/1000초) 단위로 반환합니다. 기준 시점은 1970-01-01 00:00(UTC)입니다.
  • String getId()
    세션에 할당된 고유 세션 ID를 반환합니다. 이 값으로 브라우저에서 발생한 여러 요청이 같은 세션인지 식별합니다.
  • int getMaxInactiveInterval()
    현재 세션이 유지될 수 있는 최대 비활성 시간(초 단위)을 반환합니다. 이 시간이 지나도록 요청이 없으면 세션은 무효화됩니다.
  • void setMaxInactiveInterval(int interval)
    세션의 최대 유지 시간(초 단위)을 지정합니다.
    예) 30분 유지:
    session.setMaxInactiveInterval(30 * 60);

2-3. 세션 무효화: invalidate()

  • void invalidate()
    현재 생성된 세션을 즉시 무효화합니다. 일반적으로 로그아웃 처리에 사용됩니다.
    예)
    session.invalidate();

쿠키(Cookie)상태를 유지하지 않는 HTTP 프로토콜 위에서 사용자의 상태를 브라우저에 저장해 두는 방법입니다. 작은 텍스트 데이터(보통 4KB 이하)를 브라우저에 저장해 두었다가, 이후 같은 서버로 요청을 보낼 때 해당 쿠키 정보를 함께 전송합니다.

쿠키의 기본 동작 흐름

  1. 서버(서블릿)가 Cookie 객체를 생성하고, 응답 헤더에 추가한다.
  2. 브라우저는 응답을 받으며 쿠키를 로컬에 저장한다.
  3. 이후 같은 도메인/경로로 요청을 보낼 때, 저장된 쿠키를 요청 헤더에 포함해서 전송한다.
  4. 서버는 요청에 포함된 쿠키 값을 읽어 이전 상태를 복원한다.

Java Servlet에서는 javax.servlet.http 패키지의 Cookie 클래스를 사용해 쿠키를 다룹니다. 쿠키는 “이름(name) - 값(value)” 쌍을 기본으로 하고, 유효 기간, 도메인, 경로 등의 속성을 추가로 설정할 수 있습니다.

쿠키의 특징과 보안 이슈

  • 클라이언트(브라우저) 저장 쿠키 값은 브라우저에 저장되므로, 사용자가 직접 삭제하거나 브라우저의 쿠키 거부 설정에 따라 동작이 달라질 수 있습니다.
  • 개인 정보 노출 위험 방문 기록, 로그인 정보 등의 데이터가 브라우저에 남기 때문에 개인 정보 및 사생활 침해 소지가 있습니다. 민감한 값은 가급적 세션이나 토큰 기반 방식으로 관리하는 것이 안전합니다.
  • 쿠키 거부 시 기능 제한 사용자가 브라우저에서 쿠키를 차단해 두면, 로그인 유지, 장바구니 등 쿠키에 의존한 기능은 정상적으로 동작하지 않을 수 있습니다. 이것이 쿠키의 가장 큰 단점 중 하나입니다.

4-1. 쿠키 구성 요소

  • 이름(name) : 쿠키를 식별하기 위한 문자열. 알파벳과 숫자만 사용해야 하며, $로 시작할 수 없고 콤마(,), 세미콜론(;), 공백 등의 문자를 포함할 수 없습니다.
  • 값(value) : 실제로 저장하고 싶은 데이터. 공백, 괄호, 등호(=), 콤마, 콜론(:), 세미콜론(;) 등을 포함하려면 URL 인코딩 처리가 필요합니다.
  • 유효기간(Max-Age) : 쿠키가 유지되는 시간(초 단위).
  • 도메인(Domain), 경로(Path) : 쿠키가 전송될 대상 서버와 경로 범위를 결정합니다.

4-2. 쿠키 생성

Cookie cookie = new Cookie("userId", "testUser");

여기서 "userId"는 쿠키 이름, "testUser"는 쿠키 값입니다.

4-3. 쿠키 추가(응답에 실어 보내기)

// 쿠키 생성
Cookie cookie = new Cookie("userId", "testUser");

// 쿠키 유효기간(초 단위) 설정: 7일
cookie.setMaxAge(7 * 24 * 60 * 60);

// 응답에 쿠키 추가
response.addCookie(cookie);

나중에 쿠키 값을 변경할 때는 setValue()를 사용합니다.

cookie.setValue("newUser");
response.addCookie(cookie);

쿠키는 클라이언트에 저장되므로, 삭제하고 싶을 때는 유효기간을 0으로 설정해 다시 전송합니다.

Cookie cookie = new Cookie("userId", "");
cookie.setMaxAge(0); // 즉시 만료
response.addCookie(cookie);
구분 세션(Session) 쿠키(Cookie)
저장 위치 서버(웹 컨테이너) 클라이언트(웹 브라우저)
식별 방법 세션 ID로 식별 쿠키 이름/값으로 식별
보안 상대적으로 안전 (서버 측 저장) 브라우저에 노출, 탈취 위험 존재
용량 제한 서버 자원에 의존 쿠키 1개당 약 4KB, 브라우저별 개수 제한
유지 기준 비활성 시간(타임아웃) 또는 로그아웃 유효기간(Max-Age/Expires) 또는 브라우저 종료
주 사용 예 로그인 세션, 장바구니, 권한 정보 등 자동 로그인, 최근 본 상품, 개인정보 동의 여부 등

정리하자면, 보안이 중요한 상태 정보는 세션으로 관리하고, 사용성 향상을 위한 간단한 정보(자동 로그인 토큰, 최근 검색어 등)는 쿠키로 관리하는 패턴이 일반적입니다.

6. 자주 묻는 질문(FAQ)

Q1. 세션이 쿠키보다 항상 더 안전한가요?

세션은 서버에 정보를 저장하기 때문에 단순 쿠키보다 안전한 편이지만, 세션 ID 자체가 쿠키나 URL 등에 담겨서 오갈 수 있으므로 세션 탈취(Session Hijacking) 공격에 대비해야 합니다. HTTPS 사용, 세션 타임아웃 설정, 중요 작업 시 재인증 등의 보안 대책이 필요합니다.

Q2. 로그인 기능은 세션으로만 구현해야 하나요?

기본 로그인 상태는 세션으로 관리하는 것이 일반적입니다. 다만, “자동 로그인”이나 “로그인 상태 유지” 기능은 쿠키에 토큰 값을 저장한 뒤, 서버에서 해당 토큰을 검증하는 방식으로 구현하는 경우가 많습니다. 이때 토큰은 반드시 암호화·난수화해서 사용해야 합니다.

Q3. 브라우저를 닫으면 세션과 쿠키는 어떻게 되나요?

세션은 브라우저를 닫거나, 타임아웃 시간이 지나면 보통 무효화됩니다. 쿠키유효기간을 별도로 설정하지 않으면 세션 쿠키로 취급되어 브라우저를 종료할 때 삭제됩니다. 유효기간을 설정하면 브라우저를 꺼도 해당 시간까지 유지되는 영속 쿠키가 됩니다.

이 글을 통해 세션(Session)과 쿠키(Cookie)의 개념, 차이점, 사용 방법을 확실하게 정리해 두면, 이후 로그인/권한 관리/장바구니 같은 기능을 구현할 때 큰 도움이 될 것입니다.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...