Kilka scenariuszy może pomóc zilustrować cel dostępu i odświeżania tokenów oraz kompromisy inżynieryjne w projektowaniu systemu oauth2 (lub dowolnego innego auth):
Scenariusz aplikacji internetowej
W scenariuszu aplikacji internetowej masz kilka opcji:
- jeśli masz własne zarządzanie sesjami, przechowuj zarówno access_token, jak i refresh_token względem identyfikatora sesji w stanie sesji w usłudze stanu sesji. Gdy użytkownik zażąda strony wymagającej dostępu do zasobu, użyj tokenu access_token, a jeśli wygasł access_token, skorzystaj z tokenu refresh, aby uzyskać nowy.
Wyobraźmy sobie, że komuś uda się porwać twoją sesję. Jedyne, co jest możliwe, to poprosić o swoje strony.
- jeśli nie masz zarządzania sesjami, umieść token dostępu w pliku cookie i użyj go jako sesji. Następnie, ilekroć użytkownik zażąda stron z serwera WWW, wyślij token dostępu. Twój serwer aplikacji może w razie potrzeby odświeżyć token dostępu.
Porównywanie 1 i 2:
W 1, access_token i refresh_token poruszają się po sieci tylko na drodze między serwerem authorzation (Google w twoim przypadku) a serwerem aplikacji. Odbyłoby się to na bezpiecznym kanale. Haker może przejąć sesję, ale będzie mógł wchodzić w interakcje tylko z Twoją aplikacją internetową. W 2 haker może zabrać access_token i utworzyć własne żądania do zasobów, do których użytkownik udzielił dostępu. Nawet jeśli haker przejmie token dostępu, będzie miał tylko krótkie okno, w którym będzie mógł uzyskać dostęp do zasobów.
Tak czy inaczej, refresh_token i clientid / secret są znane tylko serwerowi, co uniemożliwia przeglądarce internetowej uzyskanie długoterminowego dostępu.
Wyobraźmy sobie, że wdrażasz oauth2 i ustaw długi limit czasu na tokenie dostępu:
W 1) Nie ma dużej różnicy między tokenem o krótkim i długim dostępie, ponieważ jest on ukryty na serwerze aplikacji. W 2) ktoś może uzyskać token_dostępu w przeglądarce, a następnie użyć go do bezpośredniego dostępu do zasobów użytkownika przez długi czas.
Scenariusz mobilny
Na telefonie komórkowym jest kilka znanych mi scenariuszy:
Przechowuj clientid / secret na urządzeniu i poproś urządzenie, aby uzyskało dostęp do zasobów użytkownika.
Użyj serwera aplikacji zaplecza, aby przechować identyfikator klienta / klucz tajny i zlecić mu wykonanie operacji. Użyj access_token jako rodzaju klucza sesji i przekaż go między klientem a serwerem aplikacji.
Porównywanie 1 i 2
W 1) Gdy już masz identyfikator klienta / sekret na urządzeniu, nie są one już tajne. Każdy może dekompilować, a następnie zacząć działać tak, jakby to był użytkownik, oczywiście za zgodą użytkownika. Access_token i refresh_token są również w pamięci i można uzyskać do nich dostęp na zaatakowanym urządzeniu, co oznacza, że ktoś może działać jako twoja aplikacja bez podania przez użytkownika ich poświadczeń. W tym scenariuszu długość access_token nie ma znaczenia dla hackability, ponieważ refresh_token znajduje się w tym samym miejscu, co access_token. W 2) klient / klucz tajny lub token odświeżania są zagrożone. Tutaj długość wygaśnięcia access_token określa, jak długo haker może uzyskać dostęp do zasobów użytkowników, jeśli je zdobędzie.
Okresy ważności
Tutaj zależy od tego, co zabezpieczasz w systemie uwierzytelniania, jak długo powinna trwać ważność twojego access_token. Jeśli jest to coś szczególnie cennego dla użytkownika, powinno być krótkie. Coś mniej cennego, może być dłuższe.
Niektóre osoby, takie jak Google, nie wygasają odświeżania. Niektóre takie jak Stackflow. Decyzja o wygaśnięciu jest kompromisem między łatwością obsługi a bezpieczeństwem. Długość tokenu odświeżania jest związana z długością zwracaną przez użytkownika, tj. Ustaw odświeżanie na to, jak często użytkownik powraca do Twojej aplikacji. Jeśli token odświeżania nie wygasa, jedynym sposobem na jego odwołanie jest jawne odwołanie. Zwykle logowanie nie zostanie cofnięte.
Mam nadzieję, że post o długości jest przydatny.