본문 바로가기

HTTP

세션 파헤치기

반응형

1) 정의

세션(Session)은 클라이언트와 서버 간의 상태를 유지하는 방식으로, 사용자가 웹사이트를 방문한 후 일정 시간 동안 유지되는 정보를 의미한다.

웹은 본질적으로 무상태(Stateless) 프로토콜이기 때문에, 사용자의 로그인 상태나 특정 정보를 유지하려면 별도의 메커니즘이 필요하다.

이를 위해 서버 측(Session)과 클라이언트 측(Cookie, Token 등)에서 정보를 저장하고 관리하는 방식이 사용된다.


2) 세션(Session)의 동작 방식

세션은 서버에서 관리되며, 클라이언트가 요청을 보낼 때 세션 ID를 함께 전송하여 해당 사용자의 정보를 유지하는 방식으로 동작한다.

  • 클라이언트가 서버에 요청
    • 사용자가 웹사이트에 접속하면 서버는 새로운 세션을 생성한다.
    • 서버는 세션 ID(Session ID)를 생성하고, 이 값을 클라이언트에게 응답 헤더의 Set-Cookie를 통해 전달한다.
    • Set-Cookie: session_id=abc123; Path=/; HttpOnly; Secure
  • 클라이언트가 세션 ID를 저장
    • 브라우저는 서버가 보낸 session_id를 쿠키에 저장한다.
  • 클라이언트가 요청할 때 세션 ID 전송
    • 이후 사용자가 동일한 웹사이트에서 다른 요청을 보낼 때, 브라우저는 자동으로 쿠키에 저장된 session_id 값을 포함하여 서버에 전송한다.
    • GET /dashboard HTTP/1.1 Host: example.com Cookie: session_id=abc123
  • 서버에서 세션 ID 확인 및 사용자 정보 조회
    • 서버는 받은 session_id를 기반으로 저장된 세션 데이터를 조회하여 해당 사용자의 상태를 유지한다.

3) 세션(Session)의 주요 특징

  • 서버에서 데이터 관리
    • 세션은 클라이언트가 아닌 서버에서 상태를 저장한다.
    • 따라서 보안성이 높으며, 클라이언트에서 조작할 수 없다.
  • 고유한 세션 ID 부여
    • 세션은 각 사용자를 구별하기 위해 고유한 세션 ID(Session ID) 를 생성한다.
    • 일반적으로 랜덤 문자열 + 해싱 알고리즘을 사용하여 생성된다.
  • 쿠키를 사용하여 세션을 추적
    • 클라이언트는 쿠키에 세션 ID만 저장하고, 실제 데이터는 서버에서 유지된다.
  • 시간 제한(만료 시간 설정 가능)
    • 세션에는 유효 시간(Time To Live, TTL) 이 존재하며, 일정 시간이 지나면 자동으로 삭제된다.
    • 사용자가 특정 시간 동안 활동이 없으면 세션이 만료된다.

4) 세션(Session)의 저장 방식

세션 데이터는 서버에서 관리되므로 여러 가지 방식으로 저장될 수 있다.

  • 메모리 저장 (기본 방식)
    • 세션을 서버의 RAM(메모리) 에 저장하는 방식.
    • 속도가 빠르지만, 서버가 재시작되면 데이터가 손실된다.
    • 단일 서버에서만 운영되는 소규모 프로젝트에 적합.
  • 파일 시스템 저장
    • 세션 데이터를 서버의 파일로 저장하는 방식.
    • 여러 개의 서버를 사용할 경우 파일 동기화가 필요함.
    • 속도는 메모리보다 느리지만 서버가 재시작되어도 데이터가 유지됨.
  • 데이터베이스 저장
    • MySQL, PostgreSQL, MongoDB 등 데이터베이스에 세션을 저장하는 방식.
    • 서버가 재시작되더라도 세션 정보가 유지됨.
    • 다중 서버 환경에서 세션 공유가 가능하지만, DB 부하가 증가할 수 있음.
  • 캐시 저장 (Redis, Memcached)
    • Redis 또는 Memcached를 이용하여 세션을 저장하는 방식.
    • 속도가 매우 빠르고, 다중 서버 환경에서도 세션 공유가 용이함.
    • 그러나 별도의 캐시 서버가 필요하고, 재시작 시 데이터가 손실될 수 있음.

5) 쿠키(Cookie)와 세션(Session)의 차이점

구분 쿠키(Cookie) 세션(Session)

저장 위치 클라이언트(브라우저) 서버
데이터 보안 낮음(사용자가 조작 가능) 높음(서버에서 관리)
속도 빠름 상대적으로 느림(서버 처리 필요)
유효 기간 설정된 만료 시간까지 유지 브라우저 종료 시 기본적으로 삭제(설정 가능)
주요 사용 예시 로그인 상태 유지, 광고 트래킹 사용자 인증, 장바구니 유지
서버 부하 없음 사용자 수 증가 시 부하 증가 가능

6) 세션(Session)의 보안 문제 및 해결 방법

  • 세션 하이재킹(Session Hijacking)
    • 공격자가 사용자의 세션 ID를 탈취하면 해당 사용자의 세션을 가로챌 수 있음.
    • 해결 방법
      • 세션 ID를 정기적으로 갱신
      • Secure 속성을 설정하여 HTTPS에서만 쿠키를 전송
      • 세션 ID를 요청자의 IP와 함께 검증
  • 세션 고정(Session Fixation)
    • 공격자가 미리 생성된 세션 ID를 피해자가 사용하도록 유도한 뒤, 해당 세션을 탈취하는 공격.
    • 해결 방법
      • 로그인 시 세션 ID를 변경
      • HttpOnly 속성을 설정하여 자바스크립트에서 쿠키 접근을 차단
  • 세션 타임아웃(Session Timeout)
    • 사용자가 일정 시간 동안 활동이 없으면 세션을 자동으로 만료해야 보안이 강화됨.
    • 해결 방법
      • 세션 만료 시간을 적절하게 설정 (예: 30분)
      • 사용자가 일정 시간 동안 활동이 없으면 자동 로그아웃 처리

7) 세션을 유지하는 대체 기술

  • JWT(JSON Web Token)
    • 서버가 상태를 저장하지 않고, 클라이언트가 토큰을 사용하여 인증을 수행하는 방식.
    • 세션과 달리, 서버에서 상태를 관리할 필요가 없음.
    • 분산 시스템에서 유용하지만, 보안적으로 민감한 정보는 포함시키지 않는 것이 좋음.
  • OAuth
    • 외부 인증 서비스(Google, Facebook 등)를 활용하여 사용자를 인증하는 방식.
    • OAuth2.0을 사용하면 액세스 토큰을 발급받아 API 요청 시 인증을 수행할 수 있음.

8) 결론

세션은 웹 애플리케이션에서 사용자 인증 및 상태 유지에 중요한 역할을 하며, 주로 로그인 및 쇼핑몰의 장바구니 기능 등에 활용된다.

하지만 서버 측에서 세션을 관리해야 하기 때문에 서버 부하, 보안 문제 등이 발생할 수 있으며, 이를 해결하기 위해 세션 하이재킹 방지, Redis를 활용한 세션 저장, JWT 등의 대체 기술을 고려할 수 있다.

반응형

'HTTP' 카테고리의 다른 글

캐시 파헤치기  (1) 2025.02.06
토큰 파헤치기  (0) 2025.02.06
쿠키 파헤치기  (0) 2025.02.06
REST API  (0) 2023.04.12
HTTP란?  (0) 2023.04.12