http - secure - Maneira correta de excluir cookies do lado do servidor




set-cookie header (3)

A definição de "expira" para uma data passada é a maneira padrão de excluir um cookie.

Seu problema é provavelmente porque o formato de data não é convencional. O IE provavelmente espera apenas GMT.

Para meu processo de autenticação, eu crio um token exclusivo quando um usuário faz o login e o coloca em um cookie que é usado para autenticação.

Então eu enviaria algo assim do servidor:

Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/;

Que funciona em todos os navegadores. Em seguida, para excluir um cookie, envio um cookie semelhante com o campo de expires 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 no Safari.

Então, qual é a melhor maneira de excluir um cookie (sem JavaScript, de preferência)? O método set-the-expires-in-the-past parece volumoso. E também por que isso funciona no FF, mas não no IE ou no Safari?


Enviando o mesmo valor de cookie com ; expires ; expires acrescentados não destruirão o cookie.

Invalide o cookie definindo um valor vazio e inclua também um campo de expires :

Set-Cookie: token=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT

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 esteja expirado. Definir o valor conforme descrito acima resolveria esse problema.


Para a implementação do GlassFish Jersey JAX-RS, resolvi esse problema pelo método comum que descreve todos os parâmetros comuns. Pelo menos três dos parâmetros devem ser iguais: nome (= "nome"), caminho (= "/") e domínio (= nulo):

public static NewCookie createDomainCookie(String value, int maxAgeInMinutes) {
    ZonedDateTime time = ZonedDateTime.now().plusMinutes(maxAgeInMinutes);
    Date expiry = time.toInstant().toEpochMilli();
    NewCookie newCookie = new NewCookie("name", value, "/", null, Cookie.DEFAULT_VERSION,null, maxAgeInMinutes*60, expiry, false, false);
    return newCookie;
}

E use a maneira comum de definir o cookie:

NewCookie domainNewCookie = RsCookieHelper.createDomainCookie(token, 60);
Response res = Response.status(Response.Status.OK).cookie(domainNewCookie).build();

e para excluir o cookie:

NewCookie domainNewCookie = RsCookieHelper.createDomainCookie("", 0);
Response res = Response.status(Response.Status.OK).cookie(domainNewCookie).build();




cookies