Uwierzytelnianie tokenów a pliki cookie

141

Jaka jest różnica między uwierzytelnianiem za pomocą tokena a uwierzytelnianiem za pomocą plików cookie?

Próbuję wdrożyć demo Ember Auth Rails, ale nie rozumiem powodów używania uwierzytelniania tokenów, jak opisano w FAQ Ember Auth na pytanie "Dlaczego uwierzytelnianie tokenem?"

Jan
źródło
4
Token może zostać przekazany Twojej aplikacji mobilnej i przechowywany w zmiennej (przez Ciebie) do późniejszego wykorzystania lub zapisany (przez Ciebie) za pomocą JavaScript w Twojej przeglądarce do wykorzystania w żądaniach SPA. Cookie jest generalnie używane w przeglądarce (przez przeglądarkę).
Tino Mclaren
2
Zobacz artykuł auth0.com/blog/cookies-vs-tokens-definitive-guide napisany w 2016 roku.
Michael Freidgeim

Odpowiedzi:

34

Typowa aplikacja internetowa jest w większości bezstanowa ze względu na charakter żądania / odpowiedzi . Protokół HTTP jest najlepszym przykładem protokołu bezstanowego . Ale ponieważ większość aplikacji internetowych potrzebuje stanu , aby utrzymać stan między serwerem a klientem, używane są pliki cookie, które serwer może wysłać w każdej odpowiedzi z powrotem do klienta. Oznacza to, że następne żądanie wysłane przez klienta będzie zawierało ten plik cookie i tym samym zostanie rozpoznane przez serwer. W ten sposób serwer może utrzymywać sesję z bezstanowym klienta, wiedząc, głównie wszystko o aplikacji stanie , ale przechowywane na serwerze. W tym scenariuszu klient w żadnym momencie nie zatrzymuje sięstan , co nie jest sposobem działania Ember.js .

W Ember.js jest inaczej. Ember.js ułatwia pracę programisty, ponieważ rzeczywiście utrzymuje stan dla Ciebie, w kliencie, wiedząc w każdej chwili o jego stanie bez konieczności wysyłania żądania do serwera z prośbą o dane o stanie .

Jednak utrzymywanie stanu w kliencie może czasami powodować problemy ze współbieżnością, które po prostu nie występują w sytuacjach bezstanowych . Jednak Ember.js zajmuje się również tymi problemami dla Ciebie, w szczególności ember-data jest tworzony z myślą o tym. Podsumowując, Ember.js to framework przeznaczony dla klientów stanowych .

Ember.js nie działa jak typowa bezstanowa aplikacja internetowa, w której sesja , stan i odpowiednie pliki cookie są prawie w całości obsługiwane przez serwer. Ember.js przechowuje swój stan całkowicie w javascript (w pamięci klienta, a nie w DOM, jak niektóre inne frameworki) i nie potrzebuje serwera do zarządzania sesją. Powoduje to, że Ember.js jest bardziej wszechstronny w wielu sytuacjach, np. Gdy aplikacja jest w trybie offline.

Oczywiście ze względów bezpieczeństwa wymaga wysyłania do serwera jakiegoś tokena lub unikalnego klucza za każdym razem, gdy żądanie jest uwierzytelniane , w ten sposób serwer może wyszukać token wysyłania (który został pierwotnie wydany przez serwer) i sprawdź, czy jest ważny przed wysłaniem odpowiedzi z powrotem do klienta.

Moim zdaniem głównym powodem używania tokena uwierzytelniania zamiast plików cookie, jak podano w Ember Auth FAQ, jest przede wszystkim natura frameworka Ember.js, a także dlatego, że bardziej pasuje on do paradygmatu stanowych aplikacji internetowych. Dlatego mechanizm plików cookie nie jest najlepszym podejściem do budowania aplikacji Ember.js.

Mam nadzieję, że moja odpowiedź nada Twojemu pytaniu więcej sensu.

intuicyjny piksel
źródło
84
Nadal nie rozumiem, dlaczego token jest lepszy / inny niż plik cookie. Tak czy inaczej, wysyłasz do serwera API coś, co identyfikuje prawidłową sesję. Zakładając, że uruchamiasz wszystko w jednej domenie (i nawet jeśli ember i twoje API znajdują się na różnych serwerach, wszystko, co musisz zrobić, aby to osiągnąć, jest uruchamiane za cdn, co prawdopodobnie i tak powinieneś zrobić), jaką korzyść oferują tokeny, które gwarantują dodatkowe prace konfiguracyjne i dodatkowa podatność na ataki czasowe?
Michael Johnston
46
Uzgodniono z Michaelem Johnstonem. Ta odpowiedź wciąż wyjaśnia, czym jest uwierzytelnianie oparte na tokenach, ale w rzeczywistości nie odpowiada na pytanie. Najbliższe istotne informacje, które widzę, znajdują się w ostatnim fragmencie „ze względu na charakter frameworka ember.js, a także dlatego, że bardziej pasuje do paradygmatu aplikacji sieciowej statefull”, ale to nie jest żadna odpowiedź. Mam to samo pytanie.
Daniel
5
Zgadzam się z obydwoma komentarzami tutaj ... Właściwie czuję, że cała ta „to żarowa droga” to trochę
wymówka
3
Szczerze uważam, że stanowość to czerwony śledź w odniesieniu do pliku cookie w porównaniu z tokenem przesłanym w inny sposób. Myślę, że łączy to pojęcie dowodów użytkownika z innymi informacjami o profilu użytkownika. Mógłbym użyć pliku cookie tak samo jak nagłówka HTTP lub innego kanału do przesłania tokena. Myślę, że różnica polega bardziej na omijaniu problemów związanych z polityką jednego źródła dla plików cookie lub na odciążeniu wdrażania kontenera plików cookie od natywnych klientów zaplecza.
Michael Lang
15
nie reklamuj ember.js skup się na zadanym pytaniu .. przepraszam, że jestem niegrzeczny.
Vick_Pk,
336

Http jest bezpaństwowy. Aby Cię autoryzować, musisz „podpisać” każde żądanie, które wysyłasz do serwera.

Uwierzytelnianie za pomocą tokena

  • Żądanie do serwera podpisywane jest „tokenem” - zwykle oznacza to ustawienie określonych nagłówków http, jednak można je przesłać w dowolnej części żądania http (treść POST itp.)

  • Plusy:

    • Możesz autoryzować tylko te żądania, które chcesz autoryzować. (Pliki cookie - nawet plik cookie autoryzacji jest wysyłany dla każdego żądania).
    • Odporny na XSRF (Krótki przykład XSRF - wyślę Ci link w e-mailu, który będzie wyglądał <img src="http://bank.com?withdraw=1000&to=myself" />, a jeśli jesteś zalogowany za pomocą uwierzytelniania plików cookie do bank.com, a bank.com nie ma żadnych możliwości XSRF ochrony, wypłacę pieniądze z Twojego konta po prostu przez fakt, że Twoja przeglądarka uruchomi autoryzowane żądanie GET na ten adres URL.) Pamiętaj, że istnieją środki zapobiegające fałszerstwom, które możesz wykonać z uwierzytelnianiem opartym na plikach cookie - ale musisz je wdrożyć.
    • Pliki cookie są powiązane z jedną domeną. Plik cookie utworzony w domenie foo.com nie może zostać odczytany przez domenę bar.com, natomiast możesz wysyłać tokeny do dowolnej domeny. Jest to szczególnie przydatne w przypadku aplikacji jednostronicowych, które korzystają z wielu usług wymagających autoryzacji - dzięki czemu mogę mieć aplikację internetową w domenie myapp.com, która może wysyłać autoryzowane żądania po stronie klienta do myservice1.com i do myservice2.com.
  • Cons:
    • Musisz gdzieś przechowywać token; podczas gdy pliki cookie są przechowywane „po wyjęciu z pudełka”. Lokalizacje, które przychodzą na myśl to localStorage (con: token jest utrwalany nawet po zamknięciu okna przeglądarki), sessionStorage (pro: token jest odrzucany po zamknięciu okna przeglądarki, con: otwarcie linku w nowej karcie spowoduje renderowanie tej karty anonimowe) i pliki cookie (wersja Pro: token jest odrzucany po zamknięciu okna przeglądarki. Jeśli używasz pliku cookie sesji, zostaniesz uwierzytelniony podczas otwierania łącza w nowej karcie i jesteś odporny na XSRF, ponieważ ignorujesz plik cookie do uwierzytelniania, używasz go po prostu do przechowywania tokenów. Wada: pliki cookie są wysyłane dla każdego żądania. Jeśli ten plik cookie nie jest oznaczony tylko jako https, jesteś otwarty na ataki typu man in the middle.)
    • Nieco łatwiej jest przeprowadzić atak XSS na uwierzytelnianie oparte na tokenach (tj. Jeśli mogę uruchomić skrypt wstrzyknięty w Twojej witrynie, mogę ukraść Twój token; jednak uwierzytelnianie oparte na plikach cookie również nie jest srebrnym rozwiązaniem - podczas gdy pliki cookie są oznaczone jako Tylko http nie może być odczytane przez klienta, klient może nadal wysyłać żądania w Twoim imieniu, które automatycznie będą zawierać plik cookie autoryzacji).
    • Żądania pobrania pliku, który ma działać tylko dla autoryzowanych użytkowników, wymagają użycia File API. To samo żądanie działa po wyjęciu z pudełka w przypadku uwierzytelniania opartego na plikach cookie.

Uwierzytelnianie plików cookie

  • Żądanie do serwera jest zawsze rejestrowane za pomocą pliku cookie autoryzacji.
  • Plusy:
    • Pliki cookie można oznaczyć jako „tylko http”, co uniemożliwia ich odczytanie po stronie klienta. Jest to lepsze w przypadku ochrony przed atakami XSS.
    • Wychodzi z pudełka - nie musisz implementować żadnego kodu po stronie klienta.
  • Cons:
    • Powiązane z jedną domeną. (Jeśli więc masz aplikację jednostronicową, która wysyła żądania do wielu usług, możesz w końcu robić szalone rzeczy, takie jak odwrotne proxy).
    • Wrażliwy na XSRF. Musisz wdrożyć dodatkowe środki, aby zabezpieczyć swoją witrynę przed fałszowaniem żądań między witrynami.
    • Są wysyłane dla każdego żądania (nawet dla żądań, które nie wymagają uwierzytelnienia).

Ogólnie rzecz biorąc, powiedziałbym, że tokeny zapewniają lepszą elastyczność (ponieważ nie jesteś ograniczony do jednej domeny). Wadą jest to, że musisz samodzielnie wykonać kodowanie.

Ondrej Svejdar
źródło
56
Ta odpowiedź jest znacznie bliższa odpowiedzi kanonicznej niż ta przyjęta.
xlecoustillier
3
Dzięki @ ondrej-svejdar. To zdecydowanie najlepsza odpowiedź! Spierałbym się tylko z częścią „całkiem sporo kodowania”. Dostępnych jest wiele bibliotek dla prawie każdego języka. Więc jeśli naprawdę nie chcesz poznać mechaniki implementacji JWT, nie musisz zaczynać od zera.
FullStackForger
2
Are send out for every single requestŻetony są wysyłane również na każde żądanie
Eugen Konkov
10
@EugenKonkov no. niekoniecznie. Tylko jeśli dodasz nagłówek. pliki cookie są wysyłane z przeglądarki, jeśli chcesz lub nie chcesz
Royi Namir
2
@Zack - to ma znaczenie. Problem z plikami cookie polega na tym, że są one automatycznie dołączane do żądania przez przeglądarkę. Z drugiej strony tokeny są dołączane do żądania XHR za pomocą javascript. Dla evildomain.com niemożliwe jest uzyskanie dostępu do lokalnej pamięci mysite.com (przy okazji. Nie polecam lokalnego przechowywania jako miejsca do przechowywania tokenów) ani do pamięci RAM (zakładam, że masz na myśli zmienną javascript zawierającą token), ponieważ zmienna jest umieszczana w piaskownicy w innym oknie przeglądarki.
Ondrej Svejdar
34
  • Tokeny muszą być gdzieś przechowywane (pamięć lokalna / sesyjna lub pliki cookie)

  • Tokeny mogą wygasać jak pliki cookie, ale masz większą kontrolę

  • Przechowywanie lokalne / sesyjne nie będzie działać między domenami, użyj pliku cookie znacznika

  • Żądania inspekcji wstępnej będą wysyłane przy każdym żądaniu CORS

  • Kiedy chcesz coś przesyłać strumieniowo, użyj tokena, aby uzyskać podpisane żądanie

  • Łatwiej poradzić sobie z XSS niż XSRF

  • Token jest wysyłany na każde żądanie, uważaj na jego rozmiar

  • Jeśli przechowujesz poufne informacje, zaszyfruj token

  • Tokeny sieciowe JSON mogą być używane w OAuth

  • Tokeny nie są srebrnymi kulami, pomyśl dokładnie o przypadkach użycia autoryzacji

http://blog.auth0.com/2014/01/27/ten-things-you-should-know-about-tokens-and-cookies/

http://blog.auth0.com/2014/01/07/angularjs-authentication-with-cookies-vs-token/

user3490126
źródło
14
Nie jest jasne, czy Twoje punkty dotyczą plików cookie czy tokenów, w którą stronę są?
Pureferret
6
Nie rozumiem, dlaczego „masz większą kontrolę” nad tokenami niż nad plikami cookie.
Aaron,
@onsmith Z tego, co rozumiem, jest tu więcej niż jeden punkt. Po pierwsze, plik cookie jest wysyłany z każdym żądaniem. Wysyłanie tokenów jest wyzwalane przez kod javascript. Nie są wysyłane automatycznie. Ponadto, zgodnie z sekcją rfc 4 wygląda na to, że JWT został zaprojektowany jako kontener używany do przenoszenia roszczeń zabezpieczających na podstawie między stronami. Co zapewnia bardziej szczegółową kontrolę, a także umożliwia generowanie tokenów uwierzytelniających dla stron trzecich z zestawem uprawnień umożliwiających im używanie ich w Twoim imieniu.
FullStackForger
18

Dla pracowników Google :

  • NIE mieszaj stanowości z mechanizmami transferu stanów

PAŃSTWOWOŚĆ

  • Stateful = zapisywanie informacji autoryzacyjnych po stronie serwera, jest to tradycyjny sposób
  • Bezstanowe = zapisywanie informacji autoryzacyjnych po stronie klienta wraz z podpisem w celu zapewnienia integralności

MECHANIZMY

  • Cookie = specjalny nagłówek ze specjalnym traktowaniem (dostęp, przechowywanie, wygaśnięcie, bezpieczeństwo, automatyczny transfer) przez przeglądarki
  • Niestandardowe nagłówki = np. To Authorizationtylko nagłówki bez specjalnego traktowania, klient musi zarządzać wszystkimi aspektami transferu
  • Inne . Mogą być wykorzystywane inne mechanizmy przesyłania, np. Ciąg zapytania był przez jakiś czas wybrany do przesłania identyfikatora autoryzacji, ale został porzucony ze względu na jego niepewność

PORÓWNANIE PAŃSTWOWE

  • „Autoryzacja stanowa” oznacza, że ​​serwer przechowuje i utrzymuje informacje autoryzacji użytkownika na serwerze, czyniąc autoryzacje częścią stanu aplikacji
  • Oznacza to, że klient musi jedynie zachować „identyfikator uwierzytelnienia”, a serwer może odczytać szczegóły uwierzytelniania ze swojej bazy danych
  • Oznacza to, że serwer przechowuje pulę aktywnych uwierzytelnień (zalogowanych użytkowników) i zapyta o te informacje dla każdego żądania
  • „Autoryzacja bezstanowa” oznacza, że ​​serwer nie przechowuje i nie obsługuje informacji o uwierzytelnianiu użytkownika, po prostu nie wie, którzy użytkownicy są zalogowani, i polega na kliencie w zakresie tworzenia informacji uwierzytelniających
  • Klient będzie przechowywać pełne informacje o uwierzytelnianiu, takie jak to, kim jesteś (identyfikator użytkownika) i prawdopodobnie uprawnienia, czas wygaśnięcia itp., To coś więcej niż tylko identyfikator uwierzytelniania, więc otrzymuje nowy token nazwy
  • Oczywiście klientowi nie można ufać, więc dane uwierzytelniające są przechowywane wraz z wygenerowanym podpisem hash(data + secret key), skąd tajny klucz jest znany tylko serwerowi, dzięki czemu można zweryfikować integralność danych tokena
  • Należy pamiętać, że mechanizm tokenów zapewnia jedynie integralność, ale nie poufność, klient musi to zaimplementować
  • Oznacza to również, że dla każdego żądania klient musi przesłać pełny token, co wiąże się z dodatkową przepustowością

PORÓWNANIE MECHANIZMU

  • „Cookie” to tylko nagłówek, ale z pewnymi wstępnie załadowanymi operacjami w przeglądarkach
  • Pliki cookie mogą być ustawiane przez serwer i automatycznie zapisywane przez klienta i będą automatycznie wysyłane dla tej samej domeny
  • Plik cookie można oznaczyć jako httpOnlyuniemożliwiający dostęp klienta do JavaScript
  • Wstępnie załadowane operacje mogą nie być dostępne na platformach innych niż przeglądarki (np. Mobilne), co może wymagać dodatkowego wysiłku
  • „Niestandardowe nagłówki” to po prostu niestandardowe nagłówki bez wstępnie załadowanych operacji
  • Klient jest odpowiedzialny za otrzymywanie, przechowywanie, zabezpieczanie, przesyłanie i aktualizowanie niestandardowej sekcji nagłówka dla każdego żądania, co może pomóc w zapobieganiu osadzaniu prostych złośliwych adresów URL

PODSUMOWAĆ

  • Nie ma magii, stan autoryzacji musi być gdzieś przechowywany, na serwerze lub kliencie
  • Możesz wdrożyć stanowe / bezstanowe za pomocą plików cookie lub innych niestandardowych nagłówków
  • Kiedy ludzie mówią o tych rzeczach, ich domyślny sposób myślenia to głównie: bezstanowy = token + niestandardowy nagłówek, stanowy = identyfikator uwierzytelnienia + plik cookie; to NIE są jedyne możliwe opcje
  • Mają zalety i wady, ale nawet w przypadku zaszyfrowanych tokenów nie należy przechowywać poufnych informacji

Połączyć

theaws.blog
źródło
1
Dziękuję za to, niezmiernie pomocne. Odpowiada na pytanie plus całe zamieszanie wywołane przez inne odpowiedzi, nagle mówiąc o stanowości.
MDave
Bardzo, bardzo dobrze. Zawiera więcej szczegółów i naprawdę wyjaśnia, jak i dlaczego w lepszy sposób.
colinwong
8

Uważam, że jest tu pewne zamieszanie. Istotna różnica między uwierzytelnianiem opartym na plikach cookie a tym, co jest teraz możliwe dzięki HTML5 Web Storage, polega na tym, że przeglądarki są zbudowane tak, aby wysyłać dane plików cookie za każdym razem, gdy żądają zasobów z domeny, która je ustawiła. Nie możesz temu zapobiec bez wyłączania plików cookie. Przeglądarki nie wysyłają danych z Web Storage, chyba że wysyła je kod na stronie . Strony mogą uzyskiwać dostęp tylko do przechowywanych przez siebie danych, a nie do danych przechowywanych przez inne strony.

Tak więc użytkownik martwi się sposobem, w jaki jego dane z plików cookie mogą być wykorzystywane przez Google lub Facebook, może wyłączyć pliki cookie. Ale mają mniej powodów, by wyłączać Web Storage (dopóki reklamodawcy nie wymyślą sposobu, jak z tego skorzystać).

Na tym polega różnica między opartymi na plikach cookie a tokenami, przy czym ta ostatnia korzysta z magazynu internetowego.

martinp999
źródło
5

Uwierzytelnianie oparte na tokenach jest bezstanowe, serwer nie musi przechowywać informacji o użytkowniku w sesji. Daje to możliwość skalowania aplikacji bez martwienia się o to, gdzie zalogował się użytkownik. Istnieje koligacja Web Server Framework dla plików cookie, ale nie jest to problem w przypadku korzystania z tokenów. Tak więc ten sam token może być użyty do pobrania bezpiecznego zasobu z domeny innej niż ta, do której jesteśmy zalogowani, co pozwala uniknąć kolejnego uwierzytelnienia uid / pwd.

Bardzo dobry artykuł tutaj:

http://www.toptal.com/web/cookie-free-authentication-with-json-web-tokens-an-example-in-laravel-and-angularjs

Afz
źródło
3

Użyj tokena, gdy ...

Federacja jest pożądana. Na przykład chcesz użyć jednego dostawcy (dystrybutora tokenów) jako wystawcy tokenu, a następnie użyć serwera API jako walidatora tokenu. Aplikacja może uwierzytelnić się w Token Dispensor, otrzymać token, a następnie przedstawić ten token na serwerze API w celu weryfikacji. (To samo działa z logowaniem przez Google. Lub Paypal lub Salesforce.com itd.)

Wymagana jest asynchronia. Na przykład chcesz, aby klient wysłał żądanie, a następnie gdzieś je przechował, aby „później” wykonać na nim osobny system. Ten oddzielny system nie będzie miał połączenia synchronicznego z klientem i może nie mieć bezpośredniego połączenia z centralną dystrybucją tokenów. token JWT może zostać odczytany przez asynchroniczny system przetwarzania w celu ustalenia, czy element pracy może i powinien zostać wykonany w późniejszym czasie. Jest to w pewnym sensie związane z powyższą ideą Federacji. Uważaj jednak: JWT wygasa. Jeśli kolejka przechowująca element pracy nie zostanie przetworzona w okresie istnienia tokena JWT, oświadczenia nie powinny już być zaufane.

Żądanie podpisane przez klienta jest wymagane. Tutaj żądanie jest podpisywane przez klienta przy użyciu jego klucza prywatnego, a serwer sprawdza poprawność przy użyciu już zarejestrowanego klucza publicznego klienta.

Bharat Vasant
źródło
1

Jedną z głównych różnic jest to, że pliki cookie podlegają Polityce tego samego pochodzenia, podczas gdy tokeny nie. Stwarza to wszelkiego rodzaju efekty w dół strumienia.

Ponieważ pliki cookie są wysyłane tylko do iz określonego hosta, host ten musi ponosić ciężar uwierzytelnienia użytkownika, a użytkownik musi utworzyć konto z danymi bezpieczeństwa na tym hoście, aby można było je zweryfikować.

Z drugiej strony tokeny są wydawane i nie podlegają tym samym zasadom pochodzenia. Emitentem może być dosłownie każdy i to do hosta należy decyzja, którym emitentom zaufać. Wystawca, taki jak Google i Facebook, jest zwykle bardzo zaufany, więc gospodarz może przenieść ciężar uwierzytelniania użytkownika (w tym przechowywania wszystkich danych bezpieczeństwa użytkownika) na inną stronę, a użytkownik może skonsolidować swoje dane osobowe u określonego wystawcy i nie musi pamiętać kilka różnych haseł dla każdego hosta, z którym współpracują.

Pozwala to na pojedyncze logowanie w scenariuszach, które zmniejszają ogólne tarcia w środowisku użytkownika. Teoretycznie sieć staje się również bezpieczniejsza, ponieważ wyspecjalizowani dostawcy tożsamości pojawiają się, aby świadczyć usługi uwierzytelniania, zamiast uruchamiać wszystkie witryny internetowe ma i pa w swoich własnych, prawdopodobnie na wpół upieczonych systemach uwierzytelniania. A ponieważ dostawcy ci wychodzą, koszt zapewnienia bezpiecznych zasobów sieciowych nawet dla bardzo podstawowych zasobów spada do zera.

Ogólnie rzecz biorąc, tokeny zmniejszają tarcia i koszty związane z zapewnianiem uwierzytelniania i przenoszą ciężar różnych aspektów bezpiecznej sieci na scentralizowane strony, które są w stanie lepiej wdrażać i utrzymywać systemy bezpieczeństwa.

ryzm
źródło