[Network] 쿠키(Cookie)

과꼴 취준·2025년 9월 30일

Network

목록 보기
4/5
post-thumbnail

1. 쿠키(Cookie) 를 이용한 세션 관리


  • HTTP 프로토콜의 기본 특징: HTTP 는 무상태(stateless) 프로토콜이라, 요청(Request) 하나하나가 서로 독립적이고, 상태를 유지하지 않는다.

    즉, 서버는 이전의 요청이 누구로부터 왔는지 기억하지 못한다.

  • 이로 인한 문제점은 로그인 예시에서, 사용자가 /login 요청으로 아이디, 비밀번호를 보내 인증에 성공했더라고,
    그다음 /mypage 요청에서는 서버가 이게 방금 로그인한 사용자 요청인지 판단할수 없다. 따라서, 매 요청마다
    userId, password 같은 자격 증명을 반복해서 보내야한다(비 효율적 이고, 보안에 취약하다.)

1.1 쿠키(Cookie) 를 이용한 해결

  1. 클라이언트가 로그인 에 성공하면 , 서버가 세션을 생성하고 , 주로 SESSIONID 같은 식별자를 발급한다.
  2. 서버는 응답 헤더Set-Cookie 를 포함시켜 클라이언트에 전달한다(Cookie 전달).
HTTP/1.1 200 OK
Set-Cookie: SESSIONID=abc123; Path=/; HttpOnly; Secure
  1. 클라이언트(브라우저)는 이 값을 저장해두고, 이후 요청할 때마다 자동으로 Cookie header 에 포함시킨다
GET /mypage HTTP/1.1
Host: example.com
Cookie: SESSIONID=abc123
  1. 서버는 SESSIONID 를 보고 이 요청이 어느 사용자 세션에 속하는지 식별한다. (이전의 요청이
    누구로부터 왔는지 식별할수 있다)
    .

  • 앞선 방식(매번 userId, password를 직접 보내는 것): 매 요청마다 인증 정보를 다 들고 다녀야 한다.
  • 쿠키 + 세션 방식: 서버가 만든 "세션 식별자"만 쿠키에 저장해 두고, 클라이언트는 그 값만 보내면 된다.

1.2 웹 스토리지를 이요한 로그인 세션유지 (참고)

브라우저에는 Web Storage API가 있어서, 클라이언트 쪽에서 데이터를 보관할 수 있다.

  • 종류
    • localStorage : 브라우저에 영구 저장 (탭/브라우저 닫아도 남음).
    • sessionStorage : 현재 브라우저 탭에서만 유지 (탭 닫으면 사라짐).
  • 로그인 세션 관리에 사용될 때
    • 서버가 발급한 JWT 토큰 같은 인증 토큰localStoragesessionStorage에 저장.
    • 이후 요청을 보낼 때 자바스크립트로 토큰을 꺼내서 Authorization 헤더에 붙여 보냄.

참고) 쿠키에 담기는 세션 ID, 인증토큰

  • 세션 ID(Session Identifier)
    • 서버가 관리하는 "사용자 세션"을 구분하기 위한 고유한 ID 값.
    • 세션서버 메모리(혹은 DB/Redis 등)에 사용자 상태(로그인 여부, 장바구니, 권한 정보 등)를 저장해둔 공간.
    • 클라이언트는 쿠키를 통해 세션 ID만 보내고, 실제 데이터는 서버가 들고 있음.
    • 예: SESSIONID=abc123
  • 인증 토큰 (Authentication Token)
    • JWT(Json Web Token) 같은 자체적으로 사용자 정보를 포함하는 토큰.
    • 서버가 별도 세션을 들고 있지 않고, 토큰 안에 "누구인지, 언제 만료되는지, 어떤 권한이 있는지" 등을 서명한 형태로 담음.
    • 서버는 토큰의 유효성만 검증하면 되고, 상태 저장이 필요 없음(= Stateless 인증).
    • 예: Authorization: Bearer <JWT토큰> (쿠키에 저장할 수도 있고, 헤더에 직접 넣기도 함).

2. 쿠키의 생명주기


예시 header
Set-Cookie: SESSIONID=abc123; Path=/; Expires=Wed, 30 Oct 2025 12:00:00 GMT; HttpOnly; Secure
Set-Cookie: TOKEN=xyz456; Path=/; Max-Age=3600
  • Expires

    • 특정 시각(UTC)까지 쿠키를 유효하게 함.
    • 예: Expires=Wed, 30 Oct 2025 12:00:00 GMT → 2025년 10월 30일 12시까지 유지, 그 이후 삭제.
  • Max-Age

    • 쿠키의 수명(초 단위)을 지정.
    • 예: Max-Age=3600 (쿠키 발급 후 3600초(=1시간) 동안만 유효).
    • Max-Age가 있으면 Expires보다 우선 적용됨.
  • 세션 쿠키(Session cookie)

    • Expires, Max-Age 둘 다 없으면 브라우저 메모리에만 저장 한다.
    • 브라우저(혹은 탭)를 닫으면 자동 삭제.
  • 영속 쿠키(Persistent cookie)

    • Expires 또는 Max-Age가 있으면 → 디스크에 저장.
    • 브라우저를 껐다 켜도 살아있음 (유효기간 끝날 때까지).

3. 쿠키의 도메인(Domain)


예시 header
Set-Cookie: SESSIONID=abc123; Domain=example.com; Path=/; Secure
  • Domain 지정한 경우
    • Domain=example.com → example.com 및 하위 도메인(sub.example.com)에도 쿠키 전송.
  • Domain 생략한 경우
    • 쿠키를 발급한 정확한 호스트에만 전송텍스트.
    • 예: www.example.com에서 발급했으면 → api.example.com에는 전송되지 않음.

4. 쿠키의 경로(Path)


예시 header
Set-Cookie: SESSIONID=abc123; Path=/account
  • Path 는 쿠키가 전송될 요청 경로 범위를 제한.

  • 예:

    • Path=/account/account, /account/settings 요청에는 전송.
    • /shop 같은 다른 경로에는 전송되지 않음.
  • 보통 기본값은 /라서, 사이트 전체에서 쿠키가 전송됨.

5. 쿠키의 보안 속성


예시 header
Set-Cookie: SESSIONID=abc123; Path=/; Secure; HttpOnly; SameSite=Strict
  • Secure
    • HTTPS 연결에서만 쿠키 전송.
    • HTTP 평문 요청에서는 전송되지 않음 → 도청 방지.
  • HttpOnly
    • 자바스크립트에서 document.cookie로 접근 불가.
    • XSS 공격에 의해 탈취되는 걸 막음.
    • 서버에서만 접근 가능.
  • SameSite
    • CSRF(Cross-Site Request Forgery) 공격 방지 목적.

https://developer.mozilla.org/ko/docs/Web/HTTP/Guides/Cookies 참고

profile
취업 엑조디아 모으기

0개의 댓글