/ / Czy sensowne jest przechowywanie JWT w bazie danych? - wiosna, odpoczynek, bezpieczeństwo, oauth-2.0, jwt

Czy przechowywanie JWT w bazie danych ma sens? - wiosna, odpoczynek, bezpieczeństwo, oauth-2.0, jwt

Wdrożyłem podstawowy system uwierzytelnianiaz Spring Boot, Spring Security, OAUTH2 i JWT jako tokeny uwierzytelniające. Działa w porządku, ale zastanawiałem się, czy sensowne jest przechowywanie JWT w bazie danych i sprawdzanie, czy token istnieje za każdym razem, gdy ktoś wysyła uwierzytelnione żądanie za jego pomocą? Myślałem w szczególności o następującym scenariuszu: użytkownik jest uwierzytelniany na urządzeniu mobilnym i gubi je, więc chce cofnąć autoryzację tego urządzenia. Będą wtedy mogli wykonać operację, która usunie tokeny wydane na ich identyfikator użytkownika i cofnie autoryzację wszystkich przypisanych mu tokenów. W jakikolwiek inny sposób? Czy myślę, że to źle lub nadmiernie komplikuje?

Ma to na celu zabezpieczenie interfejsu API REST, który będzie wywoływany z aplikacji mobilnej.

Odpowiedzi:

17 dla odpowiedzi nr 1

Możesz przechowywać JWT w db, ale przegrywaszniektóre zalety JWT. JWT daje tę zaletę, że nie trzeba za każdym razem sprawdzać tokena w bazie danych, ponieważ można po prostu użyć kryptografii, aby sprawdzić, czy token jest prawidłowy. Jeśli musisz wyszukać token w bazie danych, możesz również użyć nieprzezroczystego tokena, który nie przenosi informacji i pozwala serwerowi i bazie danych dostarczyć informacje. Z drugiej strony, jeśli przechowywanie tokena w db, nie sądzę, że JWT jest złym wyborem dla twojego typu tokena. Jak mówisz, istnieją korzyści z odwołania, jeśli przechowujesz token w db. Wszystko zależy od tego, czego chcesz do osiągnięcia (szybsza autoryzacja itp. vs zdolność do odwołania na żądanie).

Nadal możesz używać JWT z OAuth2 bez przechowywaniatokeny w db, jeśli chcesz. JWT mają konfigurowalny czas wygaśnięcia, który można ustawić - po czym są one nieprawidłowe. Tokeny dostępu (bez względu na to, czy JWT, czy nie) powinny być krótkotrwałe ze względów bezpieczeństwa. Jeśli problemem jest kradzież czyjegoś telefonu i zdobycie tokenów dostępu, myślę, że rozwiązaniem jest szybkie wygaśnięcie tych tokenów (30 minut?). Jeśli używasz oauth2, oznacza to, że możesz powstrzymać kogoś od dalszego używania Aplikacja jest przeznaczona dla prawdziwego właściciela do cofnięcia autoryzacji klienta aplikacji mobilnej na serwerze autoryzacji, aby nie było już wydawania tokenów dostępu.


6 dla odpowiedzi nr 2

Możesz ustawić datę ważności (na urządzenia mobilne 1 tydzień). Dodaj niestandardowe pole refreshId dla użytkownika (w tym celu można użyć UUID). Następny zestaw Parametr wystawiony przy roszczeniach („iat”). Sklep refreshId do db i ustaw go jako parametr oświadczeń. Następnie za każdym razem, gdy sprawdzasz poprawność tokena, powinieneś sprawdzić jego „wiek”. Jeśli jest starszy niż godzinę, załaduj dane z DB i sprawdź refreshId wyceń i utwórz nowy token z bieżącą wartością „iat” i wyślij go na urządzenie mobilne. Kiedy musisz dezaktywować tokeny, po prostu wygeneruj nową wartość dla refreshId w db. Po godzinie wszystkie tokeny będą niepoprawne, więc użytkownik będzie musiał ponownie zalogować się na każdym urządzeniu. W razie potrzeby możesz stworzyć niestandardowe rozwiązanie.