CS

세션

baek-dev 2025. 5. 11. 16:30

세션(Session)이란?

세션(Session)웹에서 사용자의 상태를 서버에 유지하기 위해 사용되는 기술임.
HTTP는 본래 Stateless(무상태) 프로토콜이기 때문에, 사용자가 요청을 보낼 때마다 서버는 이전 요청과의 연결 관계를 알 수 없음.
따라서 로그인, 장바구니, 사용자 설정 등 사용자별 데이터를 유지하려면 '세션'이라는 개념이 필요함.


1. 세션의 기본 동작 원리

전체 흐름:

  1. 클라이언트가 서버에 처음 요청을 보냄
  2. 서버는 고유한 세션 ID를 생성하여 클라이언트에 전달함 (Set-Cookie)
  3. 클라이언트는 이후 요청마다 해당 세션 ID를 쿠키를 통해 자동으로 전송
  4. 서버는 세션 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