참고: https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies
HTTP 쿠키 명세: https://tools.ietf.org/html/rfc6265
Overview
HTTP 쿠키는 서벅가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각이다. 브라우저는 서버에게서 전송받은 쿠키를 저장했다가 동일한 서버에 재요청시 함께 전송한다.
쿠키는 주로 동일한 브라우저에서 들어왔는지 아닌지 판단할 때 사용한다. 그 외에도 세션관리, 개인화 서비스, 트래킹 목적으로 사용된다.
Cookie 생성
HTTP 요청 수신시 서버는 응답과 함께 Set-Cookie 헤더를 전송할 수 있다. 쿠키는 보통 브라우저에 저장되며 같은 서버에 보내는 요청은 Cookie라는 헤더를 통해 Cookie를 전송한다.
Set-Cookie
참고: https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Set-Cookie
Set-Cookie HTTP 응답 헤더는 서버에서 사용자에게 전송된다. key=value형식을 띄며 Set-Cookie하나당 하나의 쿠키를 설정할 수 있다. Set-Cookie: key=value; HttpOnly와 같이 쿠키를 설정한다.
key=value 뒤에 있는 값들은 해당 쿠키에 대한 속성을 정의한 것이다. 쿠키에 지정할 수 있는 속성은 다음과 같다.
-
Expires
쿠키의 최대 생존 시간을 정의한 속성으로 Date 형식이 온다. 지정되지 않으면 세션 쿠키로 취급되며 클라이언트 종료시 폐기된다. 만료 시간이 지정되면 Date 값은 서버 기준이 아닌 클라이언트에 상대적인 값으로 취급된다.
-
Max-Age
쿠키가 만료될 때까지의 시간. 0 또는 음수가 지정되면 즉시 만료를 의미한다. 값은 숫자로 표현하며 초 단위로 계산된다. IE8 이하에서는 이 헤더를 지원하지 않으며 최신 브라우저에서는 Expires와 Max-Age 둘 다 지정되었을 때 Max-Age를 우선한다.
-
Domain
쿠키가 적용되야하는 호스트를 지정. 지정하지 않으면 현재 URI를 기준으로 적용되지만 서브 도메인을 포함하지 않는다. 도메인이 지정되면 서브 도메인들은 항상 포함된다.
-
Path
쿠키 헤더를 보내기 전에 요청 된 리소스에 있어야하는 URL 경로를 나타낸다. 즉, Path에 지정된 값과 일치하는 URL 요청에 대해 쿠키를 전송하도록 만드는 옵션. 하위 디렉터리에도 모두 적용된다.
즉, Path=/으로 지정하면 /이하의 모든 경로에 쿠키가 전송된다.
-
Secure
보안 쿠키를 적용하는 옵션. 위 속성은 값을 적지 않고 Secure만으로 적용할 수 있다. 서버에서 요청이 SSL을 사용하며 Https를 사용할 때만 전송할 수 있다.
-
HttpOnly
HttpOnly 속성은 Javascript를 통해서 쿠키에 접근할 수 없도록 설정하는 속성이다. 이를 통해 XSS를 막을 수 있으므로 반드시 설정하는 것이 좋다. Secure와 마찬가지로 HttpOnly 속성만 기입하면 된다.
-
SameSite
서버가 사이트 간 요청시에 쿠키를 보내서는 안된다고 설정하는 방식으로 CSRF 공격을 어느정도 보호할 수 있는 방법이다. 값으로는 Strict와 Lax가 있다.
- Strict
- Lax
단, SameSite 속성은 실험 중인 속성으로 모든 브라우저에서 지원하지는 않는다.
Set-Cookie 예시
Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/
위는 HttpOnly와 Path가 / 설정된 sessionId의 쿠키이다.
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
위는 영속쿠키로 Expires에 정의한 날짜 전에는 사라지지 않는 쿠키이다.
Cookie Prefix
Cookie의 Prefix는 __Secure-와 __Host-를 지원한다. 단, Secure 속성이 설정되어야 사용가능하다. 또한 __Host-는 Path가 /로 설정되어 있어야하며 Domain속성이 설정되어 있지 않아야한다. 클라이언트에서 위 쿠키 접두사를 구현하지 않으면 위 설정은 상관없이 쿠키는 항상 허용된다.
세션 쿠키 (Session Cookie) vs 영속 쿠키 (Parmanent Cookie)
웹 브라우저를 끄면 사라지는 쿠키를 세션 쿠키라고 말한다. 반면, 웹 브라우저를 꺼도 사라지지 않는 쿠키를 영속 쿠키라고 일컫는다.