Na potrzeby procesu uwierzytelniania tworzę unikalny token, gdy użytkownik loguje się i umieszczam go w pliku cookie, który jest używany do uwierzytelniania.
Więc wysłałbym coś takiego z serwera:
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/;
Działa we wszystkich przeglądarkach. Następnie, aby usunąć plik cookie, wysyłam podobny plik cookie z expires
polem ustawionym na 1 stycznia 1970 r
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/; expires=Thu, Jan 01 1970 00:00:00 UTC;
Działa to dobrze w przeglądarce Firefox, ale nie usuwa pliku cookie w przeglądarce IE lub Safari.
Jaki jest więc najlepszy sposób na usunięcie pliku cookie (najlepiej bez JavaScript)? Metoda „set-the-expires-in-past” wydaje się nieporęczna. A także dlaczego to działa w FF, ale nie w IE czy Safari?
Odpowiedzi:
Wysłanie tej samej wartości pliku cookie z
; expires
dołączonym nie spowoduje zniszczenia pliku cookie.Unieważnij plik cookie, ustawiając pustą wartość i dołącz również
expires
pole:Pamiętaj, że nie możesz zmusić wszystkich przeglądarek do usunięcia pliku cookie. Klient może skonfigurować przeglądarkę w taki sposób, aby plik cookie trwał, nawet jeśli wygasł. Ustawienie wartości w sposób opisany powyżej rozwiązałoby ten problem.
źródło
"deleted"
foo=bar; domain=www.example.com
inny plik cookiefoo=qux; domain=.example.com
.W chwili, gdy piszę tę odpowiedź, przyjęta odpowiedź na to pytanie wydaje się wskazywać, że przeglądarki nie muszą usuwać pliku cookie w przypadku otrzymania zastępczego pliku cookie, którego
Expires
wartość należy do przeszłości. To twierdzenie jest fałszywe. UstawienieExpires
na przeszłość to standardowy, zgodny ze specyfikacją sposób usuwania pliku cookie, a oprogramowanie użytkownika jest wymagane przez specyfikację, aby go przestrzegać.Używanie
Expires
atrybutu w przeszłości do usuwania pliku cookie jest poprawne i jest sposobem usuwania plików cookie podyktowanym przez specyfikację. W sekcji przykładów dokumentu RFC 6255 podano :Sekcja Wymagania klienta użytkownika zawiera następujące wymagania, które łącznie powodują, że plik cookie musi zostać natychmiast usunięty, jeśli agent użytkownika otrzyma nowy plik cookie o tej samej nazwie, którego data ważności już minęła
Punkty 11-3, 11-4 i 12 powyżej razem oznaczają, że po otrzymaniu nowego pliku cookie o tej samej nazwie, domenie i ścieżce stary plik cookie musi zostać usunięty i zastąpiony nowym. Wreszcie poniższy punkt dotyczący wygasłych plików cookie dodatkowo mówi, że po wykonaniu tej czynności nowy plik cookie również musi zostać natychmiast usunięty. Specyfikacja nie daje w tej kwestii żadnego miejsca dla przeglądarek; gdyby przeglądarka oferowała użytkownikowi opcję wyłączenia wygaśnięcia plików cookie, jak sugeruje to akceptowana odpowiedź w niektórych przeglądarkach, byłoby to niezgodne ze specyfikacją. (Taka funkcja również byłaby mało przydatna i o ile wiem, nie istnieje w żadnej przeglądarce).
Dlaczego więc w PO w tym pytaniu stwierdzono, że podejście to zawodziło? Chociaż nie odkurzyłem kopii Internet Explorera, aby sprawdzić jego zachowanie, podejrzewam, że było to spowodowane
Expires
nieprawidłowym sformułowaniem wartości OP ! Użyli tej wartości:Jednak jest to niepoprawne składniowo z dwóch powodów.
Sekcja składni specyfikacji mówi, że wartością
Expires
atrybutu musi byćPodążając za drugim linkiem powyżej, znajdujemy to jako przykład formatu:
i przekonaj się, że definicja składni ...
wymaga, aby daty były zapisywane w formacie dzień miesiąc rok , a nie miesiąc dzień rok , jak jest to używane przez osobę zadającą pytania.
W szczególności definiuje
rfc1123-date
w następujący sposób:i definiuje w
date1
ten sposób:i
nie zezwala
UTC
jako strefa czasowa.Specyfikacja zawiera następujące stwierdzenie o tym, jakie przesunięcia stref czasowych są dopuszczalne w tym formacie:
Co więcej, jeśli będziemy kopać głębiej w oryginalnej specyfikacji tego formatu datetime, okazuje się, że w jego początkowej specyfikacji w https://tools.ietf.org/html/rfc822 , że sekcja składni listy „UT” (czyli „czas uniwersalny” ) jako możliwej wartości, ale robi nie lista UTC (Coordinated Universal Time) jako ważny. O ile wiem, używanie „UTC” w tym formacie daty nigdy nie było ważne; nie była to prawidłowa wartość, kiedy format został po raz pierwszy określony w 1982 r., a specyfikacja HTTP przyjęła bardziej restrykcyjną wersję formatu, zakazując stosowania wszystkich wartości „strefy” innych niż „GMT”.
Jeżeli Pytający pytanie tutaj miał zamiast użył
Expires
atrybutu jak to , a następnie:to przypuszczalnie by zadziałało.
źródło
Ustawienie „wygasa” na przeszłą datę jest standardowym sposobem usunięcia pliku cookie.
Twój problem prawdopodobnie wynika z nietypowego formatu daty. IE prawdopodobnie oczekuje tylko czasu GMT.
źródło
Użyj Max-Age = -1 zamiast „Expires”. Jest krótszy, mniej wybredny w składni, a Max-Age i tak ma pierwszeństwo przed Expires.
źródło
Dla implementacji GlassFish Jersey JAX-RS rozwiązałem ten problem za pomocą wspólnej metody opisywania wszystkich wspólnych parametrów. Przynajmniej trzy parametry muszą być równe: nazwa (= "nazwa"), ścieżka (= "/") i domena (= null):
I używaj tego powszechnego sposobu ustawiania plików cookie:
i usunąć plik cookie:
źródło
Max-Age
jako najwcześniejszą możliwą do przedstawienia datę i godzinę, ale serwery nie mogą wysyłać takiejMax-Age
wartości. Wydaje mi się, że autorzy wiedzieli zarówno o istniejących klientach, którzy nie mogli obsługiwać, jakMax-Age=0
i serwerach, które wysłały ją w czasie, gdy pisali specyfikację, i próbowali złagodzić problem z obu stron.