Para o meu processo de autenticação, crio um token exclusivo quando um usuário efetua login e o coloco em um cookie usado para autenticação.
Então, eu enviava algo assim do servidor:
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/;
O que funciona em todos os navegadores. Em seguida, para excluir um cookie, envio um cookie semelhante com o expires
campo definido para 1º de janeiro de 1970
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/; expires=Thu, Jan 01 1970 00:00:00 UTC;
E isso funciona bem no Firefox, mas não exclui o cookie no IE ou Safari.
Então, qual é a melhor maneira de excluir um cookie (sem JavaScript de preferência)? O método definir como expirar no passado parece volumoso. E também por que isso funciona no FF, mas não no IE ou no Safari?
Respostas:
Enviar o mesmo valor de cookie com
; expires
anexado não destruirá o cookie.Invalide o cookie definindo um valor vazio e inclua também um
expires
campo:Observe que você não pode forçar todos os navegadores a excluir um cookie. O cliente pode configurar o navegador de forma que o cookie persista, mesmo que tenha expirado. Definir o valor conforme descrito acima resolveria esse problema.
fonte
"deleted"
, à confusão evitar mais tarde, com um valor potencialmente legal equivale a "excluído"foo=bar; domain=www.example.com
, um outro cookiefoo=qux; domain=.example.com
será usado.No momento em que escrevi esta resposta, a resposta aceita para essa pergunta parece indicar que os navegadores não precisam excluir um cookie ao receber um cookie de substituição cujo
Expires
valor estava no passado. Essa afirmação é falsa. DefinirExpires
como no passado é a maneira padrão e compatível com as especificações de excluir um cookie, e os agentes do usuário são obrigados pelas especificações a respeitá-lo.O uso de um
Expires
atributo no passado para excluir um cookie está correto e é a maneira de remover cookies ditados pelas especificações. A seção de exemplos da RFC 6255 declara:A seção Requisitos do agente do usuário inclui os seguintes requisitos, que juntos têm o efeito de que um cookie deve ser imediatamente eliminado se o agente do usuário receber um novo cookie com o mesmo nome cuja data de validade esteja no passado
Os pontos 11-3, 11-4 e 12 acima juntos significam que quando um novo cookie é recebido com o mesmo nome, domínio e caminho, o cookie antigo deve ser eliminado e substituído pelo novo cookie. Por fim, o ponto abaixo sobre cookies expirados determina ainda que, após isso, o novo cookie também deverá ser despejado imediatamente. A especificação não oferece espaço de manobra para os navegadores neste ponto; se um navegador oferecer ao usuário a opção de desativar a expiração de cookies, como a resposta aceita sugere que alguns navegadores o façam, isso viola as especificações. (Esse recurso também teria pouco uso e, tanto quanto eu sei, ele não existe em nenhum navegador.)
Por que, então, o OP desta pergunta observou essa abordagem falhando? Embora eu não tenha espanado uma cópia do Internet Explorer para verificar seu comportamento, suspeito que tenha sido porque o
Expires
valor do OP estava malformado! Eles usaram este valor:No entanto, isso é sintaticamente inválido de duas maneiras.
A seção de sintaxe da especificação determina que o valor do
Expires
atributo deve ser umSeguindo o segundo link acima, encontramos isso como um exemplo do formato:
e descobrir que a definição de sintaxe ...
exige que as datas sejam escritas no formato dia mês ano , não no formato mês dia ano , conforme usado pelo solicitante da pergunta.
Especificamente, ele define da
rfc1123-date
seguinte maneira:e define
date1
assim:e
não permite
UTC
como fuso horário.A especificação contém a seguinte declaração sobre quais compensações de fuso horário são aceitáveis nesse formato:
Além disso, se aprofundarmos nas especificações originais desse formato de data e hora, descobrimos que em suas especificações iniciais em https://tools.ietf.org/html/rfc822 , a seção Sintaxe lista "UT" (que significa "tempo universal" ) como um valor possível, mas não lista o UTC (Tempo Universal Coordenado) como válido. Até onde eu sei, o uso de "UTC" neste formato de data nunca foi válido; não era um valor válido quando o formato foi especificado pela primeira vez em 1982, e a especificação HTTP adotou uma versão estritamente mais restritiva do formato ao proibir o uso de todos os valores de "zona" que não sejam "GMT".
Se o autor da pergunta aqui tiver usado um
Expires
atributo como este , então:então, presumivelmente, teria funcionado.
fonte
Definir "expira" para uma data anterior é a maneira padrão de excluir um cookie.
Seu problema é provavelmente porque o formato da data não é convencional. O IE provavelmente espera apenas GMT.
fonte
Use Idade máxima = -1 em vez de "Expira". É mais curto, menos exigente quanto à sintaxe e a Max-Age tem precedência sobre o Expirar de qualquer maneira.
fonte
Para a implementação JAX-RS do GlassFish Jersey, resolvi esse problema pelo método comum, descrevendo todos os parâmetros comuns. Pelo menos três dos parâmetros devem ser iguais: nome (= "nome"), caminho (= "/") e domínio (= nulo):
E use-o da maneira comum de definir cookies:
e para excluir o cookie:
fonte
Max-Age
como a data e hora mais antiga representável, mas os servidores são proibidos de enviar esseMax-Age
valor. Eu acho que os autores conheciam os clientes existentes que não podiam manipularMax-Age=0
e os servidores que os enviaram no momento em que escreveram as especificações, e tentaram mitigar o problema dos dois lados.