W kontekście JWT Stormpath napisał dość pomocny artykuł opisujący możliwe sposoby ich przechowywania oraz (nie) zalety każdej metody.
Zawiera także krótki przegląd ataków XSS i CSRF oraz sposobów ich zwalczania.
Załączam kilka krótkich fragmentów poniższego artykułu, na wypadek, gdyby ich artykuł został wyłączony z trybu offline / strona się nie wyświetla.
Lokalny magazyn
Problemy:
Web Storage (localStorage / sessionStorage) jest dostępny poprzez JavaScript w tej samej domenie. Oznacza to, że każdy skrypt JavaScript działający w Twojej witrynie będzie miał dostęp do pamięci internetowej, przez co może być podatny na ataki typu cross-site scripting (XSS). XSS w skrócie to rodzaj luki, w której atakujący może wstrzyknąć JavaScript, który będzie działał na twojej stronie. Podstawowe ataki XSS próbują wstrzyknąć JavaScript poprzez dane wejściowe formularza, w których atakujący ostrzega („Jesteś zhakowany”); do formularza, aby sprawdzić, czy jest uruchamiany przez przeglądarkę i może być oglądany przez innych użytkowników.
Zapobieganie:
Aby zapobiec XSS, powszechną odpowiedzią jest ucieczka i kodowanie wszystkich niezaufanych danych. Ale to dalekie od pełnej historii. W 2015 r. Nowoczesne aplikacje internetowe używają JavaScript hostowanego w sieciach CDN lub poza infrastrukturą. Nowoczesne aplikacje internetowe obejmują zewnętrzne biblioteki JavaScript do testowania A / B, analizy ścieżek / rynku oraz reklamy. Korzystamy z menedżerów pakietów, takich jak Bower, aby importować kod innych osób do naszych aplikacji.
Co się stanie, jeśli zagrożony będzie tylko jeden z używanych skryptów? Na stronie można osadzić złośliwy kod JavaScript, a pamięć internetowa jest zagrożona. Tego rodzaju ataki XSS mogą uzyskać dostęp do wszystkich stron internetowych, które odwiedzają Twoją witrynę, bez ich wiedzy. Prawdopodobnie dlatego kilka organizacji odradza przechowywanie niczego wartościowego lub nie ufanie żadnej informacji w pamięci internetowej. Obejmuje to identyfikatory sesji i tokeny.
Jako mechanizm przechowywania, Web Storage nie wymusza żadnych bezpiecznych standardów podczas transferu. Ktokolwiek czyta Pamięć sieciową i korzysta z niej, musi dołożyć należytej staranności, aby upewnić się, że zawsze wysyła JWT przez HTTPS, a nigdy HTTP.
Ciasteczka
Problemy:
Pliki cookie, gdy są używane z flagą plików cookie HttpOnly, nie są dostępne przez JavaScript i są odporne na XSS. Możesz także ustawić flagę Bezpieczne ciasteczko, aby zagwarantować, że ciasteczko jest wysyłane tylko przez HTTPS. Jest to jeden z głównych powodów wykorzystywania plików cookie w przeszłości do przechowywania tokenów lub danych sesji. Współcześni programiści niechętnie korzystają z plików cookie, ponieważ tradycyjnie wymagali przechowywania danych na serwerze, co łamie najlepsze praktyki RESTful. Pliki cookie jako mechanizm przechowywania nie wymagają przechowywania stanu na serwerze, jeśli przechowujesz JWT w pliku cookie. Wynika to z faktu, że JWT zawiera wszystko, czego potrzebuje serwer, aby obsłużyć żądanie.
Pliki cookie są jednak podatne na inny rodzaj ataku: fałszowanie żądań w różnych witrynach (CSRF). Atak CSRF to rodzaj ataku, który ma miejsce, gdy złośliwa witryna internetowa, wiadomość e-mail lub blog powoduje, że przeglądarka internetowa użytkownika wykonuje niepożądane działanie na zaufanej stronie, na której użytkownik jest obecnie uwierzytelniany. Jest to sposób wykorzystania plików cookie przez przeglądarkę. Plik cookie można wysłać tylko do domen, w których jest dozwolony. Domyślnie jest to domena, która pierwotnie ustawiła plik cookie. Plik cookie zostanie wysłany na żądanie, niezależnie od tego, czy jesteś na galaxies.com czy hahagonnahackyou.com.
Zapobieganie:
Nowoczesne przeglądarki obsługują SameSite
flagę , oprócz HttpOnly
i Secure
. Celem tej flagi jest zapobieganie przesyłaniu plików cookie w żądaniach między witrynami, zapobiegając wielu rodzajom ataków CSRF.
W przeglądarkach, które nie obsługują SameSite
CSRF można zapobiec, używając zsynchronizowanych wzorców tokenów. Brzmi to skomplikowanie, ale wszystkie nowoczesne frameworki mają na to wsparcie.
Na przykład AngularJS ma rozwiązanie umożliwiające sprawdzenie, czy plik cookie jest dostępny tylko dla Twojej domeny. Prosto z dokumentów AngularJS:
Podczas wykonywania żądań XHR usługa $ http odczytuje token z pliku cookie (domyślnie XSRF-TOKEN) i ustawia go jako nagłówek HTTP (X-XSRF-TOKEN). Ponieważ tylko JavaScript działający w Twojej domenie może odczytać ciasteczko, Twój serwer może być pewny, że XHR pochodzi z JavaScript działającego w Twojej domenie. Możesz uczynić tę ochronę CSRF bezpaństwową, włączając xsrfToken
roszczenie JWT:
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
Wykorzystanie ochrony CSRF w twojej aplikacji internetowej sprawia, że ciasteczka są solidne do przechowywania JWT. CSRF można również częściowo zapobiec, sprawdzając odsyłacz HTTP i nagłówek Origin w interfejsie API. Ataki CSRF będą miały nagłówki Referer i Origin niezwiązane z Twoją aplikacją.
Pełny artykuł można znaleźć tutaj:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
Mają także pomocny artykuł o tym, jak najlepiej zaprojektować i wdrożyć JWT, w odniesieniu do samej struktury tokena:
https://stormpath.com/blog/jwt-the-right-way/