Refresh token, opcja "pozostań zalogowany"

1

Chciałem się upewnić czy dobrze rozumiem idee refresh tokenu i użycie go w celu zaimplementowania opcji automatycznego logowania na stronie.

  • użytkownik podaje login i hasło i zaznacza wspomnianą opcję
  • po poprawnej walidacji, w odpowiedzi z serwera wraca access token oraz refresh token
  • obydwa tokeny są zapisane w localStorage, wraz z flagą stayLoggedIn: true bądź podobną
  • do każdego zapytania HTTP doklejany jest Bearer $accessToken
  • po pewnym czasie odpowiedź z serwera to 401 z wiadomością "token expired"
  • klient (aplikacja frontendowa) w takiej sytuacji (if(stayLoggedIn)) wysyła nowe żądanie na /refreshToken, podając parę tokenów zapisanych w localStorage
  • po stronie serwera, sprawdzane jest czy access token faktycznie wygasł, a poza tym jest w porządku (nie ma z nim innych problemów, jak niezgodność payloadu z kluczem, itp), a także walidowany jest refresh token
  • jeżeli wszystko jest ok, to w odpowiedzi wraca para nowo wygenerowanych access oraz refresh tokenów
  1. Czy mniej więcej tak powinien wyglądać flow takiej funkcjonalności?
  2. Czy access + refresh token powinien być gdzieś zapisany? np. po walidacji struktury tokenów sprawdzam jeszcze w bazie danych czy jest tam para access : refresh token, zgodna z tym co dostałem w requeście
  3. Jak długo zwykle powinien być ważny access a jak długo refresh token? 1 godzina dla access tokena, 7 dni dla refresh tokena? czy zupełnie inny rząd wielkości?
  4. Jeżeli ustawie ważność refresh tokenu na te 7 dni, to w dalszym ciągu w pewnym momencie użytkownik zostanie wylogowany. W jaki sposób więc się przed tym zabezpieczyć? Po stronie frontu weryfikować przy każym requeście ile zostało czasu do wygaśnięcia tokenu i gdy zostanie powiedzmy 10 minut, to od razu wołać /refreshtoken ?
1

Jeżeli ustawie ważność refresh tokenu na te 7 dni, to w dalszym ciągu w pewnym momencie użytkownik zostanie wylogowany. W jaki sposób więc się przed tym zabezpieczyć? Po stronie frontu weryfikować przy każym requeście ile zostało czasu do wygaśnięcia tokenu i gdy zostanie powiedzmy 10 minut, to od razu wołać /refreshtoken?

przecież zawsze user może nie odpalać apki przez taki okres, który przekracza twój expiry

1

@WeiXiao:
Ok, doczytałem gdzieś że okres ważności takich tokenów powinien być nieco dłuższy, nawet do 60 dni, podczas gdy access token powinien żyć krótko, np. 15 minut.
Dodatkowo, localStorage to nie najlepsze miejsce do trzymania tokenów, lepsze będzie HttpOnly cookie.

No a poza tym, jakieś sugestie do tego co wyżej?

1 użytkowników online, w tym zalogowanych: 0, gości: 1