쿠키와 세션1: 쿠키

쿠키와 세션에 대해 공부한 내용을 정리한 글입니다.
먼저 쿠키에 대해서 정리합니다.

HTTP의 특성

쿠키와 세션을 이해하려면 먼저 HTTP의 특성을 알아야 한다.

  • HTTP: 인터넷상에서 데이터를 주고 받기 위해 서버/클라이언트 모델을 따르는 통신규약
  • 비연결성(Connectionless), 비상태성(Stateless)
    • 서버와 클라이언트의 연결 상태를 유지하지 않고, 연결 해제 후 상태 정보를 저장하지 않음
    • 서버의 자원을 절약하기 위함
    • 요청마다 새로운 사용자로 인식하는 단점 (같은 사용자인지 식별이 어려움)

이러한 단점을 보완하여, 서버가 클라이언트를 식별하도록 돕기 위해 쿠키와 세션 사용

쿠키

“내가 가지고 있으면서 서버를 이용할 때마다 보여주는 것”

  • 웹 사이트에 접속할 때 생성되는 정보를 담은 임시 텍스트 파일
  • 서버가 사용자의 웹 브라우저에 저장하는 데이터
  • 데이터 형태는 Key와 Value로 구성되고, String 형태로 이루어져 있다.
  • 브라우저마다 저장되는 쿠키는 다르다.
    서버에서는 브라우저가 다르면 다른 사용자로 인식한다.

사용목적

  1. 세션 관리(Session Management)
    로그인, 닉네임, 접속 시간, 장바구니 등 서버가 알아야 할 정보들을 저장

  2. 개인화(Personalization)
    사용자마다 다르게 그 사람에 적절한 페이지를 보여줄 수 있음 (사용자 정보 유지)

  3. 트래킹(Tracking)
    사용자의 행동과 패턴을 분석하고 기록

종류

  1. Session Cookie
    메모리에만 저장. 만료시간을 설정하지 않으면 브라우저 종료 시 삭제

  2. Persistent Cookie
    파일로 저장. Max-Age 설정을 통해 장기간 유지 가능하다.
    브라우저 종료와 관계없이 사용 가능.

  3. Secure Cookie
    HTTPS에서 사용되는 암호화된 쿠키. 그러나 실질적 보안은 제공되지 않음.

  4. Third Party Cookie
    다른 도메인에 요청이 필요할 때 생성하는 쿠키. 주로 광고 목적으로 사용됨.

쿠키의 사용 원리

  1. 클라이언트가 서버에 HTTP 요청
  2. 서버는 HTTP 응답 시 set-cookie를 통해 쿠키 생성하여 전달
  3. 클라이언트는 이제 HTTP 요청마다 헤더에 쿠키를 담아 전송
  4. 서버는 전송받은 쿠키와 서버에 저장된 사용자 정보를 비교하여 동일한 사용자임을 인식
  5. 만료 기간 이전이라면, 위와 같이 사용함
  6. 만료되었다면 서버에 새로 요청하여 쿠키를 새로 발급

옵션

  • HttpOnly
    브라우저에서 JS를 통해 쿠키 접근 불가능
  • HTTP secure
    HTTPS 통신 외에서는 쿠키를 전달하지 않는다.
  • SameSite
    크로스사이트 요청 시 전송 허용 여부 (None, Strict, Lax)
  • Domain
    쿠키에 대한 Domain 설정
    설정한 도메인을 대상으로 한 요청에서만 쿠키가 전송됨
    (기본값: 쿠키를 보낸 서버의 도메인)

장점

  • 대부분의 브라우저가 지원
  • 데이터 유효기간 지정 가능
  • XSS로부터 안전 (httpOnly 옵션 설정 시)

단점

  • 작은 데이터 저장 용량 (4KB)
  • 서버에 HTTP 요청마다 전달되므로, 서버에 부담
  • 암호화가 안 되어 있어 유저 정보 도난 위험
  • 개인정보가 저장되므로 사생활 침해의 소지
    (브라우저에는 쿠키 거부 기능이 있음)

  • 문자열만 저장 가능
  • CSRF 공격에는 취약

    브라우저가 서버에 요청을 보낼 때 쿠키를 자동으로 포함해서 보낸다.
    만약 그 쿠키에 세션ID, 액세스 토큰 등이 들어있다면 해커가 내 인증정보를 활용해서
    서버에 나인 것처럼 위장해서 요청을 보낼 수 있다.

참고 자료

[web] 쿠키(cookie)와 세션(session)의 개념/차이/용도/작동방식
velog - 쿠키, 로컬스토리지, 세션스토리지
토큰을 어디에 저장해야 안전할까