노트

HTTP 쿠키

HTTP Cookie

프런트엔드#http#security · 연결된 개념 12개

쉽게 말하면

HTTP 쿠키는 서버가 브라우저 손목에 채워 주는 놀이공원 입장 팔찌 같은 거예요. HTTP는 방금 누가 왔는지 기억하지 못하는데, 브라우저가 요청마다 팔찌를 자동으로 내밀어 로그인이 이어져요.

비유가 깨지는 곳 팔찌를 아무 데나 내미는 건 아니에요. Domain·Path가 맞는 요청에만 실리고, SameSite로 다른 사이트에서 시작된 요청은 거르고, HttpOnly면 JS가 읽지도 못해요.

서버가 브라우저에 저장시키는 작은 이름-값 데이터. 브라우저는 조건이 맞는 요청마다 쿠키를 자동으로 실어 보내므로, 상태가 없는 HTTP 위에서 로그인 같은 상태를 이어 가는 데 쓴다.

→ Set-Cookie: sid=abc123; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=86400
← Cookie: sid=abc123

주로 서버가 Set-Cookie로 만들고, HttpOnly가 아닌 쿠키는 JS(JavaScript)의 document.cookie로도 만들고 읽을 수 있다.

어디로 보내나: Domain과 Path

  • Domain 생략: 쿠키를 설정한 호스트에만 보낸다. 서브도메인과 공유하지 않는다
  • Domain 지정(Domain=example.com): 그 도메인과 모든 서브도메인에 보낸다. 앞에 점을 붙인 .example.com은 옛 표기이고 지금 스펙에서는 점을 무시한다. 다른 도메인으로는 지정할 수 없다
  • Path: /로 구분되는 경로 접두사로 매칭한다. Path=/foo면 /foo, /foo/bar에는 가지만 /, /foobar에는 안 간다. 생략하면 쿠키를 설정한 요청 URL 경로의 디렉터리가 기본값이다(/docs/a.html → /docs/)

보안 속성

  • Secure: HTTPS(HTTP Secure) 요청에만 보낸다
  • HttpOnly: JS에서 읽을 수 없다. XSS(Cross-Site Scripting)로 스크립트가 주입돼도 세션 쿠키를 훔치지 못한다. 요청에는 정상적으로 실린다
  • SameSite: 다른 사이트에서 시작된 요청에 쿠키를 실을지 정한다
    • Strict: 같은 사이트 요청에만. 다른 사이트의 링크를 타고 오면 로그인이 풀린 것처럼 보인다
    • Lax: 다른 사이트에서 오는 최상위 이동(링크 클릭 GET)에는 싣고, POST 같은 교차 사이트 요청과 fetch·img에는 안 싣는다. 속성을 생략하면 Chrome·Edge 같은 Chromium 계열은 이 값으로 취급한다(Firefox·Safari는 그렇지 않다, 2026 기준)
    • None: 항상 싣는다. Secure가 필수다
    • 쿠키 자동 전송이 CSRF(Cross-Site Request Forgery)의 원인이고, SameSite=Lax가 그 위험을 크게 줄였다

수명과 크기

  • Expires(날짜)나 Max-Age(초)가 없으면 브라우저를 닫을 때 지워지는 세션 쿠키(Session Cookie)다. 둘 다 있으면 Max-Age가 우선한다
  • 쿠키 하나는 약 4KB까지. 해당 도메인의 모든 요청에 실리므로 작게 유지한다. 큰 데이터는 localStorage와 sessionStorage에 둔다

함께 볼 것

출처: MDN — Using HTTP cookies · MDN — Using HTTP cookies: Define where cookies are sent

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 브라우저 캐시

    한 번 받은 리소스(HTML·CSS·JS·이미지)를 브라우저가 저장해 두었다가 다시 쓰는 기능. 서버가 응답 헤더로 얼마나, 어떻게 캐시할지 알려 주고 브라우저가 그대로 따른다.

  • CDN

    CDN(Content Delivery Network)은 세계 곳곳에 둔 서버(엣지, edge)들이 원본 서버(오리진, origin)의 응답을 복사해 두었다가 사용자와 가까운 곳에서 대신 내주는 네트워크다. 물리적 거리가 줄어 응답이 빨라지고, 오리진으로 가는 요청이 줄어 서버 부담도 줄어든다.

보기 옵션