## 쿠키란? 쿠키는 브라우저에 저장되는 작은 데이터. 서버와 클라이언트가 상태를 공유하는 데 사용된다. 주로 로그인 상태 유지나 사용자 설정 등에 사용됨. ## 쿠키의 구조 ``` Set-Cookie: sessionId=abc123; Path=/; Max-Age=3600; HttpOnly; Secure ``` - `<cookie-name>=<cookie-value>` : 저장할 key-value 쌍 - `Domain=<domain-value>` : 어떤 도메인에서 쿠키를 보낼 지 정의. 기본적으로 현재 URL을 설정함 - `Path` : 어떤 경로에 이 쿠키를 보낼지 지정 - `Expires=<date>` : 언제 만료될지 - `Max-Age=<number>` : 쿠키의 유효 시간 (초). `Expires` 보다 우선순위 높음 - `HttpOnly` : JS로 접근 불가능하게 설정 ([[웹 보안 공격#XSS | XSS]] 방지) - `Secure` : HTTPS에서만 전송하도록 - `SameSite=<samesite-value>` : Cross-Site 요청에도 쿠키를 보낼지 여부를 설정 ([[웹 보안 공격#CSRF | CSRF]] 방지) - `Strict` : 동일한 도메인에만 쿠키를 전송한다 - `Lax` (기본값) : 링크를 따라갈 때 처럼 외부 사이트에서 원래 사이트로 이동할 때 쿠키 전송 - `None` : 모든 요청에 쿠키를 함께 보냄. `Secure` 설정이 함께하지 않는다면 에러를 발생시킨다. ## 쿠키의 매커니즘 서버가 응답 헤더에 `Set-Cookie` 를 포함하면 ``` HTTP/1.1 200 OK Set-Cookie: sessionId=abc123; Path=/; Max-Age=3600; HttpOnly; Secure ``` 브라우저가 이 값을 저장하고 있다가, 조건이 맞을 때 자동으로 Cookie 헤더에 쿠키를 붙여서 서버에 보낸다. ``` GET /dashboard HTTP/1.1 Host: example.com Cookie: sessionId=abc123 ``` - 쿠키 수정하기 : 같은 key로 `Set-Cookie`를 다시 보내면 기존 쿠키를 덮어쓴다. - 쿠키 삭제하기 : `Max-Age=0` 또는 `Expires=과거시점` 으로 설정한다. ## 세션 쿠키와 영속적인 쿠키 ### 세션 쿠키 클라이언트가 종료할 때 제거된다. `Expires`나 `Max-Age` 속성을 지정하지 않으면 기본적으로 세션 쿠키가 된다. ``` Set-Cookie: sessionId=38afes7a8 ``` ### 영속 쿠키 클라이언트의 상태와 상관 없이 특정 날짜나 특정 시간 이후에 제거된다. ``` Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT ``` ``` Set-Cookie: id=a3fWa; Max-Age=2592000 ``` ## 참고 - [쿠키 1부: HTTP로 설명하는 쿠키(cookie) \| Engineering Blog by Dale Seo](https://www.daleseo.com/http-cookies/) - [HTTP 쿠키 - HTTP \| MDN](https://developer.mozilla.org/ko/docs/Web/HTTP/Guides/Cookies) - [Set-Cookie - HTTP \| MDN](https://developer.mozilla.org/ko/docs/Web/HTTP/Reference/Headers/Set-Cookie)