Comportamento e Gerenciamento de Cookies em Aplicações Web

Persistência de Sessão e Compartilhamento de Cookies entre Navegadores

O gerenciamento de cookies é um aspecto crítico do desenvolvimento web, influenciando diretamente como as sessões de usuário são mantidas. Em navegadores modernos, como as versões atuais do Firefox e Chrome, assim como a partir do IE8, os cookies e sessões tendem a ser compartilhados entre diferentes abas e até mesmo janelas separadas do mesmo processo. Isso significa que, se um usuário fizer login em uma conta e abrir o mesmo site em outra aba para acessar uma conta diferente, o cookie da segunda sessão pode sobrescrever a primeira, gerando inconsistências no estado da aplicação.

Implementação de Cookies no Lado do Servidor (ASP.NET)

No ambiente C#, o gerenciamento de cookies é realizado através da classe HttpCookie. Existem duas formas principais de armazenar dados: valores simples ou coleções de pares chave-valor.

// Exemplo de Cookie com valor único
HttpCookie cookieSimples = new HttpCookie("usuario_id");
cookieSimples.Value = "98765";

// Exemplo de Cookie com múltiplos valores (Subkeys)
HttpCookie cookieConfig = new HttpCookie("preferencias");
cookieConfig.Values.Add("idioma", "pt-BR");
cookieConfig.Values.Add("tema", "escuro");

// Enviando os cookies na resposta HTTP
Response.Cookies.Add(cookieSimples);
Response.Cookies.Add(cookieConfig);

Ao inspecionar o tráfego HTTP, observamos o cabeçalho Set-Cookie enviando os dados para o cliente. É importante notar que, uma vez definido, o cookie será enviado pelo navegador em todas as requisições subsequentes que correspondam ao escopo de domínio e caminho (path) definidos.

Restrição de Escopo através da Propriedade Path

A propriedade Path define em quais diretórios do servidor o cookie estará disponível. Por padrão, se não for especificado, o cookie é acessível em toda a aplicação (path=/).

HttpCookie cookieSetorial = new HttpCookie("token_acesso");
cookieSetorial.Value = "ativo";
cookieSetorial.Path = Request.ApplicationPath + "/area_restrita";

Response.Cookies.Add(cookieSetorial);

Um detalhe técnico relevante é a sensibilidade a maiúsculas e minúsculas (case-sensitivity) do caminho em certos navgeadores. Se o Path to definido como /Sessao/, mas a URL acessada for /sessao/, o navegador pode falhar ao enviar o cookie de volta ao servidor.

Ciclo de Vida e Expiração

Cookies podem ser voláteis (mantidos apenas na memória do navegador) ou persistentes (armazenados no disco rígido do cliente). O que define esse comportamento é a propriedade Expires.

HttpCookie cookiePersistente = new HttpCookie("sessao_longa");
cookiePersistente.Value = "hash_seguro";

// Define a validade para 30 dias a partir de agora
cookiePersistente.Expires = DateTime.Now.AddDays(30);

Response.Cookies.Add(cookiePersistente);

Sem uma data de expiração, o cookie é removido assim que o processo do navegador é encerrado. Além disso, navegadores diferentes podem ter critérios distintos para validar a expiração: alguns comparam a data do cookie com o horário do servidor, enquanto outros utilizam o relógio local da máquina do cliente.

Escopo de Domínio e Compartilhamento entre Subdomínios

Por questões de segurança, um servidor só pode definir cookies para o seu próprio domínio. No entanto, é possível configurar cookies que sejam compartilhados entre um domínio principal e seus subdomínios através da propriedade Domain.

HttpCookie cookieGlobal = new HttpCookie("auth_global");
cookieGlobal.Value = "permissao_concedida";
// Torna o cookie acessível em app.meusite.com, loja.meusite.com, etc.
cookieGlobal.Domain = ".meusite.com";

Response.Cookies.Add(cookieGlobal);

Se houver colisão de nomes (por exemplo, um cookie "ID" definido para .meusite.com e outro para loja.meusite.com), o navegador enviará ambos no cabeçalho da requisição. O servidor receberá uma string contendo todos os valores, o que pode causar erros de parsing se a aplicação não estiver preparada para tratar múltiplos cookies com o mesmo identificador.

Manipulação de Cookies via JavaScript

No lado do cliente, o JavaScript pode ler e gravar cookies através da propriedade document.cookie. Diferente do servidor, que utiliza abstrações de objetos, no cliente a manipulação é feita diretamente através de strings formatadas.

// Definindo um cookie via script
var dataExpiracao = new Date();
dataExpiracao.setTime(dataExpiracao.getTime() + (24 * 60 * 60 * 1000)); // 1 dia

document.cookie = "cookie_cliente=valor_exemplo; expires=" + dataExpiracao.toUTCString() + "; path=/";

Vale ressaltar que cookies marcados como HttpOnly pelo servidor não podem ser acessados ou modificados via JavaScript, sendo esta uma prática recomendada para mitigar ataques de Cross-Site Scripting (XSS).

Tags: ASP.NET HTTP cookies Web-Security javascript

Publicado em 6-1 10:30 por Thomas