# JSP / Servlet
세션과 쿠키, 그리고 Scope
쿠키에 저장
③ 이후 요청마다 쿠키에 담긴
→ 새 세션 생성 후 발급
있으면 → 기존 유저로 판단
서버 메모리에 세션 정보를 저장,
세션과 쿠키, 그리고 Scope
— 웹이 나를 기억하는 방법
HTTP 무상태 프로토콜의 한계를 극복하는 방법
📌 이 글에서 다루는 내용
① HTTP가 stateless임에도 로그인이 유지되는 원리 (JSESSIONID)
② JSP/Servlet의 3가지 Scope (request / session / application)
③ setAttribute, EL 문법 실전 코드
① HTTP가 stateless임에도 로그인이 유지되는 원리 (JSESSIONID)
② JSP/Servlet의 3가지 Scope (request / session / application)
③ setAttribute, EL 문법 실전 코드
웹은 기본적으로 나를 기억하지 못한다
HTTP는 stateless(무상태) 프로토콜이다.
요청을 하고 응답을 받으면 그것으로 끝 — 서버는 이전에 누가 왔었는지 기억하지 않는다.
그렇다면 로그인 후 페이지를 이동해도 "나"로 인식되는 건 어떻게 가능한 걸까?
바로 쿠키(Cookie)와 세션(Session)의 조합 덕분이다.
JSESSIONID — 서버가 나를 식별하는 열쇠
🖥 View (브라우저)
① 최초 응답 시 수신한 JSESSIONID를쿠키에 저장
③ 이후 요청마다 쿠키에 담긴
JSESSIONID를 함께 전송
① 최초 response에
JSESSIONID 포함
JSESSIONID 포함
←
→
③ 이후 request마다
cookie 전송
cookie 전송
⚙️ WAS (서버)
② 쿠키에 JSESSIONID가 없으면→ 새 세션 생성 후 발급
있으면 → 기존 유저로 판단
서버 메모리에 세션 정보를 저장,
JSESSIONID로 조회 가능
핵심은 서버가 세션을 메모리에 저장하고,
브라우저는 그 세션에 접근할 수 있는 키(JSESSIONID)만 쿠키로 보관한다는 점이다.
덕분에 페이지를 이동해도 서버는 "이 키를 가진 사람이구나"하고 나를 기억할 수 있다.
Scope — 데이터를 얼마나 넓게 공유할 것인가
JSP/Servlet은 데이터를 저장하고 공유하기 위한 세 가지 Scope 영역을 제공한다.
Scope가 클수록 더 많은 요청, 더 많은 사용자가 데이터를 공유한다.
request
가장 좁음
<
session
사용자 단위
<
application
가장 넓음
| Scope | 객체 | 생존 범위 | 활용 예 |
|---|---|---|---|
| request | HttpServletRequest |
요청 1건이 끝나면 소멸 | 폼 데이터, 컨트롤러→뷰 전달값 |
| session | HttpSession |
세션 만료 전까지 유지 | 로그인 사용자 정보 |
| application | ServletContext |
서버 실행 중 계속 유지 | 공지사항, 방문자 수 등 전역 데이터 |
데이터 저장 — setAttribute / getAttribute
세 Scope 모두 동일한 방식으로 데이터를 읽고 쓴다.
// ① request scope — 요청 1건 동안만 유지
request.setAttribute("board", boardObj);
request.getAttribute("board");
// ② session scope — 세션이 살아있는 동안 유지
session.setAttribute("loginUser", user);
session.getAttribute("loginUser");
// ③ application scope — 서버가 켜져 있는 동안 유지
application.setAttribute("visitCount", count);
application.getAttribute("visitCount");
JSP EL(Expression Language)로 접근하기
JSP에서는 Scope 이름을 prefix로 붙여 EL로 바로 접근할 수 있다.
<!-- request.setAttribute("board", ...) 와 동일 -->
${requestScope.board}
<!-- session.setAttribute("loginUser", ...) 와 동일 -->
${sessionScope.loginUser}
<!-- application.setAttribute("visitCount", ...) 와 동일 -->
${applicationScope.visitCount}
<!-- Scope prefix 생략 시: request → session → application 순으로 자동 탐색 -->
${board}
💡 Scope 선택 원칙
데이터는 필요한 만큼만 작은 Scope에 담아라.
불필요하게 큰 Scope를 사용하면 메모리 낭비와 데이터 충돌의 위험이 생긴다.
데이터는 필요한 만큼만 작은 Scope에 담아라.
불필요하게 큰 Scope를 사용하면 메모리 낭비와 데이터 충돌의 위험이 생긴다.
정리
- HTTP는 stateless라 기본적으로 요청 간 상태를 기억하지 못한다.
- 서버는 세션을 메모리에 저장하고, 브라우저는 JSESSIONID 쿠키로 세션을 식별한다.
- JSP/Servlet은 request < session < application 세 가지 Scope를 제공한다.
- 모두
setAttribute / getAttribute로 읽고 쓰며, JSP에서는 EL(${requestScope.xxx})로 접근한다. - 적절한 Scope 선택이 좋은 웹 애플리케이션 설계의 기초다.
'Dev > SpringBoot' 카테고리의 다른 글
| [SpringSecurity] 실습#2 (0) | 2026.05.27 |
|---|---|
| [SpringSecurity] 실습#1 (0) | 2026.05.27 |