# Cookie(쿠키)

쿠키는 클라이언트 로컬에 저장하는 작은 데이터 조각으로, 주로 다음과 같은 용도로 사용된다.

* 사용자 로그인 세션 관리
* 사용자 선호 설정
* 광고 정보 트래킹
* 그 외 다양한 용도로 사용

## 동작 방식

쿠키는 다음과 같은 방식으로 동작한다.

* 생성 및 저장: 서버는 Set-Cookie HTTP 헤더를 통해 클라이언트에게 쿠키를 생성하도록 지시하고, 클라이언트는 서버로부터 받은 쿠키를 로컬에 저장
* 전송: 클라이언트는 동일한 서버로 요청을 보낼 때마다 저장된 쿠키를 Cookie HTTP 헤더에 포함하여 전송(항상 헤더에 포함되어 전송되기 때문에, 트래픽이 증가할 수 있음)
* 구성: `이름=값` 형태로 구성

## 쿠키의 생명주기

쿠키의 타입은 파기되는 시점에 따라 아래 두 가지로 나뉜다.

* 세션 쿠키(Session Cookie)
  * 사용자가 사이트를 탐색할 때, 관련한 설정과 선호 사항들을 저장하는 임시 쿠키
  * 브라우저가 종료되면 쿠키가 삭제됨
* 지속 쿠키(Persistent Cookie)
  * 사용자가 주기적으로 방문하는 사이트에 대한 설정 정보나 로그인 이름 등을 저장하는 쿠키
  * 디스크에 저장되어, 브라우저가 종료되어도 쿠키가 삭제되지 않음

`Expires`나 `Max-Age`를 지정하지 않으면 세션 쿠키로 생성되며, `Expires`나 `Max-Age`를 지정하면 지속 쿠키로 생성된다.

* `Expires` : 쿠키의 만료 시간을 지정
* `Max-Age` : 쿠키의 만료 시간을 초 단위로 지정

## 도메인

모든 사이트에 브라우저 내의 모든 쿠키가 전송된다면 개인정보 문제와 불필요한 데이터를 전송하는 문제가 발생할 수 있기 때문에 해당 쿠키가 적용될 도메인과 경로를 지정할 수 있다.

* `Domain`: 쿠키가 적용될 도메인을 지정하는 속성(하위 도메인에도 적용)
  * 명시하지 않으면 현재 도메인만 적용되고, 하위 도메인에는 적용되지 않음
* `Path` : 쿠키가 적용될 경로를 지정하는 속성
  * 명시하지 않으면 모든 경로에 적용

## 보안

쿠키는 브라우저에 저장되기 때문에, 보안에 유의하지 않으면 여러 위험에 노출될 수 있다.

* 해당 브라우저가 다른 사람에 의해 접근될 경우, 쿠키를 통해 사용자의 정보가 유출될 수 있음
* 쿠키는 누구나 쉽게 볼 수 있는 평문 형태로 저장되기 때문에, 쿠키 값이 변조될 위험성이 존재

이러한 문제를 방지하기 위해 쿠키에 보안을 강화하는 속성을 지정할 수 있다.

* `Secure`
  * 쿠키는 원래 `HTTP`, `HTTPS`를 구분하지 않고 전송
  * `Secure` 속성을 지정하면 `HTTPS`에서만 쿠키가 전송됨
* `HttpOnly`
  * 자바스크립트 코드에서 쿠키에 접근이 가능한데 이를 막기 위해 `HttpOnly` 속성을 지정(XSS 공격 방지)
  * HTTP 전송에만 쿠키를 사용할 수 있게 됨
* `SameSite`
  * `SameSite` 속성을 지정하면 `SameSite` 속성에 지정한 도메인과 같은 도메인에서만 쿠키가 전송됨
  * `SameSite=Strict` : 동일한 도메인에서만 쿠키가 전송됨

**참고자료**

* [HTTP 완벽 가이드](https://kobic.net/book/bookInfo/view.do?isbn=9788966261208)
* [그림으로 배우는 HTTP & Network Basic](https://kobic.net/book/bookInfo/view.do?isbn=9788931447897)
