Musimy przechowywać token JWT na komputerze klienckim. Jeśli przechowujemy go w LocalStorage / SessionStorage, może być łatwo przechwycony przez atak XSS. Jeśli przechowujemy go w plikach cookie, haker może go użyć (bez czytania) w ataku CSRF i podszyć się pod użytkownika oraz skontaktować się z naszym API i wysłać prośby o wykonanie działań lub uzyskanie informacji w imieniu użytkownika.
Istnieje jednak kilka sposobów zabezpieczenia tokenów JWT w plikach cookie, aby nie zostały łatwo skradzione (ale nadal istnieją zaawansowane techniki umożliwiające ich kradzież). Ale jeśli chcesz polegać na LocalStorage / SessionStorage, możesz uzyskać do niego dostęp za pomocą prostego ataku XSS.
Aby rozwiązać problem CSRF, używam Double Submit Cookies w mojej aplikacji.
Metoda podwójnego przesyłania plików cookie
Przechowuj JWT w pliku cookie HttpOnly i używaj go w trybie bezpiecznym do przesyłania przez HTTPS.
Większość ataków CSRF ma inne źródło lub nagłówek strony odsyłającej z oryginalnym hostem w żądaniach. Sprawdź więc, czy masz któreś z nich w nagłówku, czy pochodzą one z Twojej domeny, czy nie! Jeśli nie, odrzuć je. Jeśli w żądaniu nie ma zarówno źródła, jak i strony odsyłającej, nie martw się. Możesz polegać na wynikach walidacji nagłówka X-XSRF-TOKEN, które wyjaśnię w następnym kroku.
Chociaż przeglądarka automatycznie dostarcza pliki cookie dla domeny żądania, istnieje jedno przydatne ograniczenie: kod JavaScript uruchomiony na stronie internetowej nie może odczytać plików cookie innych witryn. Możemy to wykorzystać do stworzenia naszego rozwiązania CSRF. Aby zapobiec atakom CSRF, musimy utworzyć dodatkowy czytelny plik cookie JavaScript o nazwie: XSRF-TOKEN. Ten plik cookie musi zostać utworzony, gdy użytkownik jest zalogowany i powinien zawierać losowy, niemożliwy do odgadnięcia ciąg. Zapisujemy również ten numer w samym JWT jako roszczenie prywatne. Za każdym razem, gdy aplikacja JavaScript chce wysłać żądanie, będzie musiała odczytać ten token i wysłać go w niestandardowym nagłówku HTTP. Ponieważ te operacje (odczyt pliku cookie, ustawienie nagłówka) można wykonać tylko w tej samej domenie aplikacji JavaScript,
Angular JS ułatwia życie
Na szczęście używam Angular JS w naszej platformie, a Angular pakuje podejście tokenowe CSRF, co ułatwia nam wdrożenie. Na każde żądanie, które nasza aplikacja Angular wysyła do serwera, $http
usługa Angular automatycznie wykona te czynności:
- Poszukaj pliku cookie o nazwie XSRF-TOKEN w bieżącej domenie.
- Jeśli ten plik cookie zostanie znaleziony, odczytuje wartość i dodaje ją do żądania jako nagłówek X-XSRF-TOKEN.
W ten sposób implementacja po stronie klienta jest obsługiwana automatycznie! Musimy tylko ustawić plik cookie nazwany XSRF-TOKEN
na bieżącej domenie po stronie serwera, a kiedy nasze API otrzyma jakiekolwiek wywołanie od klienta, musi sprawdzić X-XSRF-TOKEN
nagłówek i porównać je z XSRF-TOKEN
tokenem JWT. Jeśli pasują, to użytkownik jest prawdziwy. W przeciwnym razie jest to sfałszowane żądanie i możesz je zignorować. Ta metoda jest inspirowana metodą „Double Submit Cookie”.
Uwaga
W rzeczywistości nadal jesteś podatny na XSS, po prostu atakujący nie może ukraść Twojego tokena JWT do późniejszego wykorzystania, ale nadal może wysyłać żądania w imieniu użytkowników za pomocą XSS.
Niezależnie od tego, czy przechowujesz swój localStorage
token JWT w pliku cookie, czy też przechowujesz swój token XSRF w pliku cookie innym niż HttpOnly, XSS może je łatwo pobrać. Nawet twój token JWT w pliku cookie HttpOnly może zostać przechwycony przez zaawansowany atak XSS, taki jak metoda XST .
Dlatego oprócz metody Double Submit Cookies, należy zawsze przestrzegać najlepszych praktyk przeciwko XSS, w tym zawartości ucieczki. Oznacza to usunięcie dowolnego wykonywalnego kodu, który spowodowałby, że przeglądarka zrobiłaby coś, czego nie chcesz. Zwykle oznacza to usunięcie // <![CDATA[
tagów i atrybutów HTML, które powodują ocenę kodu JavaScript.
Przeczytaj więcej tutaj: