[Spring] Session & Cookie

배창민·2025년 10월 2일
post-thumbnail

Session & Cookie

목표: HTTP의 무상태(stateless) 한계를 보완하는 Cookie(클라이언트 저장) · Session(서버 저장) 를 빠르게 정리


0) 왜 필요한가? — HTTP의 특성

  • 무연결/무상태: 요청-응답 후 연결 종료, 상태(로그인/장바구니 등) 유지 불가
    클라이언트에 저장(Cookie) 또는 서버에 저장(Session) 으로 상태 유지

1-1) 개념 & 특징

  • 브라우저(클라이언트) 측에 텍스트로 저장하여 다음 요청 때 자동 전송
  • Map처럼 name=value 쌍 저장, 개수/크기 제한 존재
  • 장점: 간단, 서버 부하 적음 / 단점: 노출 위험, 위변조 가능

1-2) 주요 속성

  • name=value : ASCII, 이름은 불변
  • Max-Age : 유효시간(초). 미설정 시 세션 쿠키(브라우저 종료 시 삭제)
  • Path : 전송될 유효 경로
  • Domain : 전송될 유효 도메인
  • Secure : HTTPS에서만 전송
  • HttpOnly : JS 접근 차단(XSS 완화) → cookie.setHttpOnly(true)

1-3) 설정 & 전송 (서블릿)

// 생성
Cookie cookie = new Cookie("rememberId", "hong");
// 옵션
cookie.setMaxAge(60 * 60 * 24 * 7); // 7일
cookie.setPath("/");                 // 전체 경로
cookie.setSecure(true);              // HTTPS만
cookie.setHttpOnly(true);            // JS 접근 금지
// 응답 헤더에 추가
response.addCookie(cookie);

1-4) 읽기

Cookie[] cookies = request.getCookies();
if (cookies != null) {
  for (Cookie c : cookies) {
    if ("rememberId".equals(c.getName())) {
      String value = c.getValue();
      // ... 사용
    }
  }
}

TIP: 민감 정보(토큰/개인정보)는 쿠키에 직접 저장하지 말고, 저장 시 Secure + HttpOnly 최소 적용.


2) Session

2-1) 개념 & 특징

  • 서버가 사용자별 세션 저장소를 유지하고, 클라이언트는 세션 ID로 식별
  • 장점: 보안 우수, 대용량 데이터/객체 저장 가능
  • 단점: 서버 메모리 사용, 스케일아웃 시 세션 공유 전략 필요(레디스 등)

2-2) 범위(Scope) 감각

Scope공유 범위
Page한 페이지(서블릿) 내부
Requestforward 체인 동안
Session같은 브라우저 세션 동안(로그인 정보 등)
Application애플리케이션 전역(모든 사용자)

2-3) 생성 & 사용

// 생성/획득 (기본 true: 없으면 생성)
HttpSession session = request.getSession();

// 저장/조회/삭제
session.setAttribute("loginUser", userDto);
UserDto loginUser = (UserDto) session.getAttribute("loginUser");
session.removeAttribute("loginUser");

// 전체 무효화(로그아웃/계정 전환 등)
session.invalidate();

2-4) 만료(Timeout) 우선순위

  1. 코드: session.setMaxInactiveInterval(60 * 10); // 10분

  2. 앱 web.xml

    <session-config>
      <session-timeout>60</session-timeout> <!-- 분 -->
    </session-config>
  3. 톰캣 conf/web.xml (전역 기본값)

실무 팁: 로그인 성공 시 기존 세션 무효화 후 재발급(세션 고정화 방지).


구분CookieSession
저장 위치클라이언트서버
보안낮음(노출 위험)높음
용량작음(브라우저 제한)상대적으로 자유
유지만료/삭제 전까지타임아웃 또는 invalidate()
사용 예자동 로그인 체크, 최근 본 항목로그인 상태, 권한, 장바구니 객체

4) API 치트시트

  • 생성: new Cookie(name, value)
  • 옵션: setMaxAge(int), setPath(String), setDomain(String), setSecure(boolean), setHttpOnly(boolean)
  • 전송: response.addCookie(cookie)
  • 조회: request.getCookies()

4-2) Session (javax.servlet.http.HttpSession)

메서드설명
getId()세션 ID
getCreationTime() / getLastAccessedTime()생성/최근 접근 시간(ms)
setMaxInactiveInterval(int) / getMaxInactiveInterval()비활성 만료(초)
setAttribute/getAttribute/removeAttribute데이터 저장/조회/삭제
isNew()신규 세션 여부
invalidate()세션 무효화

5) 체크 사항

  • 쿠키에 민감정보 저장 금지(불가피 시 Secure + HttpOnly + 최소 보관)
  • 로그인 시 세션 재발급(fixation 방지), 로그아웃 시 invalidate()
  • 세션 타임아웃 정책 정의(활동량, 보안등급에 따라 차등)
  • CSRF 대비: SameSite(서블릿 기본 미지원 → 헤더 직접 설정) 또는 CSRF 토큰 사용
  • HTTPS 강제(쿠키 Secure, HSTS)
  • 상태는 서버(Session), 힌트는 클라이언트(Cookie).
  • 보안이 관건일 땐 세션, 가벼운 편의성은 쿠키.
  • 기본은 HttpOnly·Secure·Timeout·Invalidate 네 가지 루틴
profile
개발자 희망자

0개의 댓글