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

Bezpieczeństwo autoryzacji z użyciem JWT na kliencie, proste pytanie

Object Storage Arubacloud
0 głosów
259 wizyt
pytanie zadane 21 lipca 2020 w Bezpieczeństwo, hacking przez Jakub 0 Pasjonat (23,120 p.)

Witam, skończyłem kurs NodeJS na udemy, było tam pokazane użycie JWT dla prostego API. Moim celem jest stworzenie aplikacji klienckiej która pozawala na zalogowanie się do "systemu" ( API ).

Pierwszą rzeczą jakiej dokonałem to dodanie refresh token'ów. W sensie chcę tak to zrealizować jak inni mówią że jest względnie bezpiecznie, czyli access token będzie przechowywany w zwyczajnej zmiennej, natomiast refresh token w plikach cookie. To ponoć zabezpiecza przed CSRF, bo taki refresh token może być użyty wyłącznie do uzyskania nowego tokenu, nie dokonamy za jego pomocą żadnych zmian na serwerze/bazie danych.

I tu się zastanawiam, jaki problem żeby skrypt na innej stronie, na podstawie refresh tokenu zapisanego w plikach cookie, uzyskał dla siebie nowy access token, a następnie dokonał konkretnych zmian... Jest to bardziej skomplikowane, ale nie niemożliwe...

Takie coś nawet ja potrafił bym napisać mimo że jestem jeszcze kompletnym noobem laugh

Może ja czegoś tu nie rozumiem, w każdym bądź razie będę bardzo wdzięczny za odpowiedź. Z góry wam dziękuję i pozdrawiam!

1 odpowiedź

0 głosów
odpowiedź 21 lipca 2020 przez Comandeer Guru (600,810 p.)
wybrane 21 lipca 2020 przez Jakub 0
 
Najlepsza

W niedalekiej przyszłości ten problem nie będzie istnieć, ponieważ przeglądarki chcą serwować domyślnie cookie z opcją SameSite ustawioną na Lax. Istnieje też sporo innych sposobów zabezpieczenia cookies.

komentarz 21 lipca 2020 przez Jakub 0 Pasjonat (23,120 p.)

Dzięki wielkie. Mam jeszcze jedno pytanie, access i refresh tokeny poza tym że mają datę wygaśnięcia to są też u mnie zapisane w bazie danych. Wynika to z tego że kiedy użytkownik się wyloguje to nie ma sensu trzymać po nim jeszcze aktywnych tokenów. Dlatego u mnie poprawność żetonu jest sprawdzana dodatkowo przez jego obecność w bazie danych dla modelu użytkownika. Rzecz jasna, nie ma sensu przechowywać w bazie setek nieaktualnych tokenów, dlatego dla żądań /login oraz /refreshToken wykonywany jest następujący kod:

userSchema.methods.removeExpiredTokens = async function () {
    const user = this;

    user.tokens = user.tokens.filter(token => {
        try { jwt.verify(token.token, process.env.JWT_SECRET); }
        catch (e) { return false; }
        return true;
    });

    user.refreshTokens = user.refreshTokens.filter(token => {
        try { jwt.verify(token.refreshToken, process.env.JWT_SECRET); }
        catch (e) { return false; }
        return true;
    });

    await user.save();
}

Czy według ciebie wykonanie algorytmu usuwania przestarzałych tokenów z bazy przy każdym logowaniu i pozyskiwaniu nowego żetonu nie będzie zbytnio obciążać serwera? Oczywiście nie nazbiera się ich zbyt dużo, bo proces ten będzie wykonywać się regularnie.

komentarz 21 lipca 2020 przez Comandeer Guru (600,810 p.)
Hmm, a przypadkiem tokeny JWT nie są całkowicie bezstanowe i zawierają swoją własną datę ważności?
komentarz 21 lipca 2020 przez Jakub 0 Pasjonat (23,120 p.)

No niby tak, ale kiedy czas życia takiego tokenu wynosi np. 20 min, to kiedy użytkownik się wyloguje to on wciąż będzie jeszcze przez jakiś czas aktualny. Teoretycznie bezpieczniej jak dodatkowo jego poprawność będzie określana również na podstawie jego obecności w bazie danych. Po wylogowaniu się użytkownika, mimo że żeton będzie jeszcze sam w sobie poprawny ( bo jego data ważności nie minie ) to zostanie on wyrzucony z bazy. Nie będzie już możliwości go użyć.

W moim API jest też taki request jak /logoutAll wyrzucający z bazy wszystkie refresh i access tokeny. Wtedy już wszystkie będą niezdalne do użytku ( z punktu widzenia logiki serwera ).

komentarz 21 lipca 2020 przez Comandeer Guru (600,810 p.)
Trochę to się kłóci z ideą JWT, ale rozumiem zamysł. Myślę, że nie powinno być to specjalnie obciążające.
komentarz 21 lipca 2020 przez Jakub 0 Pasjonat (23,120 p.)

Może faktycznie jest to przesada...

Ja po prostu przerabiam kod API z kursu i wykorzystuje już napisane funkcjonalności.

A ty byś ten mechanizm na moim miejscu usunął?

1
komentarz 21 lipca 2020 przez Comandeer Guru (600,810 p.)
Ja bym osobiście nie użył JWT, tylko po prostu mechanizmu sesji po stronie serwera tak po prawdzie. Zwłaszcza, jeśli i tak trzymałbym jakieś dane w bazie.

Niemniej jak masz to już zaimplementowane, to bym to zostawił.
komentarz 21 lipca 2020 przez Jakub 0 Pasjonat (23,120 p.)
A da się w ogóle pogodzić REST API + autoryzacja sesją? No bo ja planuję zrobić aplikacje kliencką w Vue.js oraz np. zalogować się z aplikacji mobilnej. Użycie tokenu nie jest tu jedyną możliwością?

* Bo ja nie chcę generować kodu HTML przez serwer, tylko mieć "niezależną" aplikacje po stronie klienta.
1
komentarz 21 lipca 2020 przez Comandeer Guru (600,810 p.)
Da się, przecież częściowo już to robisz, trzymając dane o zalogowanym użytkowniku w bazie ;)

No i token to niekoniecznie JWT. To tylko jeden z wielu sposobów.

Podobne pytania

0 głosów
1 odpowiedź 408 wizyt
0 głosów
1 odpowiedź 297 wizyt
pytanie zadane 26 lutego 2019 w JavaScript przez Krzysio4224 Obywatel (1,690 p.)
0 głosów
1 odpowiedź 290 wizyt
pytanie zadane 24 maja 2019 w Bezpieczeństwo, hacking przez wsnofi Bywalec (2,680 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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!

...