(zrodzony z tego wątku, ponieważ jest to naprawdę kwestia osobna i nie dotyczy NodeJS itp.)
Wdrażam serwer REST API z uwierzytelnianiem i pomyślnie zaimplementowałem obsługę tokenów JWT, dzięki czemu użytkownik może zalogować się przez punkt końcowy / login z nazwą użytkownika / hasłem, po czym token JWT jest generowany z tajnego serwera i zwracany do klient. Token jest następnie przekazywany od klienta do serwera w każdym uwierzytelnionym żądaniu API, na którym klucz tajny serwera jest używany do weryfikacji tokenu.
Jednak staram się zrozumieć najlepsze praktyki dotyczące tego, jak i w jakim stopniu token powinien być walidowany, aby stworzyć prawdziwie bezpieczny system. Co dokładnie powinno być zaangażowane w „walidację” tokena? Czy wystarczy, że podpis można zweryfikować za pomocą klucza serwera, czy też powinienem również porównać token i / lub ładunek tokenu z niektórymi danymi przechowywanymi na serwerze?
System uwierzytelniania oparty na tokenach będzie tak bezpieczny, jak przekazywanie nazwy użytkownika / hasła w każdym żądaniu, pod warunkiem, że uzyskanie tokena jest równie trudne lub trudniejsze niż uzyskanie hasła użytkownika. Jednak w przykładach, które widziałem, jedyne informacje wymagane do utworzenia tokena to nazwa użytkownika i klucz po stronie serwera. Czy nie oznacza to, że zakładając na minutę, że złośliwy użytkownik uzyska wiedzę o tajemnicy serwera, może teraz tworzyć tokeny w imieniu dowolnego użytkownika, tym samym mając dostęp nie tylko do jednego podanego użytkownika, jak miałoby to miejsce w przypadku hasła uzyskane, ale w rzeczywistości do wszystkich kont użytkowników?
To prowadzi mnie do pytań:
1) Czy walidacja tokena JWT powinna być ograniczona do weryfikacji podpisu samego tokena, polegająca na integralności samego klucza serwera, czy też powinna towarzyszyć mu osobny mechanizm walidacji?
W niektórych przypadkach widziałem połączone użycie tokenów i sesji serwera, w których po pomyślnym zalogowaniu się przez punkt końcowy / login została ustanowiona sesja. Żądania API weryfikują token, a także porównują zdekodowane dane znalezione w tokenie z niektórymi danymi przechowywanymi w sesji. Jednak korzystanie z sesji oznacza używanie plików cookie iw pewnym sensie jest to sprzeczne z celem stosowania podejścia opartego na tokenach. Może to również powodować problemy dla niektórych klientów.
Można sobie wyobrazić serwer przechowujący wszystkie aktualnie używane tokeny w memcache lub podobnym, aby zapewnić, że nawet jeśli klucz serwera zostanie naruszony, tak aby atakujący mógł wygenerować „prawidłowe” tokeny, tylko te dokładne tokeny, które zostały wygenerowane przez punkt końcowy / login zostałby zaakceptowany. Czy to rozsądne, czy po prostu zbędne / przesada?
2) Jeśli weryfikacja podpisu JWT jest jedynym sposobem walidacji tokenów, co oznacza, że integralność tajemnicy serwera jest punktem krytycznym, w jaki sposób należy zarządzać tajemnicami serwera? Czytać ze zmiennej środowiskowej i tworzyć (losowo?) Raz na wdrożony stos? Ponownie aktualizowane lub zmieniane okresowo (a jeśli tak, jak obsługiwać istniejące ważne tokeny, które zostały utworzone przed rotacją, ale muszą zostać zweryfikowane po rotacji, być może wystarczy, jeśli serwer zachowuje bieżący i poprzedni sekret w dowolnym momencie) ? Coś innego?
Może jestem po prostu zbyt paranoikiem, jeśli chodzi o ryzyko ujawnienia tajemnicy serwera, co jest oczywiście bardziej ogólnym problemem, który należy rozwiązać we wszystkich sytuacjach kryptograficznych ...
RSAPrivateKey privateKey
??