- 웹의 장바구니 같은 경우 특정 사용자만의 데이터를 어떻게 서버에 전달할 수 있는가?
- 즉, 두 요청이 동일한 브라우저를 통해 전달되었는가를 확인할 방법이 있는가?
쉬운 방법으로 페이지 요청 시 토큰을 페이지에 삽입하고,
다음 요청 시 해당 토큰을 다시 전달할 수 있을것이다.
이를 위해서는 토큰이 포함된 숨겨진 필드가 있는 양식을 사용하거나 토큰을 URL 쿼리 문자열의 일부로 전달해야하는데,
이는 모두 철저한 수동 작업이며, 오류가 발생하기 쉽다.
이러한 상태 관리의 필요성으로 인해 쿠키가 처음 등장하게 된다.
HTTP 쿠키는 서버가 사용자의 웹 브라우저에 전송하는 데이터 조각이다.
브라우저는 이를 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송한다.
즉, 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용합니다.
이를 이용하면 사용자의 로그인 상태를 유지할 수 있습니다. 상태가 없는(stateless) HTTP 프로토콜에서 상태 정보를 기억시켜주기 때문입니다.
쿠키는 주로 세 가지 목적(세션 관리, 개인화, 트래킹)을 위해 사용한다.
서버에 저장해야 할 로그인, 장바구니, 게임 스코어 등의 정보 관리
사용자 선호, 테마 등의 세팅
사용자 행동을 기록, 분석하는 용도
쿠키 데이터는
<이름>=<값> 의 형태를 지닌 단순 문자열이다.
서버와 브라우저는 HTTP 메시지 안에 이 쿠키 데이터를 담아 주고받게 된다.
HTTP 요청을 수신할 때, 서버는 응답과 함께
Set-Cookie 헤더를 전송할 수 있다.
이때 Set-Cookie 응답 헤더에는 하나의 쿠키만 담을 수 있어 여러 쿠키를 보낼 경우
Set-Cookie: <이름>=<값>
Set-Cookie: <이름>=<값>
Set-Cookie: <이름>=<값>
위와 같이 전송할 수 있다.
이처럼 서버로 부터 쿠키를 응답 받은 브라우저는
해당 쿠키를 저장한다.
이후 브라우저가 동일한 서버에 요청할 때 저장된 쿠키를 Cookie 헤더를 사용해
요청 헤더에 실어서 보낸다.
Cookie 요청 헤더는 아래와 같은 형태를 가지며, 여러 쿠키를 ;을 통해 구분한다.
Cookie: <이름>=<값>; <이름>=<값>; <이름>=<값>;
서버로 전송되는 모든 요청과 함께,
브라우저는 Cookie 헤더를 사용해 이전에 저장해둔 모든 쿠키들을 회신한다.
즉, 쿠키라는 매커니즘을 통해 데이터를 저장해둔 데이터를
해당 브라우저에서 요청이 들어올 때 함께 받아올 수 있는것이다.
앞서 살펴본 바와 같이 브라우저는 일정 시간동안 서버로 쿠키를 돌려 보내는데,
브라우저가 쿠키를 어느시간 동안 돌려 보내야하는지는 서버가 맨 처음 쿠키를 보낼 때 결정을 하며, Set-Cookie 응답 헤더를 통해 명시한다.
이를 쿠키의 라이프타임이라 하며,
쿠키의 라이프 타임은 두 가지 방법으로 정의할 수 있다.
- 세션 쿠키
- permanent 쿠키
유효 기간이 별도로 명시되지 않은 쿠키를 보통 세션 쿠키(session cookie)라고 부르는데 브라우저의 세션이 종료될 때 함께 만료된다.
즉, 브라우저의 탭이나 윈도우를 닫으면 서버가 보냈던 쿠키는 모두 만료되어 브라우저는 더 이상 해당 쿠키를 서버에 돌려 보내지 않습니다.
유효 기간이 명시되어 있는 쿠키인
영속 쿠키(permanent cookie)는 Expires 속성에 명시된 날짜에 삭제되거나,
Max-Age 속성에 명시된 기간 까지 유효하다.
Set-Cookie: <쿠키 이름>=<쿠키 값>; Expires=종료 시점
Set-Cookie: <쿠키 이름>=<쿠키 값>; Max-Age=유효 기간
브라우저는 기본적으로는 쿠키를 보낸 서버가 속한 도메인으로만 쿠키를 돌려 보내지만
Domain, Path 속성을 통해
어떤 URL을 방문할 때 해당 쿠키를 보내야할지 더 정확히 제어할 수 있다.
Set-Cookie 응답 헤더에 Domain 속성을 명시하여, 서브 도메인까지 쿠키 범위가 확장 되도록 할 수 있다.
만약 Domain=baggy.com이 설정되면,
a.baggy.com 으로 부터 받은 쿠키를 b.baggy.com으로 쿠키를 보냄으로써
서브도메인이 쿠키를 공유하게 된다.
반면 Set-Cookie 응답 헤더에 Path 속성을 명시하면 쿠키의 범위를 해당 도메인의 특정 경로로 축소시킬 수 있다.
(Path는 헤더 전송을 위해 요청되는 URL 내에 반드시 존재해야하는 URL 경로)
예를 들어, Path=/users라고 설정되어 있는 쿠키는,
브라우저가 /users를 포함한 하위 경로로 요청을 할 때만 서버로 돌려 보냅니다.
다른 속성과 달리 플래그일 뿐이며, 추가 값이 지정되지 않는다.
Secure Cookie는 SSL 및 HTTPS 프로토콜을 사용해 요청하는 경우에만 서버로 전달된다.
하지만 실제로 쿠키 메커니즘이 본질적으로 안전하지 않기 때문에 기밀 정보나 민감한 정보의 경우 쿠키에 저장 및 전송해서는 안된다.
출처
MDN web docs