세션(Session)이란?
세션(Session) 은 웹에서 사용자의 상태를 서버에 유지하기 위해 사용되는 기술임.
HTTP는 본래 Stateless(무상태) 프로토콜이기 때문에, 사용자가 요청을 보낼 때마다 서버는 이전 요청과의 연결 관계를 알 수 없음.
따라서 로그인, 장바구니, 사용자 설정 등 사용자별 데이터를 유지하려면 '세션'이라는 개념이 필요함.
1. 세션의 기본 동작 원리
전체 흐름:
- 클라이언트가 서버에 처음 요청을 보냄
- 서버는 고유한 세션 ID를 생성하여 클라이언트에 전달함 (Set-Cookie)
- 클라이언트는 이후 요청마다 해당 세션 ID를 쿠키를 통해 자동으로 전송함
- 서버는 세션 ID를 기반으로 해당 사용자의 상태 정보를 메모리나 저장소에서 조회함
→ 결과적으로 서버가 클라이언트별 상태를 유지할 수 있게 됨
2. 세션 vs 쿠키 비교
항목 | 세션 | 쿠키 |
저장 위치 | 서버 | 클라이언트(브라우저) |
데이터 용량 | 제한 없음 | 4KB 제한 |
보안성 | 상대적으로 높음 (데이터 숨김) | 낮음 (브라우저에서 노출 가능) |
브라우저 의존성 | 낮음 | 높음 |
주 사용 용도 | 인증, 사용자 상태 | 설정 저장, 세션 ID 저장 등 |
→ 실무에서는 쿠키에 세션 ID만 저장하고, 상태 정보는 세션으로 관리하는 구조가 일반적임
3. 세션 ID
- 세션 ID는 고유한 문자열로 구성되어 있음 (JSESSIONID, PHPSESSID 등)
- 보통 서버에서 UUID, 암호화된 난수 형태로 생성함
- 클라이언트는 이 값을 쿠키에 저장하여 매 요청마다 자동 전송함
Set-Cookie: JSESSIONID=abc123xyz; Path=/; HttpOnly
4. 세션의 저장 방식 (Spring 기준)
Spring Boot에서는 기본적으로 서버 메모리에 세션을 저장함.
하지만 실제 서비스에서는 다음과 같은 저장소로 확장할 수 있음:
저장소 | 설명 |
In-Memory | 가장 기본적인 방식, 단일 서버에서만 동작 |
Redis | 분산 서버 환경에서도 세션 공유 가능 |
JDBC | DB에 세션 정보 저장 (Spring Session JDBC) |
파일 시스템 | 파일로 저장, 느리지만 안정적임 |
→ 세션 클러스터링, 서버 간 부하 분산 시 Redis 등 외부 저장소 사용이 일반적임
5. 세션 만료 (타임아웃)
- 사용자가 일정 시간 요청을 하지 않으면 세션은 자동으로 만료됨
- 기본값은 보통 30분
- Spring에서는 server.servlet.session.timeout 설정으로 조절 가능
# application.yml
server:
servlet:
session:
timeout: 30m
6. Spring Boot에서 세션 사용 예시
세션에 데이터 저장
@GetMapping("/login-success")
public String loginSuccess(HttpSession session) {
session.setAttribute("userId", 123L);
return "welcome";
}
세션에서 데이터 조회
@GetMapping("/dashboard")
public String dashboard(HttpSession session) {
Long userId = (Long) session.getAttribute("userId");
// userId 없으면 로그인으로 리다이렉트 등
return "dashboard";
}
세션 삭제 (로그아웃)
@PostMapping("/logout")
public String logout(HttpSession session) {
session.invalidate(); // 세션 전체 무효화
return "redirect:/";
}
7. 실무에서의 세션 관리 전략
항목 | 전략 |
보안 | 세션 쿠키에 HttpOnly, Secure, SameSite 속성 적용 |
확장성 | Redis 등 외부 저장소로 세션을 관리하여 서버 간 공유 |
부하 분산 | Sticky Session 또는 분산 세션 구조 도입 |
사용자 로그아웃 처리 | 서버 측 세션 제거로 강제 로그아웃 가능 |
8. 세션 고정 공격(Session Fixation) 방지
공격자가 세션 ID를 사전에 정한 뒤 사용자가 그것을 사용하게 만들어 세션을 탈취하는 방식임.
해결 방법:
- 로그인 시마다 세션 ID 재발급
- Spring Security에서는 기본적으로 세션 ID 재생성 기능 내장됨
정리
세션(Session) 은 웹에서 사용자의 상태를 유지하기 위한 서버 측 저장 기술임.
세션 ID를 클라이언트에 쿠키로 저장하고, 서버는 해당 ID를 통해 상태 정보를 관리함.
Spring 기반 애플리케이션에서는 HttpSession, Redis, Spring Session 등을 통해 쉽게 세션을 사용할 수 있으며,
보안, 확장성, 유지시간 등의 측면에서 다양한 설정이 가능함.
출처 : ChatGPT
'CS' 카테고리의 다른 글
임계구역 (0) | 2025.05.14 |
---|---|
Gof 디자인 패턴 (0) | 2025.05.13 |
쿠키 (0) | 2025.05.10 |
매직 넘버 (0) | 2025.05.09 |
3-Way Handshake (0) | 2025.05.08 |