쿠키 (Cookie) vs 세션 (Session)

2024. 11. 4. 03:12·Web

1. 쿠키 (Cookie)

 정의

  • 쿠키는 웹 서버가 클라이언트(브라우저)에 저장하는 작은 데이터 조각
  • 키-값 쌍으로 구성되어 있음

 쿠키의 HTTP 헤더

  Cookie

  • 클라이언트가 서버에 요청을 보낼 때 포함되는 헤더
  • 클라이언트에 저장된 모든 쿠키가 이 헤더에 포함되어 전송
  • 목록 내 쌍들은 세미콜록과 공백('; ')으로 구분
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry


  Set-Cookie

  • 서버가 클라이언트에 쿠키를 설정할 때 사용하는 헤더
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry


  구조 예시

Set-Cookie: key=value; expires=Mon, 04 Nov 2024 03:21:00 GMT; max-age=3600; path=/; domain=example.com; secure; HttpOnly; SameSite=Strict

  • key=value: 쿠키의 이름과 값.
  • expires: 쿠키의 만료 시간을 UTC 형식으로 지정. 해당 시간이 지나면 쿠키는 삭제. 시간은 서버가 아닌 쿠키가 설정되는 클라이언트에 상대적임.
  • max-age: 쿠키의 최대 수명(초 단위). expires 대신 사용할 수 있으며, 생성된 시점으로부터의 상대적인 수명을 설정. 만약 Expire와 Max-Age를 둘 다 설정했으면 Max-Age가 우선순위를 가짐.
  • path: 쿠키가 유효한 URL 경로를 지정. 기본값은 쿠키를 설정한 경로와 그 하위 경로.
  • domain: 쿠키가 유효한 도메인을 지정. 기본적으로 쿠키를 설정한 도메인에서만 유효하지만, 서브도메인에서도 사용할 수 있도록 설정할 수 있음. 만약 생략된다면 하위 도메인을 포함하지 않고, 현재 문서 URL의 도메인을 기본 값으로 설정.
  • secure: 이 속성이 설정되면, localhost를 제외한 HTTPS 프로토콜을 통해서만 쿠키가 전송. 이는 중간자 공격을 방지하는 데 유용.
  • HttpOnly: 이 속성이 설정된 쿠키는 JavaScript에서 접근할 수 없음. 이를 통해 XSS 공격으로부터 쿠키를 보호할 수 있음.
  • SameSite: 사이트 간 요청과 함께 쿠키가 전송될지를 제어하여 사이트 간 요청 위조 공격(CSRF)을 방지하기 위한 속성.
    • Strict: 동일한 사이트 에서만 쿠키를 전송. 즉, 사용자가 다른 사이트에서 링크를 클릭하여 요청을 보낼 때는 쿠키가 포함되지 않음. 가장 높은 수준의 보안을 제공하지만, 사용자 경험에 영향을 줄 수 있습니다. 
    • Lax: 기본값으로 설정되는 경우가 많으며, 사용자가 다른 사이트에서 링크를 클릭하여 해당 사이트로 이동할 때는 쿠키가 전송되지만, POST 요청과 같은 더 위험한 요청에서는 쿠키가 전송되지 않음. 사용자 경험을 어느 정도 유지하면서도 CSRF 공격에 대한 방어를 제공함.
    • None: 모든 요청에 쿠키를 전송. 즉, 다른 사이트에서 발생하는 요청에도 쿠키가 포함됨. 반드시 Secure 속성과 함께 사용해야 함. CSRF 공격에 취약할 수 있으므로 신중하게 사용해야 함.

  세션 쿠키 vs 지속 쿠키

  • 세션 쿠키 : 클라이언트가 종료될 때 쿠키를 제거. Expires 또는 Max-Age 속성을 지정하지 않음.
Set-Cookie: sessionId=38afes7a8
  • 지속 쿠키 : 클라이언트가 종료될 때가 아니라, 특정 날짜(Expires) 또는 특정 시간 후(Max-age)에 제거.
Set-Cookie: id=a3fWa; Expires=Mon, 04 Nov 2024 03:21:00 GMT
or
Set-Cookie: id=a3fWa; Max-Age=2592000

 

 특징

  • 저장 위치: 클라이언트의 브라우저에 저장.
  • 용량 제한: 각 쿠키는 약 4KB (4096byte)로 제한.
  • 만료 시간: 만료 시간을 설정할 수 있으며, 특정 시간이 지나면 자동으로 삭제.
  • 자동 전송: 클라이언트가 같은 도메인에 대한 요청을 보낼 때 자동으로 서버에 전송.
  • 브라우저가 관리 : 브라우저가 관리하며 각 브라우저에 동일한 쿠키 내용이라 하더라도 서로 별개의 쿠키로 적용됨.

 동작 원리

  1. 서버가 클라이언트에게 쿠키를 설정하는 HTTP 응답을 보냄. 예를 들어, 사용자가 로그인할 때 세션 ID를 쿠키로 설정.
  2. 클라이언트의 브라우저가 쿠키를 저장. 이는 브라우저의 메모리에 저장되며, 특정 도메인에 대해 유지.
  3. 클라이언트가 서버에 요청을 보낼 때마다 저장된 쿠키가 자동으로 포함. 이때 요청 헤더의 Cookie 필드에 쿠키가 포함되어 전송.
  4. 서버는 쿠키를 읽어 사용자 정보를 확인하고 필요한 처리를 수행. 예를 들어, 세션 ID를 사용하여 사용자의 로그인 상태를 확인.

 장점

  • 간편한 사용: 서버와 클라이언트 간의 정보를 쉽게 주고받을 수 있음.
  • 다양한 정보 저장 가능: 사용자 설정, 테마, 로그인 정보 등을 저장하는 데 유용함.
  • 자동 전송: 요청 시 자동으로 포함되므로 별도의 작업이 필요 없음.
  • 다양한 용도: 인증, 사용자 설정, 세션 관리 등 다양한 용도로 활용할 수 있음.

 단점

  • 보안 취약점: XSS(교차 사이트 스크립팅) 공격에 노출될 수 있음.
  • CSRF 공격: 쿠키는 CSRF(크로스 사이트 요청 위조) 공격에 취약할 수 있음.
  • 용량 제한: 한개의 쿠키당 최대 4KB(4096byte)크기로 제한되어 있어 대량의 데이터를 저장할 수 없음.
  • 저장 제한: 클라이언트는 총 300개의 쿠키를 저장할 수 있으며, 하나의 도메인당 20개의 쿠키를 가질 수 있음.

 보안 고려 사항

  • HttpOnly 속성: 쿠키에 HttpOnly 속성을 설정하여 JavaScript에서 접근할 수 없도록 하여 XSS 공격을 방지.
  • Secure 속성: Secure 속성을 설정하여 HTTPS를 통해서만 쿠키가 전송되도록 하여 중간자 공격을 방지.
  • SameSite 속성: CSRF 공격을 방지하기 위해 SameSite 속성을 설정하여 쿠키가 사이트 간 요청에 포함될 수 있는지를 제어.

2. 세션(Session)

 정의

  • 세션은 서버 측에서 사용자와의 상호작용을 추적하는 방법으로, 사용자가 웹 애플리케이션에 로그인한 후부터 로그아웃할 때까지의 상태를 유지.
  • 각 사용자는 고유한 세션 ID를 가지고 있으며, 이 ID를 통해 서버는 사용자의 상태를 관리.

 세션 ID와 세션 데이터

  • 세션 ID
    • 사용자의 세션을 식별하기 위한 고유한 문자열.
    • 클라이언트는 이 ID를 통해 서버에 요청을 보낼 때 세션을 식별함.
    • 세션 ID는 일반적으로 쿠키에 저장되거나 URL 파라미터를 통해 전달됨.
  • 세션 데이터:
    • 서버에 저장되는 클라이언트와 관련된 정보.
    • 예를 들어, 사용자 로그인 정보, 장바구니 내용, 사용자 설정 등이 포함될 수 있음.
    • 세션 데이터는 서버의 메모리, 데이터베이스, 또는 파일 시스템에 저장될 수 있음.

 특징

  • 저장 위치: 세션 데이터는 서버에 저장되며, 클라이언트는 세션 ID를 통해 접근함.
  • 상태 유지: 세션은 사용자의 로그인 정보와 다른 상태 정보를 유지하여 여러 페이지를 탐색하는 동안 일관된 사용자의 상태를 제공함.
  • 만료 시간: 세션은 일정 시간이 지나면 만료되거나 사용자가 로그아웃할 때 종료됨. 세션 만료 시간은 서버에서 설정할 수 있음.

 동작 원리

  1. 사용자가 웹 애플리케이션에 로그인하면, 서버는 새로운 세션을 생성하고 세션 ID를 생성.
  2. 서버는 세션 ID를 클라이언트에 전달. 보통 쿠키를 통해 전달.
  3. 서버는 세션 ID와 관련된 사용자 정보를 세션 데이터로 저장.
  4. 클라이언트는 이후 서버에 요청할 때마다 세션 ID를 포함하여 전송.
  5. 서버는 세션 ID를 기반으로 세션 데이터를 조회하고, 사용자의 상태를 확인.
  6. 사용자가 로그아웃할 경우, 서버는 해당 세션을 종료하고 세션 데이터를 삭제.

 장점

  • 보안성: 세션 데이터는 서버에 저장되므로 클라이언트에서 직접 접근할 수 없어 상대적으로 안전함.
  • 상태 관리: 사용자의 로그인 정보와 다른 상태 정보를 유지하여 여러 페이지를 탐색하는 동안 일관된 사용자 상태를 제공함.
  • 서버 측 관리: 세션 데이터는 서버에서 관리되므로, 데이터의 무결성과 보안성을 유지하기 더 용이함.

 단점

  • 서버 자원 소모: 세션 정보를 서버에 저장하므로 사용자가 많아질 경우 서버 자원이 소모될 수 있음. 메모리 기반 세션 저장소를 사용할 때 문제가 될 수 있음.
  • 확장성 문제: 여러 서버에 걸쳐 세션 정보를 공유하기 어려워 복잡한 아키텍처에서는 관리가 힘들 수 있음. 세션 스토어를 분리하거나, 데이터베이스에 저장하는 방식으로 해결할 수 있지만 추가적인 복잡성을 초래함.
  • 만료 관리: 세션의 만료 시간이 지나면 사용자는 다시 로그인해야 하므로, 사용자 경험에 영향을 줄 수 있음.

 보안 고려 사항

  • 세션 하이재킹 방지: 세션 ID를 탈취당하는 것을 방지하기 위해, HTTPS를 사용하여 데이터 전송 시 암호화.
  • 세션 고정 공격 방지: 사용자가 로그인한 후에는 새로운 세션 ID를 생성하여 세션을 고정하는 공격을 방지.
  • 세션 만료: 일정 시간이 지나면 세션을 자동으로 만료시켜, 오랜 시간 사용하지 않은 세션에 대한 접근을 차단.
  • IP 주소 확인: 세션 ID와 함께 클라이언트의 IP 주소를 체크하여, IP 주소가 변경된 경우 세션을 무효화.

3. 요약

항목 쿠키 세션
저장위치 클라이언트(브라우저)에 저장 서버에 저장
용도 사용자 설정, 인증 정보 등 사용자 상태 관리
만료 만료 시간이 설정 가능 일정 시간 후 만료, 사용자 로그아웃 시 종료
보안 상대적으로 취약 (XSS 공격 가능) 상대적으로 안전 (서버에 저장)
728x90
반응형
저작자표시 비영리 동일조건 (새창열림)

'Web' 카테고리의 다른 글

HTTP 요청(Request) / 응답(Response)  (0) 2024.11.13
JWT(JSON Web Token)란?  (0) 2024.11.05
'Web' 카테고리의 다른 글
  • HTTP 요청(Request) / 응답(Response)
  • JWT(JSON Web Token)란?
BPM37093
BPM37093
luna의 IT기술 정리
  • BPM37093
    IT Study Log
    BPM37093
  • 링크

  • 글쓰기 관리
    • 분류 전체보기 (43)
      • 모의해킹 (37)
        • 웹해킹 (1)
        • 모의해킹 스터디 (36)
      • Web (5)
        • 웹 보안 (1)
        • 웹 크롤링 (1)
      • Data (0)
      • Cloud (0)
      • Network (1)
  • 인기 글

  • 방문자 수

    방문자수Total

    • Today :
  • 태그

    javascript
    모의해킹스터디
    mysql
    웹해킹
    HTML
    상태코드
    HttpResponse
    SQL
    httprequest
    sqlinjection
    웹개발
    메서드
    Chrome
    php
    WEB
    오블완
    Network
    HTTP
    burpsuite
    hash
    티스토리챌린지
    NAT
  • hELLO· Designed By정상우.v4.10.1
BPM37093
쿠키 (Cookie) vs 세션 (Session)
상단으로

티스토리툴바