HTTP 쿠키
는 서버에서 유저의 브라우저에 저장하는 작은 데이터 조각입니다. 쿠키는 주로 세션 관리(로그인 상태, 장바구니), 사용자 개인화(테마, 환경 설정), 트래킹(분석, 광고) 등에 사용됩니다.
Set-Cookie
는 HTTP 응답 헤더 중 하나로, 쿠키를 서버에서 클라이언트(브라우저)로 전송하는 데 사용됩니다. 이 헤더가 포함된 응답을 받으면, 브라우저는 이를 해석하고 해당 쿠키를 저장합니다. 여러 개의 쿠키를 보내려면 동일한 응답에 여러 개의 Set-Cookie
헤더를 포함해야 합니다.
서버에서 Set-Cookie
헤더를 받게 되면 브라우저는 다음과 같이 동작합니다.
Set-Cookie
헤더에 지정된 쿠키와 해당 설정을 저장합니다. 만약 같은 이름의 쿠키가 이미 존재하면, 그 쿠키는 새 값과 설정으로 덮어씌워집니다.Max-Age
나 Expires
설정이 있는 경우, 그 시간이 지나면 쿠키는 자동으로 삭제됩니다.동일 출처 정책(Same-origin policy)은 웹 보안을 위해 적용되는 중요한 메커니즘으로, 한 출처(origin)에서 로드된 문서나 스크립트가 다른 출처의 리소스와 상호 작용하는 것을 제한합니다.
이 정책은 잠재적으로 악성인 문서가 사용자의 데이터에 악용되는 것을 방지하기 위해 존재합니다. 예를 들어, 악성 웹사이트에서 실행되는 자바스크립트가 사용자가 로그인한 웹메일 서비스나 회사 인트라넷과 같은 다른 출처의 데이터에 접근하여 해당 데이터를 악용하는 상황을 방지할 수 있습니다.
동일 출처 정책은 출처를 구성하는 프로토콜, 호스트, 포트 번호가 모두 동일한 경우 두 URL이 동일한 출처를 가지고 있다고 판단합니다. 이를 "scheme/host/port tuple" 또는 "튜플"이라고도 합니다.
쿠키에 대한 동일 출처 정책의 적용으로 인해 쿠키는 해당 출처와 관련된 페이지에서만 사용할 수 있습니다. 즉, 한 출처에서 설정한 쿠키는 다른 출처의 페이지에서는 접근할 수 없습니다.
동일 출처 정책은 웹 브라우저에 저장된 데이터에도 적용됩니다. 웹 스토리지(Web Storage)나 인덱스된 데이터베이스(IndexedDB)와 같은 데이터 저장소는 오리진별로 분리되어 있어 한 출처의 자바스크립트는 다른 출처의 저장소에 접근할 수 없습니다.
동일 출처 정책은 웹 보안을 강화하고, 악의적인 요청이나 데이터 접근을 방지하여 사용자의 개인정보와 안전을 보호합니다.
Set-Cookie
는 forbidden response header name
중 하나입니다. 이는 클라이언트 측 JavaScript 코드가 이 헤더에 액세스하는 것을 브라우저가 차단한다는 의미입니다.
fetch
API와 같은 비동기 요청은 Set-Cookie
를 포함한 응답 헤더를 프론트엔드 코드에서 필터링해야 하는 forbidden response header name
으로 정의합니다.
서버 측에서 Set-Cookie
헤더를 설정하고 사용자의 브라우저는 그것을 자동으로 처리합니다. 하지만 만약 클라이언트 측에서 쿠키를 사용해야 하는 경우에는, JavaScript의 Document.cookie API
를 사용할 수 있습니다. 이 API는 Set-Cookie
헤더와 달리 클라이언트 측에서 직접 액세스하고 수정할 수 있습니다. HttpOnly
속성이 있는 쿠키는 Document.cookie API
로 접근할 수 없습니다.
Domain=<domain-value>
.example.com
)의 선행 점은 무시됩니다.Expires=<date>
Max-Age=<number>
Partitioned
Path=<path-value>
/
) 문자는 디렉토리 구분 기호로 해석되며 하위 디렉토리도 일치합니다. 예를 들어 Path=/docs
,/docs
, /docs/
, /docs/Web/
, /docs/Web/HTTP
가 모두 일치합니다./
, /docsets
, /fr/docs
는 일치하지 않습니다.HttpOnly
Document.cookie
등을 통해 쿠키에 액세스하는 것을 금지합니다. 즉, 서버와 클라이언트 사이의 HTTP(S) 요청에서만 사용될 수 있습니다.XMLHttpRequest.send()
또는 fetch()
를 호출할 때와 같이 자바스크립트로 시작된 요청과 함께 전송됩니다.HttpOnly
플래그는 이를 방지합니다.Secure
HTTPS
를 통해서만 전송될 수 있습니다. HTTP
를 통해 전송되려 할 때는 브라우저가 전송을 차단합니다.Secure
플래그를 사용하면 쿠키 정보가 암호화된 연결을 통해서만 전송되도록 보장할 수 있습니다.SameSite
Strict
: 브라우저가 현재의 사이트와 다른 사이트로의 요청과 함께 쿠키를 전송하지 않게 합니다. 이는 사용자가 직접 URL을 입력하여 사이트에 접속하거나, 사이트 내의 링크를 클릭하여 다른 페이지로 이동하는 경우에도 해당됩니다. 이 옵션은 보안성을 높여주지만, UX에는 약간의 불편함을 줄 수 있습니다.Lax
: Strict
보다 덜 제한적입니다. 브라우저는 top-level navigation에 대한 GET 요청(사용자가 URL을 입력하거나, 사이트 외부에서 링크를 클릭하는 등)과 함께 쿠키를 전송하지만, 다른 모든 cross-site 요청에 대해서는 쿠키를 전송하지 않습니다.None
: 브라우저가 모든 요청에 대해 쿠키를 전송하도록 합니다. 즉, 사이트 간 요청에 대해 제한을 두지 않습니다. 이렇게 하려면 쿠키는 반드시 Secure
속성도 가지고 있어야 합니다. 이는 사용자의 정보를 HTTPS를 통해 안전하게 보호하기 위함입니다.쿠키는 클라이언트(브라우저)의 로컬 저장소에 저장됩니다. 이 저장소는 브라우저에 의해 관리됩니다. 쿠키는 브라우저의 쿠키 저장소에 저장되는 작은 텍스트 파일입니다. 쿠키의 내용은 키(key)와 값(value)의 쌍으로 구성되어 있습니다.
쿠키 저장소는 브라우저에 종속적이며, 주로 다음과 같은 위치에 저장됩니다:
쿠키 저장소의 정확한 위치 및 내부 구현은 브라우저 제조사에 따라 다를 수 있습니다. 일반적으로 개발자는 직접 쿠키 저장소에 접근하거나 조작할 수 있는 방법을 제공하지 않으며, 대신 브라우저가 이를 자동으로 처리합니다.
크롬 개발자 도구의 Application/cookies
는 웹 페이지와 관련된 쿠키 정보를 확인하고 조작할 수 있는 도구입니다. 이 도구를 사용하면 현재 페이지에서 설정된 쿠키를 보거나 쿠키를 추가, 수정 또는 삭제할 수 있습니다.
쿠키 정보의 열에는 쿠키의 이름, 값, 도메인, 경로, 만료 날짜 및 보안 여부 등의 정보가 포함될 수 있습니다. 이를 통해 현재 페이지에서 사용되는 쿠키를 확인하고 쿠키의 세부 정보를 파악할 수 있습니다.
개발자 도구의 "Cookies" 섹션에서 쿠키를 추가, 수정 또는 삭제할 수도 있습니다. 쿠키를 추가하려면 쿠키의 이름, 값, 도메인, 경로 등을 지정하고 "Add" 버튼을 클릭하면 됩니다. 쿠키를 수정하려면 해당 쿠키를 클릭하여 수정할 수 있습니다. 쿠키를 삭제하려면 해당 쿠키를 선택하고 "Delete" 버튼을 클릭하면 됩니다.
크롬 개발자 도구의 Application/cookies 기능을 사용하면 웹 애플리케이션에서 사용되는 쿠키를 쉽게 확인하고 조작할 수 있습니다. 이를 통해 쿠키의 동작을 디버깅하거나 테스트하는 데 도움을 받을 수 있습니다.
Reference