Cookies são pequenos arquivos de texto armazenados no navegador do cliente, usados para manter informações entre requisições HTTP, como preferências de usuário, carrinhos de compra ou sessões. Em PHP, o gerenciamento de cookies é feito principalmente com a função setcookie() e a superglobal $_COOKIE. Nesta aula, veremos como criar, ler e configurar cookies com segurança.

É importante entender que cookies são enviados pelo servidor no cabeçalho HTTP Set-Cookie e armazenados pelo navegador. Nas requisições subsequentes, o navegador envia de volta o cookie no cabeçalho Cookie. PHP automaticamente disponibiliza esses valores em $_COOKIE.

setcookie

A função setcookie() define um cookie a ser enviado ao navegador. Sua sintaxe básica é:

setcookie(string $name, string $value = "", int $expires_or_options = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false): bool

O primeiro parâmetro é o nome do cookie, e o segundo é o valor. O terceiro parâmetro define o tempo de expiração (timestamp Unix). Se omitido (0), o cookie expira ao fechar o navegador (cookie de sessão). Os demais parâmetros controlam escopo e segurança.

Exemplo básico:

Neste exemplo, o cookie é válido para todo o site (path "/") e expira após 3600 segundos (1 hora). A função deve ser chamada antes de qualquer saída HTML, pois envia cabeçalhos HTTP.

Lendo cookies

Para ler um cookie enviado pelo navegador, usa-se a superglobal $_COOKIE, que é um array associativo. O valor está disponível apenas após a requisição seguinte ao envio do cookie (o cookie não está disponível na mesma requisição em que foi definido).

Exemplo de leitura:

É sempre recomendável verificar se o índice existe com isset() para evitar warnings. Lembre-se: o valor do cookie é texto; se precisar de arrays, serialize ou use JSON.

Tempo de vida

O tempo de vida de um cookie é controlado pelo parâmetro expires_or_options (timestamp Unix). Se definido como 0 ou omitido, o cookie é temporário (expira ao fechar o navegador). Valores positivos definem uma data futura.

Exemplos:

Para remover um cookie, defina seu valor como "" e expiração no passado (ex.: time() - 3600).

Segurança (HttpOnly, Secure)

Cookies podem conter informações sensíveis, então o PHP oferece flags de segurança:

  • Secure: O cookie só é enviado em conexões HTTPS. Impede interceptação em redes não seguras.
  • HttpOnly: O cookie não é acessível via JavaScript (document.cookie), mitigando ataques XSS.
  • SameSite: Controla envio em requisições cross-site (não é parâmetro direto, mas pode ser configurado via array de opções).

No PHP 7.3+, você pode passar um array associativo como terceiro parâmetro para maior clareza:

 time() + 3600,
    'path' => '/',
    'domain' => 'exemplo.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict' // ou 'Lax', 'None'
]);
?>

Recomenda-se sempre usar httponly e secure (se HTTPS) para cookies de autenticação. O atributo SameSite ajuda a prevenir CSRF.

Boas práticas

  • Nunca armazene senhas ou dados extremamente sensíveis em cookies; prefira sessões no servidor.
  • Valide e sanitize valores de cookies ao ler, pois podem ser manipulados pelo cliente.
  • Use prefixos como __Host- ou __Secure- para cookies com escopo restrito (não abordado em detalhes, mas relevante).
  • Sempre defina um path e, se possível, um domínio específico para evitar vazamentos.

Referências

Exercícios

  1. Crie um script PHP que defina um cookie chamado cor_fundo com valor azul que expire em 2 dias. Em seguida, leia o cookie e exiba uma mensagem.

    ✓ Resposta:
    
    
    
    
    
    
    
  2. Escreva um código que remova o cookie usuario (definido anteriormente) definindo-o com expiração no passado.

    ✓ Resposta:
  3. Explique por que um cookie definido com setcookie() não está disponível em $_COOKIE na mesma requisição.

    ✓ Resposta:

    Porque o cookie é enviado ao navegador no cabeçalho HTTP da resposta, e só estará disponível na próxima requisição, quando o navegador o envia de volta no cabeçalho da requisição. $_COOKIE reflete os cookies recebidos na requisição atual, não os que acabaram de ser definidos.

  4. Crie um script que defina um cookie seguro (Secure) e HttpOnly, com nome sessao_id, valor abc123, válido por 1 hora, path /, e SameSite Lax. Use a sintaxe de array.

    ✓ Resposta:
     time() + 3600,
        'path' => '/',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'Lax'
    ]);
    ?>
  5. Qual a diferença entre um cookie de sessão (expira ao fechar o navegador) e um cookie persistente? Dê um exemplo de uso para cada.

    ✓ Resposta:

    Cookie de sessão é armazenado apenas na memória do navegador e é deletado quando o navegador é fechado. Exemplo: manter o status de login temporário. Cookie persistente tem data de expiração definida e permanece no disco do usuário até expirar ou ser removido. Exemplo: lembrar preferências de tema por semanas.