[Web 주요 개념] 2. 쿠키와 세션 관리: 상태 유지 기법

steve·2024년 10월 9일

Web Technology

목록 보기
2/3

개요

  • 쿠키세션은 웹 애플리케이션에서 클라이언트와 서버 간의 상태를 유지하기 위한 핵심 기법. HTTP 프로토콜은 기본적으로 Stateless이기 때문에, 각 요청이 서로 독립적이며 서버는 이전 요청의 상태를 기억하지 않음. 하지만 사용자 로그인이나 쇼핑 카트와 같이 상태를 유지해야 하는 기능에서는 쿠키와 세션이 필수적으로 사용됨
  • 이번 글에서는 쿠키의 동작 방식, 세션 관리 방법, 그리고 보안을 위한 쿠키 옵션을 실무적 관점에서 설명

1. 쿠키의 동작 방식

  • 쿠키는 클라이언트의 웹 브라우저에 저장되는 작은 데이터 조각으로, 웹 애플리케이션이 클라이언트의 상태를 기억할 수 있게 해줌. 쿠키는 클라이언트 측에서 저장되며, 서버는 쿠키를 통해 사용자의 이전 상태나 설정을 확인할 수 있음

쿠키 생성 및 전송 과정

1) 서버에서 쿠키 생성

  • 클라이언트가 서버에 요청을 보낼 때, 서버는 응답의 Set-Cookie 헤더를 통해 클라이언트에게 쿠키를 생성하라고 지시할 수 있음. 쿠키는 이름-값 쌍으로 저장되며, 만료 시간, 경로, 도메인 등의 정보도 포함될 수 있음
    HTTP/1.1 200 OK
    Set-Cookie: sessionId=abc123; Max-Age=3600; HttpOnly

2) 클라이언트에서 쿠키 저장

  • 클라이언트는 서버에서 받은 쿠키를 로컬 저장소에 저장함. 이후 같은 도메인으로 요청을 보낼 때마다, 쿠키를 요청 헤더에 포함하여 서버에 전송함

    GET /profile HTTP/1.1
    Host: example.com
    Cookie: sessionId=abc123

3) 서버에서 쿠키 확인

  • 서버는 클라이언트가 전송한 쿠키를 확인하고, 해당 쿠키에 담긴 정보를 바탕으로 클라이언트의 상태를 인식함. 예를 들어, 로그인한 사용자라면 세션 ID를 통해 사용자 정보를 확인함.

2. 쿠키의 속성

  • 쿠키는 다양한 속성을 설정하여 유효 범위보안 설정을 제어할 수 있음. 쿠키 설정을 적절히 관리하는 것은 웹 애플리케이션의 보안과 성능에 중요한 영향을 미침.
  • Expires/Max-Age: 쿠키의 만료 시간을 설정함. 쿠키가 일정 시간 이후 자동으로 삭제되도록 할 수 있음. Max-Age는 쿠키의 유효 시간을 초 단위로 설정하며, Expires는 특정 날짜와 시간을 설정할 수 있음
  • Domain: 쿠키가 전송될 도메인 범위를 지정함. 예를 들어, example.com에 대한 쿠키는 sub.example.com에서도 유효하도록 설정 가능함
  • Path: 쿠키가 전송될 경로를 지정함. 특정 경로에서만 쿠키를 사용할 수 있도록 제한 가능함
  • HttpOnly: 자바스크립트에서 쿠키에 접근하지 못하도록 방지함. 이를 통해 XSS(Cross-Site Scripting) 공격으로부터 쿠키를 보호할 수 있음
  • Secure: HTTPS 연결에서만 쿠키를 전송하도록 보장함. 이를 통해 네트워크 상에서의 중간자 공격(Man-in-the-Middle)으로부터 데이터를 보호함
  • SameSite: CSRF(Cross-Site Request Forgery) 공격을 방지하기 위해, 쿠키가 외부 도메인에서 전송되지 않도록 제어함. StrictLax 모드로 설정할 수 있음
Set-Cookie: sessionId=abc123; Max-Age=3600; Secure; HttpOnly; SameSite=Strict

3. 세션 관리

  • 세션은 서버 측에서 사용자의 상태를 유지하기 위한 메커니즘. 쿠키와 달리 세션 정보는 서버 측에 저장되며, 클라이언트는 서버에 접근할 때 세션 ID만을 전송함. 서버는 이 세션 ID를 통해 해당 클라이언트의 상태를 추적하고, 필요한 정보를 참조

세션 관리 흐름

1) 클라이언트가 서버에 요청

  • 클라이언트가 웹 애플리케이션에 로그인 요청을 보내면, 서버는 사용자의 인증 정보를 확인하고 세션을 생성

2) 서버에서 세션 ID 생성

  • 서버는 고유한 세션 ID를 생성하고, 이를 클라이언트의 쿠키에 저장함. 세션 ID는 이후 클라이언트가 서버에 요청할 때마다 전송됨.
    Set-Cookie: sessionId=abc123; HttpOnly; Secure

3) 서버에서 세션 관리

  • 클라이언트가 서버에 요청을 보낼 때마다 세션 ID를 통해 사용자의 세션 정보를 확인하고, 로그인 상태나 사용자 설정을 유지함. 세션 데이터는 서버의 메모리, 데이터베이스, 또는 Redis와 같은 인메모리 데이터 저장소에 저장됨

4) 세션 종료

  • 클라이언트가 로그아웃하거나, 세션 만료 시간이 지나면 서버는 해당 세션을 삭제

세션의 장점과 단점

  • 장점: 세션은 서버 측에서 상태를 관리하므로, 민감한 정보가 클라이언트 측에 저장되지 않음. 쿠키에는 단순히 세션 ID만 저장되므로, 보안성이 더 높음
  • 단점: 서버 측에 세션 데이터를 저장해야 하므로, 서버 리소스를 많이 사용함. 사용자가 많아지면 서버 메모리나 저장 공간에 부담이 될 수 있음

4. 쿠키와 세션의 차이

  • 저장 위치:

    • 쿠키클라이언트 측에 저장되며, 브라우저가 직접 관리
    • 세션서버 측에서 관리되며, 서버가 모든 상태 정보를 유지
  • 보안성:

    • 쿠키는 클라이언트에 저장되므로, 쿠키 탈취 공격이나 XSS 공격에 취약할 수 있음. 이를 방지하기 위해 HttpOnlySecure 옵션을 설정해야 함
    • 세션은 서버에서 관리되므로, 민감한 데이터가 클라이언트에 노출되지 않음. 하지만, 세션 관리가 잘못되면 세션 하이재킹(Session Hijacking) 등의 공격에 취약할 수 있음
  • 상태 저장 방식:

    • 쿠키는 클라이언트가 직접 데이터를 저장하고, 서버로 요청할 때마다 그 데이터를 전송함
    • 세션은 클라이언트가 세션 ID만 전송하고, 실제 데이터는 서버에서 관리함

5. 보안을 위한 쿠키 옵션

  • 웹 애플리케이션에서 쿠키를 사용하여 세션을 관리할 때는 보안이 중요한 요소임. 특히, 민감한 정보가 포함된 세션 쿠키는 공격으로부터 보호되어야 하며, 이를 위해 다음과 같은 쿠키 옵션을 적절히 설정해야 함

1) HttpOnly: 쿠키에 HttpOnly 속성을 설정하면, 자바스크립트에서 해당 쿠키에 접근할 수 없게 되어 XSS 공격으로부터 쿠키를 보호할 수 있음

Set-Cookie: sessionId=abc123; HttpOnly

2) Secure: HTTPS 연결에서만 쿠키가 전송되도록 보장함. 이를 통해 네트워크 도청중간자 공격을 방지할 수 있음

Set-Cookie: sessionId=abc123; Secure

3) SameSite: CSRF 공격을 방지하기 위해, SameSite 속성을 설정하여 쿠키가 외부 사이트로부터 전송되지 않도록 제한할 수 있음. Strict 모드는 쿠키가 외부 사이트에서 전송되지 않도록 하여 보안을 강화함

Set-Cookie: sessionId=abc123; SameSite=Strict

6. 실무에서의 쿠키와 세션 관리

  • 실무 환경에서 쿠키와 세션은 주로 로그인 상태 유지, 사용자 설정 저장, 쇼핑 카트와 같은 상태 정보를 관리하는 데 사용됨. 예를 들어, 사용자가 로그인하면 서버는 세션 ID를 생성하여 클라이언트의 쿠키에 저장하고, 이후 요청에서 세션 ID를 확인해 사용자의 로그인 상태를 유지함
  • 예시 : 사용자 로그인 관리 시, 클라이언트가 서버로 로그인 요청을 보내면 서버는 인증 정보를 확인하고, 고유한 세션 ID를 생성하여 사용자의 로그인 상태를 관리함. 이후 클라이언트가 페이지를 이동하거나 새로고침할 때도 세션 ID를 통해 로그인 상태가 유지됨

정리

  • 쿠키와 세션은 HTTP 프로토콜의 무상태성을 극복하고, 사용자 상태를 유지하기 위한 중요한 기법임. 쿠키는 클라이언트 측에서 데이터를 저장하고, 세션은 서버 측에서 사용자의 상태를 관리하는 방식으로 동작함
  • 실무에서는 쿠키와 세션을 적절히 사용하여 사용자 인증, 상태 관리, 보안 강화 등의 작업을 처리할 수 있으며, HttpOnly, Secure, SameSite 옵션을 통해 보안을 강화하는 것이 중요

0개의 댓글