http - secure - Maneira correta de excluir cookies do lado do servidor
set-cookie header (3)
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?
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.
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();