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ê!”
1. O que é um cookie?
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.
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
// 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()
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
// 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
]);
?>
setcookie — as chaves nomeadas tornam muito mais difícil confundir a ordem dos parâmetros.
3. Lendo cookies: $_COOKIE
<?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
// 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}!";
}
?>
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
// 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
?>
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
// 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
// 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>
▶ Exemplo: Seletor de temas
<?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>
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 |
❓ 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$_COOKIEainda não exibe o valor. R: Um cookie definido porsetcookie()não fica visível em$_COOKIEdurante 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
httponlypara impedir que o JavaScript os leia.
📖 Resumo
- Os cookies são um sistema de armazenamento de pares chave-valor no navegador, enviado automaticamente a cada solicitação
setcookie(name, value, expire, path)cria um cookie- Defina a data de validade como um carimbo de data/hora passado para excluir um cookie
$_COOKIEarmazena os cookies enviados com a solicitação atual (os cookies recém-definidos exigem uma atualização)httponly(bloqueia JS),secure(somente HTTPS) esamesite(proteção contra CSRF) são sinalizadores de segurança essenciais- Os cookies têm um limite de 4 KB, podem ser modificados pelo usuário e são mais adequados para dados pequenos e não confidenciais
📝 Exercícios
- 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.
- 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.
- 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).



