[상태 유지와 공통 처리] 2. 세션이란?

2026. 3. 30. 09:20·Web/Web Basics

 

쿠키는 “열쇠”, 데이터는 “서버에 보관”한다

 

쿠키는 상태 유지를 가능하게 하지만 한계가 있다.

  • 브라우저에 저장되므로 노출/변조 위험이 있다
  • 큰 데이터를 넣기 어렵다(문자열, 크기 제한)
  • 중요한 사용자 상태를 쿠키에 담는 건 위험하다

그래서 보통

쿠키에는 “식별자”만 넣고
실제 사용자 상태/데이터는 서버에 저장한다

 

이 방식이 세션(session)이다.

 

 

세션의 핵심 구조: 세션ID로 서버 저장소를 찾는다

세션은 결국 이런 구조이다.

  • 서버는 사용자별 “저장 공간”을 가진다(세션 저장소)
  • 각 공간은 세션ID로 구분된다
  • 브라우저는 세션ID를 쿠키로 들고 다닌다
  • 요청이 오면 서버는 세션ID로 세션 공간을 찾아준다

즉 세션은 “브라우저 저장(쿠키)”과 “서버 저장(세션 저장소)”을 조합한 구조이다.

 

 

톰캣에서 세션이 자동으로 만들어지는 흐름

톰캣 같은 서블릿 컨테이너는 세션을 지원한다.

컨트롤러에서 아래를 호출하면,

  • request.getSession()

톰캣은 다음을 수행한다.

  • 요청에 세션ID 쿠키가 있는지 확인한다
  • 없으면 새 세션을 만들고 세션ID를 발급한다
  • 응답에 Set-Cookie: JSESSIONID=...로 내려준다
  • 다음 요청부터 브라우저는 Cookie: JSESSIONID=...를 자동으로 붙인다

즉 “세션은 쿠키(JSESSIONID) 없이 동작할 수 없다”는 구조이다.
쿠키가 세션을 찾는 열쇠 역할을 한다.

// ================================
// [세션 사용 예시] 로그인 성공 시 세션에 사용자 정보를 저장
// ================================

@WebServlet("/login")
public class LoginController extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {

        String id = req.getParameter("id");
        String pw = req.getParameter("pw");

        // 예시: 인증 성공했다고 가정
        boolean ok = "user1".equals(id) && "1234".equals(pw);

        if (ok) {
            // 세션이 없으면 생성
            HttpSession session = req.getSession();
            session.setAttribute("loginUser", id); // 세션에 로그인 정보 저장

            resp.sendRedirect(req.getContextPath() + "/home");
        } else {
            resp.sendRedirect(req.getContextPath() + "/login-form");
        }
    }
}

 

 

세션 저장소는 서버에 있다

세션의 데이터는 브라우저에 저장되지 않는다.
서버(톰캣) 메모리의 세션 저장소에 저장된다.

그래서 세션은 다음 장점이 있다.

  • 중요한 데이터를 브라우저에 노출하지 않는다
  • 객체를 그대로 저장할 수 있다(문자열만이 아님)
  • 로그인 상태 유지에 적합하다

대신 단점도 있다.

  • 서버 메모리를 사용한다
  • 사용자가 많으면 세션이 쌓인다
  • 그래서 만료/정리가 필요하다

 

 

세션은 언제까지 유지되는가: timeout

세션은 영원히 유지되지 않는다.
컨테이너는 일정 시간 동안 요청이 없으면 세션을 만료시킨다.

즉 “오래 안 쓰는 세션은 정리해서 메모리를 비운다”가 기본 전략이다.

톰캣은 기본적으로 세션 타임아웃을 가지고 있고
주기적으로 오래된 세션을 청소한다.

 

 

세션으로 로그인 상태를 유지하는 전형적인 패턴

세션을 이용한 로그인 체크는 보통 이렇게 한다.

1) 로그인 성공 시

  • request.getSession()으로 세션을 얻고(없으면 생성)
  • session.setAttribute("loginUser", user)로 로그인 정보를 저장한다

2) 보호된 페이지 접근 시

  • request.getSession(false)로 세션을 얻는다(없으면 null)
  • session.getAttribute("loginUser")가 있으면 로그인으로 판단한다
  • 없으면 로그인 페이지로 redirect 한다

이게 세션 기반 로그인 유지의 기본 패턴이다.

 

getSession() vs getSession(false)

여기서 실전에서 중요한 차이가 하나 있다.

  • getSession()
    • 세션이 없으면 새로 만든다
  • getSession(false)
    • 세션이 없으면 null을 반환한다(새로 만들지 않는다)

로그인 체크처럼 “없으면 없는 대로 처리”해야 하는 상황에서는
보통 getSession(false)를 쓰는 게 안전하다.

 

 

핵심 정리

  • 쿠키는 브라우저에 저장되므로 중요한 데이터를 담기 어렵다
  • 세션은 쿠키(세션ID)로 서버 저장소를 찾아오는 구조이다
  • 톰캣은 request.getSession() 호출 시 JSESSIONID를 발급하고 세션을 만든다
  • 로그인 상태 유지는 보통 session.setAttribute로 구현한다
  • getSession(false)는 세션이 없으면 null(불필요한 세션 생성 방지)

'Web > Web Basics' 카테고리의 다른 글

[상태 유지와 공통 처리] 3. SESSIONID이란?  (0) 2026.03.30
[상태 유지와 공통처리] 2-1. req.getSession()과 JSESSIONID, HttpSession  (0) 2026.03.30
[상태 유지와 공통 처리] 1. 쿠키란?  (0) 2026.03.30
[MVC와 웹 흐름 제어] 7. WEB-INF에 JSP를 두는 이유: “JSP 직접 호출”을 구조적으로 막는다  (0) 2026.03.29
[MVC와 웹 흐름 제어] 6.PRG 패턴: POST 후에는 왜 redirect를 하는가  (0) 2026.03.29
'Web/Web Basics' 카테고리의 다른 글
  • [상태 유지와 공통 처리] 3. SESSIONID이란?
  • [상태 유지와 공통처리] 2-1. req.getSession()과 JSESSIONID, HttpSession
  • [상태 유지와 공통 처리] 1. 쿠키란?
  • [MVC와 웹 흐름 제어] 7. WEB-INF에 JSP를 두는 이유: “JSP 직접 호출”을 구조적으로 막는다
sqaxe1
sqaxe1
woojoo-devlog 님의 블로그 입니다.
  • sqaxe1
    Woojoo's Devlog
    sqaxe1
  • 전체
    오늘
    어제
    • 분류 전체보기 (148)
      • Backend (9)
        • Servlet (7)
        • Spring (2)
      • Frontend (1)
      • CS (0)
      • Book (33)
        • 자바 웹 프로그래밍 Next Step (30)
        • 테스트 주도 개발: 고품질 쾌속개발을 위한 TDD.. (1)
        • 성공과 실패를 결정하는 1%의 네트워크 원리 (2)
      • Engineering (0)
        • Testing (0)
      • Infra (6)
        • AWS (6)
      • Java (4)
      • Network (1)
      • 김영한 (28)
        • 자바 입문 (8)
        • 실전 자바 - 기본편 (6)
        • 실전 자바 - 중급편 (10)
        • 실전 자바 - 고급편 (4)
      • Web (39)
        • Web Basics (39)
      • Project (24)
        • NeoSquare (0)
        • Memo Evolution (24)
      • 정보처리기사 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    aws
    java
    개발서적
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sqaxe1
[상태 유지와 공통 처리] 2. 세션이란?
상단으로

티스토리툴바