Chciałbym zabezpieczyć swoją aplikację tokenami JWT. Robię to pierwszy raz, a że security to poważny aspekt, przedstawiam tutaj swoją ogólną koncepcję:
- User po zalogowaniu dostaje access_token (JWT) ważny 15 minut oraz refresh_token (randomowy String) ważny 2 tygodnie
- refresh_token zapisywany jest w local storage, access_token local storage + cookie (ze względu na SSR)
- refresh_token zapisuję również na serwerze, wraz z nazwą użytkownika i datą jego wygaśnięcia
- request z nieważnym access_token:
- zwraca np. 401 Unauthorized
- wykonuje kolejny request z access_token i refresh_token
- pobiera nazwę użytkownika z JWT i sprawdza czy refresh_token jest do niego przypisany i ważny
- jeśli tak, to zwraca nowy access_token i refresh_token, aktualizuje odpowiednio po stronie serwera i użytkownika
- jeśli nie to użytkownik zostaje przekierowany na stronę logowania
- refresh_tokeny są okresowo czyszczone po stronie serwera
Jeśli użytkownik się wyloguje lub usunie konto, to czyszczę mu tokeny po stronie klienta.
Problem, który widzę, to w momencie kiedy strona wykona dwa równoczesne requesty z przeterminowanym access_token. Pierwszy wyśle mu nowy token, drugi go wyloguje, bo refresh_token będzie już nieprawidłowy. Na chwilę obecną nie wiem za bardzo jak to rozwiązać po stronie frontu.
Czy są tu jeszcze jakieś babole? Czy takie rozwiązanie jest w miarę OK? Czy implementując to znowu wynajduję koło na nowo? :)