• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed JWT, inwalidacja refresh tokenów, ocena pomysłu.

Object Storage Arubacloud
+1 głos
395 wizyt
pytanie zadane 20 marca 2021 w Bezpieczeństwo, hacking przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 21 marca 2021 przez Jakub 0

Witam, mówiąc o temacie związanym z refresh tokenami, spotkałem się nieraz z taką opinią jak ta:

A refresh token HAS to be stored on the server side. You shouldn't leverage the "self-contained" property of JWT for a refresh token. Doing so leaves you with no way to revoke refresh tokens other than changing your private key

https://stackoverflow.com/questions/27726066/jwt-refresh-token-flow

Cała sprawa tyczy się tego, że refresh tokeny żyją dużej niż żetony dostępowe. Musimy w jakiś sposób je przechować na "czarnej lub białej liście". W przeciwnym razie mogą one być niebezpiecznie długo aktywne, a my nie będziemy mogli nic z tym zrobić.

Problem jest tylko taki, że tworząc takowe listy, niewiele zyskamy na "bezstanowym" systemie autoryzacji. Moim zdaniem, sesja była by po prostu prostsza i mniej zawiła.

Wydaje mi się, że wpadłem (pewnie nie ja pierwszy) na potencjalny pomysł, jak szybko zdezaktywować wszystkie tokeny, przechowując w modelu użytkownika jedynie jedno dodatkowe pole. Nazwałem je state, jest to nic innego jak prosty losowy żeton:

const generateUserState = () => crypto.randomBytes(32).toString('hex');

Aktualna wartość pola state wraz z ID użytkownika (i dodatkowymi informacjami jak exp i iat) składają się na payload w JWT. Przy próbie autoryzacji i odświeżania tokenu, sprawdzam zgodność pola state w JWT oraz bazie.

Teraz, by wszystkie klucze dostępowe uczynić nieaktualnymi, wystarczy zmienić w bazie wartość tego jednego pola.

Jeżeli użytkownik tego dokona, to wszystkie tokeny atakującego przestaną być aktywne. "Złodziej" sam nie będzie mógł tego zrobić, gdyż request do zmiany pola state, będzie wymagał podania hasła.

To oznacza, że posiadacz skradzionego refresh tokenu, będzie mógł oczywiście dokonywać zmiany na koncie. Nie uda mu się jednak w zbyt prosty sposób przejąć nad nim całkowitej kontroli. 

Jeżeli do tego wszystkiego dodamy wszystkie inne reguły zabezpieczeń, to wydaje mi się, że dla prostych aplikacji to by wystarczyło. Podoba mi się, że nie wiele rezygnujemy z bezstanowości procesu - potrzebne jest tylko jedne zwyczajne pole tekstowe w bazie (do tego nie często zmieniane).

Oczywiście nie ma tu możliwości likwidacji poprawności tylko wybranych tokenów. To jest największa wada.

Ciekawy jestem zdania innych na temat tego rozwiązania problemu. Czy było by to wystarczająco bezpieczne do użycia w praktyce? Z góry dziękuje za wskazówki :)

 

komentarz zamknięcia: Temat wyczerpany

1 odpowiedź

+2 głosów
odpowiedź 20 marca 2021 przez Comandeer Guru (599,930 p.)
wybrane 21 marca 2021 przez Jakub 0
 
Najlepsza
Stworzyłeś id sesji – po prostu.

Dlatego JWT i jego bezstanowość nie mają sensu przy systemie uwierzytelniania użytkownika – zawsze na końcu kończymy z chałupniczą implementacją systemu sesji.
komentarz 21 marca 2021 przez Jakub 0 Pasjonat (23,120 p.)
Ma to sens
komentarz 21 marca 2021 przez Wiciorny Ekspert (269,510 p.)

@Comandeer,czyli że mamy tokeny i ciasteczka sesyjne? :D 

komentarz 21 marca 2021 przez Comandeer Guru (599,930 p.)
No tak.

JWT były projektowane raczej jako jednorazowe tokeny, a nie tokeny, które są używane dłuższy czas. Na to wskazuje właśnie bezstanowość. W chwili, gdy zaczynamy używać JWT do uwierzytelniania i autoryzacji, zaczynamy odtwarzać poszczególne elementy OAuth 2.x.
komentarz 21 marca 2021 przez Jakub 0 Pasjonat (23,120 p.)

@Comandeer,

To tak właściwie gdzie warto wykorzystywać JWT (i tym podobne)? Bo większość poradników do SPA wykorzystuje JWT, nawet kurs na Udemy na temat strony SSR w node wykorzystuje JWT.

Tak jakby każdy zapomniał o sesji... to taki paradoks bo jednocześnie mówi się, że JWT nie powinno przechowywać się w local storage ani cookie, bo to niebezpieczne i podatne na XSS, CSRF itd, i że zamiast tego żeton powinien być w zmiennej z wykorzystaniem refresh tokenu. A sam refresh token wymaga zapisu na serwerze (tak się przynajmniej poleca).

1
komentarz 21 marca 2021 przez Comandeer Guru (599,930 p.)
Taki fajny przykład to np. user kupuje dostęp do jakiegoś pliku i dostaje na maila linka z takim tokenem. Token po prostu służy do sprawdzenia, czy user może pobrać dany plik.
komentarz 21 marca 2021 przez Jakub 0 Pasjonat (23,120 p.)
Dzięki za pomoc. Ja to wszystko na opak robiłem :)
komentarz 21 marca 2021 przez Wiciorny Ekspert (269,510 p.)

@Comandeer, również dzięki :) od tej strony tak na to nie popatrzyłem tez, a przy autoryzacji jak to sie ma? 

komentarz 21 marca 2021 przez Comandeer Guru (599,930 p.)
W teorii można, tylko dla mnie to bez sensu, bo praktycznie zawsze się to skończy na implementacji jakiegoś rodzaju systemu sesji, np. implementacja refresh tokenów to tak trochę OAuth 2.x dla mnie pachnie.

Podobne pytania

+1 głos
1 odpowiedź 188 wizyt
pytanie zadane 12 listopada 2020 w JavaScript przez LixI Nowicjusz (130 p.)
0 głosów
1 odpowiedź 362 wizyt
pytanie zadane 20 maja 2020 w JavaScript przez mi-20 Stary wyjadacz (13,190 p.)
0 głosów
1 odpowiedź 348 wizyt
pytanie zadane 21 października 2018 w JavaScript przez mi-20 Stary wyjadacz (13,190 p.)

92,525 zapytań

141,357 odpowiedzi

319,385 komentarzy

61,914 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...