## 쿠키란?
쿠키는 브라우저에 저장되는 작은 데이터.
서버와 클라이언트가 상태를 공유하는 데 사용된다.
주로 로그인 상태 유지나 사용자 설정 등에 사용됨.
## 쿠키의 구조
```
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)