웹 애플리케이션 서버에서 세션이 동작하는 원리 실습
이 실습은 5장의 web-application-server 프로젝트를 기반으로 이어서 진행한다.
지금까지 이론적으로 살펴본 쿠키와 세션의 관계를, 이번에는 직접 코드로 구현해본다.
이번 실습의 목표는 다음과 같다.
- 세션에서 사용할 고유한 아이디(Session ID) 를 생성한다
- 이 세션 아이디를 쿠키를 통해 클라이언트에 전달한다
- 이후 요청에서는 이 아이디로 같은 클라이언트를 식별한다
즉, 세션이 실제로 어떻게 시작되는지를 바닥부터 구현해보는 단계다.
세션을 위한 “고유한 아이디”가 왜 필요한가
세션의 핵심은
서버에 상태를 저장하고, 그 상태를 구분할 수 있는 키를 클라이언트가 매 요청마다 보내준다.
이때 필요한 것이 바로 세션 아이디(Session ID) 다.
- 같은 클라이언트의 요청인지 구분해야 하고
- 충돌 없이 유일해야 하며
- 예측하기 어려워야 한다
그래서 UUID 같은 랜덤한 고유 값을 사용하겠다.
UUID(Universally Unique Identifier)는
전 세계적으로 유일할 확률이 매우 높은 식별자를 생성하기 위한 표준 형식이다.
JDK에서는 UUID 클래스를 통해 간단히 생성할 수 있다.
UUID가 어떻게 생기는지 확인해보기
UUID의 형태를 직접 확인하기 위해 간단한 테스트 클래스를 만든다.
public class UUIDTest {
@Test
public void uuid() {
System.out.println(UUID.randomUUID());
}
}
테스트를 실행하면 다음과 같은 값이 출력된다.
`adcc5d66-7293-465a-867e-dd6e5a0621b0`
이 값의 특징은 다음과 같다.
- 충분히 길고
- 랜덤하며
- 사람이 의미를 해석할 필요가 없고
- 중복될 가능성이 극히 낮다
즉, 세션 아이디로 쓰기에 매우 적합한 값이다.
쿠키를 활용해 세션 아이디 전달하기
이제 본격적으로 세션 아이디를 쿠키로 전달하는 로직을 구현한다.
기본 전략
- 클라이언트가 처음 요청을 보낸다
- 요청에 세션 아이디 쿠키가 없다면
- 서버가 새로운 세션 아이디를 생성한다
- `Set-Cookie` 헤더로 클라이언트에 전달한다
- 이후 요청부터는
- 브라우저가 이 쿠키를 자동으로 `Cookie` 헤더에 담아 보낸다
- 서버는 이 값을 이용해 같은 클라이언트를 식별한다
RequestHandler에서 세션 아이디 검사 로직
`RequestHandler` 클래스에서
요청 헤더에 쿠키가 있는지 먼저 확인한다.
if (getSessionId(request.getHeader("Cookie")) == null) {
response.addHeader("Set-Cookie", "JSESSIONID=" + UUID.randomUUID());
}
- 요청 헤더의 Cookie 값을 가져온다
- 그 안에 JSESSIONID가 있는지 확인한다
- 없다면:
- 새로운 UUID를 생성한다
- Set-Cookie 헤더로 JSESSIONID를 내려준다
즉,
“이 클라이언트는 처음 온 사용자다”
→ “새로운 세션 아이디를 발급한다”
라는 의미다.
쿠키에서 세션 아이디 꺼내기
쿠키 문자열은 다음과 같은 형태로 들어온다.
JSESSIONID=abc123; theme=dark; lang=ko
이를 그대로 쓰기 어렵기 때문에 파싱이 필요하다.
private String getSessionId(String cookieValue) {
Map<String, String> cookies = HttpRequestUtils.parseCookies(cookieValue);
return cookies.get("JESSIONID");
}
흐름 설명
- `Cookie` 헤더 문자열을 파싱해서
- `Map<String, String>` 형태로 변환한다
- 그중 `JSESSIONID` 값을 꺼낸다
이 값이 존재한다면,
- 이미 세션 아이디를 가진 클라이언트다
존재하지 않는다면,
- 아직 세션이 없는 첫 요청이다
정리
전체 흐름은 다음과 같다.
- 클라이언트가 서버에 요청
- 서버가 Cookie 헤더 확인
- JSESSIONID 없음
- UUID 생성
- Set-Cookie: JSESSIONID=... 응답
- 브라우저가 쿠키 저장
- 이후 모든 요청에
- Cookie: JSESSIONID=... 자동 포함
- 서버는 이 값으로 클라이언트 식별
이것이 바로 세션이 시작되는 순간이다.
출처 : 《자바 웹 프로그래밍 Next Step》, 박재성, 로드북
'Book > 자바 웹 프로그래밍 Next Step' 카테고리의 다른 글
| 6장_ : JSP 중심 구조에서 MVC 패턴으로의 변화 (0) | 2026.02.08 |
|---|---|
| 6장_ : 쿠키와 세션 (0) | 2026.02.07 |
| 6장_ 요구사항4 : 회원 목록 및 개인정보 수정 보안 강화 (0) | 2026.02.07 |
| 6장_ 요구사항3 : 세션 기반 로그인/로그아웃 상태 만들기 (0) | 2026.02.07 |
| 6장_ 요구사항1: 개인정보 수정 (0) | 2026.02.06 |