Jaki jest cel „Odśwież tokena”?

111

Mam program, który integruje się z interfejsem YouTube Live Streaming API. Działa na licznikach czasu, więc stosunkowo łatwo było mi zaprogramować, aby pobierać nowy token dostępu co 50 minut za pomocą tokena odświeżania. Moje pytanie brzmi: dlaczego?

Kiedy uwierzytelniłem się w YouTube, dostałem token odświeżania. Następnie używam tego tokena odświeżania, aby uzyskać nowy token dostępu mniej więcej raz na godzinę. Jeśli mam token odświeżania, ZAWSZE mogę go użyć, aby uzyskać nowy token dostępu, ponieważ nigdy nie wygasa. Więc nie widzę, jak to jest bezpieczniejsze niż po prostu dać mi Access Token od samego początku i nie zawracać sobie głowy całym systemem Refresh Token.

Jason Axelrod
źródło
3
Token dostępu to tokeny okaziciela . Oznacza to, że żadna inna identyfikacja nie jest wymagana, a token dostępu to wszystko, co jest potrzebne do podszywania się pod Ciebie. Z tego powodu powinny zawsze pozostać krótkotrwałe. Z drugiej strony tokeny odświeżania nie są tokenami okaziciela . Kiedy wysyłasz token odświeżania do YouTube, aby uzyskać nowy token dostępu, musisz także wysłać client_id i client_secret. Z tego powodu token odświeżania może trwać dłużej, ponieważ jest znacznie mniej prawdopodobne, że zarówno token odświeżania, jak i client_secret zostaną naruszone.
jrahhali

Odpowiedzi:

96

Zasadniczo tokeny odświeżania służą do uzyskiwania nowego tokena dostępu.

Aby wyraźnie rozróżnić te dwa tokeny i uniknąć pomieszania, oto ich funkcje podane w strukturze autoryzacji OAuth 2.0 :

  • Tokeny dostępu są wydawane klientom zewnętrznym przez serwer autoryzacji za zgodą właściciela zasobu. Klient używa tokenu dostępu, aby uzyskać dostęp do chronionych zasobów hostowanych przez serwer zasobów.
  • Tokeny odświeżania to poświadczenia używane do uzyskiwania tokenów dostępu. Tokeny odświeżania są wydawane klientowi przez serwer autoryzacji i służą do uzyskania nowego tokenu dostępu, gdy bieżący token dostępu stanie się nieważny lub wygaśnie, lub też w celu uzyskania dodatkowych tokenów dostępu o identycznym lub węższym zakresie.

Teraz, aby odpowiedzieć na pytanie, dlaczego nadal otrzymywałeś token odświeżania, zamiast tylko zabezpieczać token dostępu, głównym powodem podanym przez Internet Engineering Task Force w tokenach odświeżania jest:

Istnieje powód bezpieczeństwa, refresh_tokenjest on wymieniany tylko z serwerem autoryzacyjnym, podczas gdy access_tokenjest wymieniany z serwerami zasobów. Zmniejsza to ryzyko wycieku długotrwałego access_token w „token dostępowym ważny przez godzinę, z tokenem odświeżania ważnym przez rok lub ważnym do odwołania” vs ”token dostępu ważny do odwołania bez odświeżania znak."

Aby uzyskać bardziej szczegółowe i pełne informacje o przepływie OAuth 2.0, zapoznaj się z następującymi źródłami:

Teyam
źródło
5
Czy odświeżanie tokena powinno również pomóc w uzyskaniu nowego tokena odświeżania?
Gherman
6
Dlaczego po prostu nie uzyskać nowego krótkoterminowego access_token, gdy wygasa? Po co mieć długotrwały refresh_token, jeśli mimo wszystko chcesz zażądać od serwera nowego access_token? A może prawdą jest, że z refresh_tokenem nie muszę utrzymywać aktywnego pliku cookie dostawcy tożsamości i wydaje nowe access_tokens na podstawie refresh_token nawet po tym, jak plik cookie już dawno zniknął, a użytkownik musiałby wprowadzić swoje poświadczenia, gdyby chciał uzyskać nowy access_token?
JustAMartin
2
@JustAMartin Jako klient OAuth2, bez odświeżania tokena, musiałbym ponownie zainicjować cały przepływ autoryzacji (zmuszając użytkownika do 'logowania' i ponownego przyznania mi uprawnień), aby otrzymać kolejny token dostępu. Odśwież tokeny omijają ten wymóg jako swego rodzaju „dowód”, że ja jako Klient otrzymałem już zgodę Użytkownika na zażądanie tokena dostępu.
jrahhali
czy token odświeżania może mieć takie same lub takie same dane jak token dostępu? ponieważ głównym zastosowaniem odświeżania tokena jest ułatwienie użytkownikom korzystania z usługi i ograniczenie czasu dostępu hakerów do zasobu.
DaviesTobi alex
10

@Teyam wzmiankuje SO post Dlaczego OAuth v2 ma zarówno tokeny dostępu, jak i odświeżania? ale wolę inną odpowiedź tam: https://stackoverflow.com/a/12885823/254109

TL; DR refresh_token nie zapewnia zwiększonego bezpieczeństwa. Ma to na celu poprawę skalowalności i wydajności. Następnie access_tokenmoże być przechowywany tylko w jakimś szybkim, tymczasowym magazynie (takim jak pamięć). Umożliwia także autoryzację i separację serwerów zasobów.

xmedeko
źródło
3
poza tym, że istnieje powód bezpieczeństwa, jak wspomniał @Teyam: "refresh_token jest wymieniany tylko z serwerem autoryzacji, podczas gdy access_token jest wymieniany z serwerami zasobów"
huyz
3
Jest to bezpieczniejsze tylko wtedy, gdy założymy, że serwer autoryzacji jest w jakiś sposób lepiej zabezpieczony jako serwer zasobów. Jeśli tak nie jest, w rzeczywistości jest to mniej bezpieczne. Jeśli token odświeżania jest zagrożony, mogę go po prostu użyć, aby uzyskać nowy token dostępu.
Arno van Lieshout
TL; DR ?? czy to naprawdę?
Hos Mercury
10

Token odświeżania służy co najmniej dwóm celom. Po pierwsze, token odświeżania jest rodzajem „dowodu”, że klient OAuth2 otrzymał już pozwolenie od użytkownika na dostęp do jego danych, więc może ponownie zażądać nowego tokena dostępu bez konieczności przechodzenia przez cały przepływ OAuth2. Po drugie, pomaga zwiększyć cały przepływ zabezpieczeń w porównaniu z długowiecznym tokenem dostępu. Omówię oba te punkty bardziej szczegółowo.

Odśwież tokeny, aby nie denerwować użytkownika

Porozmawiajmy o pierwszym celu na przykładzie. Załóżmy, że Ty, jako użytkownik, korzystasz z aplikacji internetowej klienta innej firmy, która chce wejść w interakcję z danymi Twojego konta YouTube. Czy po udzieleniu aplikacji klienckiej pozwolenia na wykorzystanie danych z YouTube chcesz, aby aplikacja kliencka wyświetlała monit o wyrażenie zgody? ponowniekiedy wygasł jego token YouTube? Co się stanie, jeśli czas wygaśnięcia tokena YouTube będzie bardzo krótki, np. 5 minut. Byłoby trochę denerwujące, gdyby aplikacja klienta pytała Cię o zgodę co najmniej co 5 minut! Rozwiązaniem proponowanym przez OAuth2 dla tego „problemu” są tokeny odświeżania. Korzystając z tokenów odświeżania, token dostępu może pozostać krótkotrwały (co jest pożądane w przypadku wycieku lub kradzieży tokena dostępu), a token odświeżania może pozostać długo (er) żywy, umożliwiając Klientowi uzyskanie nowego dostępu token, gdy wygasa bez wymagania zgody użytkownika (ponownie).

Ale po co token odświeżania? Jeśli chodzi o to, aby nie zaniepokoić Użytkownika prośbami o pozwolenie, to dlaczego klient nie może po prostu powiedzieć „Hej, serwer autoryzacji, chcę innego tokena dostępu. Teraz!”? Lub „Hej serwer autoryzacyjny, oto mój wygasły token, daj mi nowy!”. Cóż, token odświeżania służy jako swego rodzaju „dowód”, że Klient w pewnym momencie uzyskał dostęp od Użytkownika. Ten „dowód” ma postać tokena odświeżania podpisanego cyfrowo przez serwer autoryzacji. Przedstawiając przez Klienta token odświeżania, Serwer Autoryzacji może zweryfikować, czy Klient w pewnym momencie w przeszłości otrzymał pozwolenie od Użytkownika, a Klient nie musi ponownie pytać Użytkownika.

Odśwież token jako sposób na zwiększenie bezpieczeństwa

W związku z tym pojawia się pytanie: „Cóż, co się stanie, jeśli token odświeżania zostanie ujawniony lub skradziony lub po prostu przechowywany przez złośliwą aplikację klienta, która nie pozbywa się go na żądanie użytkownika? Czy osoba atakująca nie może po prostu kontynuować używać tokena odświeżania, aby uzyskać ważny token dostępu na czas nieokreślony (lub do czasu jego wygaśnięcia)? To pytanie prowadzi do omówienia drugiego celu, o którym wspomniałem, odświeżania tokenów przyczyniających się do bezpieczniejszego przepływu.

Problem, który pojawia się w przypadku tokenów dostępu, polega na tym, że raz nabyte są one zawsze przedstawiane tylko na serwerze zasobów (na przykład w YouTube). Jeśli więc token dostępu zostanie skradziony lub przejęty, jak powiedzieć serwerowi zasobów, aby nie ufał temu tokenowi? Cóż, naprawdę nie możesz. Jedynym sposobem na to byłaby zmiana prywatnego klucza podpisu na serwerze autoryzacyjnym (klucz, który w pierwszej kolejności podpisał token). Wyobrażam sobie, że jest to niewygodne, aw niektórych przypadkach (np. Auth0) nie jest obsługiwane.

Z drugiej strony tokeny odświeżania muszą być często przedstawiane serwerowi autoryzacji, więc jeśli ktoś zostanie naruszony, to trywialne jest unieważnienie lub odrzucenie tokena odświeżania jako całości i nie trzeba zmieniać żadnych kluczy podpisywania.

jrahhali
źródło
9

„Więc nie widzę, jak to jest bezpieczniejsze niż po prostu dać mi Access Token od samego początku i nie zawracać sobie głowy całym systemem Refresh Token”. Zmagałem się z tym samym pytaniem. Krótka odpowiedź brzmi: token odświeżania jest niezbędny, aby upewnić się, że poświadczenia nie wygasły.

Przykład może pomóc: mam bazę danych, w której przechowywane są twoje dane medyczne. Zgadzasz się na udostępnienie swojej dokumentacji medycznej współmałżonkowi. Twój współmałżonek używa swojego Access Token, aby odczytać Twoje rekordy z mojej bazy danych. Za dwa tygodnie twój współmałżonek ponownie sprawdzi twoją dokumentację medyczną i użyje token odświeżania, aby upewnić się, że nadal ma pozwolenie (z serwera uwierzytelniającego) na przeglądanie twoich danych. Token odświeżania omija potrzebę ponownego wprowadzenia przez współmałżonka swoich poświadczeń (nazwy użytkownika i hasła) na serwerze uwierzytelniającym, ale zapewnia, że ​​nadal mają uprawnienia dostępu do zasobu. Nigdy nie wygasający token dostępu nie wiedziałby, czy cofnąłeś prawa współmałżonka do dostępu do swojej dokumentacji medycznej.

Adam Cole
źródło