Wpis z mikrobloga

#react #programowanie #naukaprogramowania #jwt

Mirki, jaki jest obecny standard w normalnej firmie IT odnośnie łączenia JWT (jako token do uwierzytelniania requestów) i SPA (np. React)? Znam kilka metod poniżej, ale chciałbym wiedzieć czego w rzeczywistości się używa?

1. JWT w localstorage -> wbrew dziesiątkom art. na necie twierdzącym, że to samo zło, sporo osób twierdzi, że tego używa i się nie przejmują XSS, koronny argument jest taki, że jak ktoś uzyska dostęp to i tak jwt to najmniejszy problem bo może zrobić dużo więcej złego.

2. JWT w ciastku -> chyba to samo co wyżej, i tak można odczytać w JS

3. JWT w ciastku httponly -> czyli de facto react renderowany na serwerze, naprawdę jest tutaj przewaga w zabezpieczeniu? Przecież jak się ma dostęp do przeglądarki przez input czy dodatek to i tak można zrobić wszystko, wystarczy fetch() i każdy request i tak będzie podpisany z tej przeglądarki -> czyli dalej można uzyskać to samo co w punktach 1-2.

4. JWT w state -> czyli F5 i od nowa ;)

A może jest coś o czymś nie wiem? Albo może w profesjonalnych produktach nikt JWT nie używa z wyżej wymienionych powodów?
  • 5
@TomAtari: nie jestem frontem ale fronty mi opowiadają o localstorage. Ciastko odpowiada klasycznym stronom, które tworzą ciastko sesyjne. XSS powinieneś ty wycinać i backend. A jeżeli ktoś ma shackowaną przeglądarkę to i tak nic nie zrobisz.
@cecyl: no właśnie, React i Agular są dosyć dobrze zabezpieczone przed XSS. A na exploit w dodatku do przeglądarki i tak nic się nie da zrobić jak piszesz i prędzej bot będzie szukał haseł do banków, czy wrzuci keyloggera, niż będzie szukał JWT, który jak ma krótką żywotność typu 1h to i tak nic nie da.

Może banki, gov itp. powinny być lepiej zabezpieczone, ale zwykłe aplikacje? Stąd nie do końca
argument jest taki, że jak ktoś uzyska dostęp to i tak jwt to najmniejszy problem bo może zrobić dużo więcej złego


@TomAtari: co na przykład?

JWT w ciastku -> chyba to samo co wyżej, i tak można odczytać w JS


No nie do końca, jak zrobisz w ciastku i ustawisz na nim flagę HTTPOnly to przez JS tego nie odczytasz (np. przez XSS). Ja bym tak zrobił.
@Loperamid: właśnie to co napisałeś to punkt 3 mojego wpisu, z JS nie odczytasz, ale jak ktoś ma dostęp do przeglądarki to jaka jest różnica względem 1-2? I tak requesty są podpisane.

a odnośnie Twojego pytania to czytałem o wrzucaniu w ten sposób keyloggera czy podrzucaniu phishingowych formów dzięki czemu można łatwo uzyskać np. dostęp do banku
@TomAtari: Faktycznie, dopiero doczytałem. W sumie żadna różnica. Jeśli potrzebujesz żeby Twój JS miał dostęp do JWT to trzymasz go w localstorage, ale wtedy może go odczytać także XSS. Ciasteczka są o tyle lepsze, że możesz ustawić HTTPOnly i zabezpieczyć się przed XSSami. Requesty to prawda są podpisane, ale możesz ustawić SameSite na ciasteczku albo zaimplementować inną ochronę przed CSRF i będziesz miał podpisane tylko te requesty, których się spodziewasz.