Cookies em PHP

O HTTP é um protocolo sem estado — o servidor não se lembra de quem você é entre uma solicitação e outra. Os cookies resolvem isso: o servidor envia ao seu navegador uma pequena nota adesiva e, na próxima vez que o navegador voltar com ela, o servidor diz: “Ah, é você!”

Um cookie é um pequeno arquivo de dados (≤ 4 KB) que o servidor solicita ao navegador para que seja armazenado no computador do usuário. O navegador o reenvia automaticamente a cada solicitação subsequente.

TEXT
First visit:
  Browser → Server: Hello!
  Server → Browser: Here's a cookie: user=John
Next visit:
  Browser → Server: Hello, here's my cookie: user=John
  Server: Ah, John — your cart is still here!
PHP
<?php
// Create a cookie
setcookie("username", "John", time() + 3600, "/");

// Read a cookie
echo $_COOKIE['username'] ?? 'Guest';  // John (persists after refresh)
?>

2. Parâmetros da função setcookie()

PHP
setcookie(
    string $name,        // Cookie name
    string $value = "",  // Cookie value
    int $expires = 0,    // Expiry (Unix timestamp; 0 = expires when browser closes)
    string $path = "",   // Path scope ("/" = entire site)
    string $domain = "", // Domain scope
    bool $secure = false,          // HTTPS only
    bool $httponly = false         // Inaccessible to JavaScript
);
PHP
<?php
// Simplest cookie (deleted when the browser closes)
setcookie("visit_count", "1");

// Cookie that expires in 1 hour
setcookie("username", "John", time() + 3600, "/");

// Cookie that expires in 7 days
setcookie("remember_token", "abc123", time() + 86400 * 7, "/");

// Secure cookie (HTTPS only, JS can't read it)
setcookie("session_id", "xyz789", [
    'expires'  => time() + 3600,
    'path'     => '/',
    'secure'   => true,   // HTTPS only
    'httponly' => true,   // Blocks XSS-based theft
    'samesite' => 'Lax'   // Mitigates CSRF
]);
?>
💡 Dica: O PHP 7.3+ recomenda a assinatura no estilo de array setcookie — as chaves nomeadas tornam muito mais difícil confundir a ordem dos parâmetros.


PHP
<?php
$username = $_COOKIE['username'] ?? 'Guest';
echo "Welcome, {$username}!";

// $_COOKIE is a superglobal associative array
print_r($_COOKIE);
// Array ( [username] => John [visit_count] => 5 )
?>

▶ Exemplo: Contador de visitas

PHP
<?php
// First visit
if (!isset($_COOKIE['visit_count'])) {
    setcookie('visit_count', 1, time() + 86400 * 30, "/");
    echo "Welcome — this is your first visit!";
} else {
    $count = (int)$_COOKIE['visit_count'] + 1;
    setcookie('visit_count', $count, time() + 86400 * 30, "/");
    echo "This is visit #{$count}!";
}
?>
▶ Experimente

4. Exclusão de cookies

Não existe uma função específica para “excluir cookies” — para excluir um cookie, basta definir sua data de validade para uma data anterior:

PHP
<?php
// Delete a cookie
setcookie("username", "", time() - 3600, "/");
// Expiry in the past → browser discards it

// unset only removes $_COOKIE from the current request — the browser still has the cookie
unset($_COOKIE['username']);
// This only affects the current script; after a refresh, the cookie is back
?>
🔥 Erro comum: setcookie("name", "", time() - 3600) é o que realmente remove o cookie do navegador. unset($_COOKIE['name']) apenas limpa a variável para a solicitação atual.


5. Atributos de segurança dos cookies

Atributo Finalidade Recomendação
httponly O JavaScript não consegue ler o cookie (impede o roubo por XSS) ✅ Sempre ativar
secure Transmitido apenas por HTTPS ✅ Ativar em produção
samesite Enviado apenas em solicitações no mesmo site (mitiga CSRF) Lax ou Strict
path Limita o cookie a um caminho específico "/" para todo o site
PHP
<?php
// Secure cookie template
setcookie("user_token", $token, [
    'expires'  => time() + 86400 * 30,
    'path'     => '/',
    'secure'   => isset($_SERVER['HTTPS']),
    'httponly' => true,
    'samesite' => 'Lax'
]);
?>

6. Exemplos reais de cookies

▶ Exemplo: Lembrar-me

PHP
<?php
// remember.php
$savedName = $_COOKIE['saved_username'] ?? '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = trim($_POST['username'] ?? '');
    $remember = isset($_POST['remember']);
    
    if ($remember) {
        // "Remember me" — store for 30 days
        setcookie('saved_username', $username, time() + 86400 * 30, '/');
    } else {
        // Don't remember — delete the cookie
        setcookie('saved_username', '', time() - 3600, '/');
    }
    
    echo "<h3>Welcome back, {$username}!</h3>";
}
?>

<form method="POST">
    <input type="text" name="username"
           value="<?= htmlspecialchars($savedName) ?>"
           placeholder="Enter your username">
    <label>
        <input type="checkbox" name="remember"> Remember me
    </label>
    <button type="submit">Log In</button>
</form>
▶ Experimente

▶ Exemplo: Seletor de temas

PHP
<?php
// theme.php
$theme = $_COOKIE['theme'] ?? 'light';

if (isset($_GET['theme'])) {
    $theme = $_GET['theme'] === 'dark' ? 'dark' : 'light';
    setcookie('theme', $theme, time() + 86400 * 365, '/');
}
?>
<!DOCTYPE html>
<html>
<head>
    <style>
        body.dark    { background: #222; color: #eee; }
        body.light   { background: #fff; color: #333; }
    </style>
</head>
<body class="<?= $theme ?>">
    <h2>Current theme: <?= $theme === 'dark' ? 'Dark' : 'Light' ?></h2>
    <a href="?theme=dark">Dark Mode</a> |
    <a href="?theme=light">Light Mode</a>
</body>
</html>
▶ Experimente

7. Limitações dos cookies

Limite Valor
Tamanho por cookie ≤ 4096 bytes (4 KB)
Cookies por domínio ~20–50 (varia de acordo com o navegador)
Tamanho total dos cookies ~8 KB no total
Segurança Armazenado em texto simples; os usuários podem visualizar e modificar
Transmissão Enviado automaticamente em cada solicitação HTTP
💡 Dica: Os cookies são ideais para dados pequenos e não confidenciais (como lembrar um nome de usuário ou a preferência de tema). Para dados maiores ou confidenciais, use sessões (próxima lição). Para persistência de longo prazo, use um banco de dados.

❓ Perguntas Frequentes

P: Qual é a diferença entre um cookie e uma sessão? R: Os cookies ficam armazenados no navegador; as sessões ficam no servidor. Os cookies têm tamanho limitado e podem ser modificados pelo usuário; as sessões são mais seguras, mas consomem recursos do servidor. Use sessões para o estado de login; use cookies para a opção “lembrar-me” e preferências.

P: Eu chamei setcookie(), mas $_COOKIE ainda não exibe o valor. R: Um cookie definido por setcookie() não fica visível em $_COOKIE durante a mesma solicitação. Ele só aparece na próxima solicitação (após a atualização da página). É assim que os cookies HTTP funcionam.

P: Os usuários podem alterar os cookies? R: Sim! Os cookies ficam armazenados no computador do usuário, portanto, os usuários podem modificá-los livremente. Nunca armazene dados confidenciais, como senhas, em um cookie sem criptografia. No mínimo, use httponly para impedir que o JavaScript os leia.

📖 Resumo

📝 Exercícios

  1. Implementar o recurso “Lembrar-me”: um formulário de login com uma caixa de seleção que, quando marcada, preenche automaticamente o campo do nome de usuário na próxima visita.
  2. Criar um seletor de tema: permitir que os usuários alternem entre os modos claro e escuro em uma página, salvar a escolha em um cookie e aplicá-la nas visitas seguintes.
  3. Crie um recurso “Vistos recentemente”: use um cookie para armazenar os IDs dos últimos 5 artigos que o usuário visualizou (armazene como uma sequência de caracteres separada por vírgulas).
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%