Tudo o que Você Precisa Saber Sobre Cookies em PHP: Funcionamento, Leitura e Boas Práticas

Cookies são uma ferramenta essencial no desenvolvimento web, permitindo que informações sejam armazenadas no navegador do usuário e acessadas em requisições subsequentes. No PHP, o uso de cookies é simples, mas há nuances importantes que podem gerar confusão, especialmente para iniciantes.

Neste post, você aprenderá como os cookies funcionam, por que eles só podem ser lidos na segunda requisição, e verá exemplos e boas práticas para usá-los de forma eficaz e segura.


O que são cookies?

Cookies são pequenos arquivos de texto armazenados pelo navegador no dispositivo do usuário. Eles são utilizados para manter informações persistentes entre requisições HTTP, como:

  • Dados de autenticação.
  • Preferências do usuário.
  • Informações de rastreamento ou personalização.

No PHP, os cookies são manipulados através das variáveis superglobais $_COOKIE e da função setcookie().


Como os cookies funcionam no PHP?

Definindo cookies com setcookie()

A função setcookie() é usada para definir cookies. Sua sintaxe é a seguinte:

setcookie(name, value, expire, path, domain, secure, httponly);
ParâmetroDescrição
nameNome do cookie.
valueValor do cookie. Pode ser string, mas deve ser codificado se incluir caracteres especiais.
expireData de expiração do cookie (em timestamp UNIX). Use 0 para torná-lo temporário.
pathCaminho onde o cookie estará disponível (ex.: / para todo o site).
domainDomínio para o qual o cookie é válido (ex.: .exemplo.com).
securePermite enviar o cookie apenas em conexões HTTPS.
httponlyImpede o acesso ao cookie por JavaScript, aumentando a segurança.

Exemplo básico:

<?php
setcookie('usuario', 'Devdata', time() + 3600, '/'); // Cookie válido por 1 hora
echo "Cookie definido!";
?>

Ciclo de vida dos cookies

  1. Primeira requisição: Ao usar setcookie(), o PHP instrui o navegador a armazenar o cookie. Isso é feito através de um cabeçalho HTTP enviado na resposta. ⚠️ Nota: O valor do cookie não estará disponível imediatamente em $_COOKIE na mesma requisição. Ele só será acessível após a próxima interação do navegador com o servidor.
  2. Segunda requisição: O navegador envia o cookie ao servidor como parte da próxima requisição HTTP. Nesse momento, ele pode ser acessado via $_COOKIE.

Exemplo para entender:

<?php
setcookie('meuCookie', 'valor123', time() + 3600, '/'); // Define o cookie

if (isset($_COOKIE['meuCookie'])) {
    echo "Cookie disponível: " . $_COOKIE['meuCookie'];
} else {
    echo "Cookie ainda não está disponível.";
}
?>

Resultado:

  • Na primeira requisição, o cookie ainda não estará disponível.
  • Na segunda requisição, o cookie será lido corretamente.

Por que os cookies só podem ser lidos na segunda requisição?

Essa limitação acontece porque o protocolo HTTP separa claramente as responsabilidades do cliente (navegador) e do servidor:

  • Quando o servidor usa setcookie(), ele envia a instrução ao navegador para salvar o cookie. Esse processo ocorre no lado do cliente e não altera o conteúdo de $_COOKIE diretamente.
  • Na próxima requisição, o navegador inclui os cookies armazenados como parte do cabeçalho da requisição HTTP. Apenas então eles ficam disponíveis no servidor.

Melhores práticas ao usar cookies

1. Sempre defina o tempo de expiração

Defina uma data de expiração adequada para os cookies com base em seu propósito. Para cookies temporários, use 0.

setcookie('temporario', 'valor', 0, '/');

2. Use cookies com segurança

  • HTTPS: Use o parâmetro secure para garantir que o cookie seja transmitido apenas em conexões seguras.
  • HttpOnly: Adicione o parâmetro httponly para impedir que scripts no lado do cliente (JavaScript) acessem o cookie.
setcookie('seguro', 'valor', time() + 3600, '/', '', true, true);

3. Combine cookies com sessões

Se precisar de valores imediatamente, armazene-os em uma sessão enquanto espera que o cookie esteja disponível.

session_start();
setcookie('usuario', 'Devdata', time() + 3600, '/');
$_SESSION['usuario'] = 'Devdata';

4. Redirecione após definir cookies

Se o comportamento esperado requer acesso imediato ao cookie, você pode redirecionar o usuário para garantir que o cookie seja lido.

setcookie('usuario', 'Devdata', time() + 3600, '/');
header("Location: " . $_SERVER['REQUEST_URI']);
exit;

Resolvendo problemas comuns

“Meu cookie não está sendo lido imediatamente!”

Lembre-se: Cookies só podem ser lidos na próxima requisição. Use sessões como fallback ou redirecione após definir o cookie.

“Como excluir um cookie corretamente?”

Para excluir um cookie, defina seu tempo de expiração para o passado:

setcookie('meuCookie', '', time() - 3600, '/');

Conclusão

Os cookies são uma ferramenta poderosa para armazenar informações entre requisições, mas é importante entender como funcionam para evitar erros e falhas de segurança. Ao combinar cookies com boas práticas, como o uso de secure, httponly e sessões, você pode garantir uma experiência de usuário confiável e segura.

Rolar para cima