Bearer Authorization – mechanizm, bezpieczeństwo, zagrożenia i implementacja
Bearer Authorization to popularny mechanizm uwierzytelniania, szeroko stosowany w aplikacjach korzystających z protokołu HTTP, w tym w systemach opartych na OAuth 2.0. W tym artykule omówimy, czym jest Bearer Authorization, jakie zagrożenia niesie za sobą jego użycie oraz jak można go bezpiecznie zaimplementować.
Co to jest Bearer Authorization?
Bearer Authorization opiera się na przesyłaniu tokenów dostępu w nagłówku HTTP Authorization
. Token dostępu reprezentuje pozwolenie na dostęp do określonych zasobów i jest przesyłany w formie:
Authorization: Bearer <token>
Jak działa Bearer Token?
- Uzyskanie tokena: Klient uzyskuje token dostępu poprzez logowanie, wymianę kodu autoryzacyjnego lub inny mechanizm zgodny z systemem autoryzacji (np. OAuth 2.0).
- Przesyłanie tokena: Klient dołącza token do nagłówka HTTP w żądaniach do serwera.
- Walidacja tokena: Serwer weryfikuje token (np. poprzez porównanie z bazą danych lub weryfikację kryptograficzną).
- Dostęp do zasobów: Jeśli token jest ważny, serwer przyznaje dostęp do żądanych zasobów.
Zalety Bearer Authorization
- Prostota: Mechanizm opiera się na prostym przesyłaniu tokena w nagłówku HTTP.
- Szerokie wsparcie: Obsługiwany przez wiele bibliotek i frameworków.
- Brak konieczności przesyłania hasła: Token może być jednorazowy lub krótkotrwały, co zmniejsza ryzyko naruszenia hasła.
- Elastyczność: Możliwość definiowania uprawnień dla tokenów (scopes).
Zagrożenia związane z Bearer Authorization
- Przechwycenie tokena: Jeśli token zostanie przechwycony przez osobę trzecią (np. w przypadku braku szyfrowania HTTPS), może on zostać wykorzystany do uzyskania dostępu do zasobów.
- Brak powiązania z użytkownikiem: Tokeny typu Bearer są bezpośrednimi dowodami autoryzacji – kto posiada token, ma dostęp.
- Ataki typu Replay: Przechwycony token może zostać ponownie użyty w innym żądaniu.
- Brak ograniczeń czasowych: Tokeny długotrwałe zwiększają ryzyko wykorzystania ich przez atakujących.
- Brak kontroli w przypadku wycieku: Token wyciekający z logów serwera czy przeglądarki może zostać wykorzystany przez osoby trzecie.
Jak bezpiecznie zaimplementować Bearer Authorization?
- Stosuj HTTPS
Nigdy nie przesyłaj tokenów przez niezabezpieczony kanał HTTP. Szyfrowanie TLS chroni token przed przechwyceniem. - Używaj krótkotrwałych tokenów
Generuj tokeny dostępu z ograniczonym czasem ważności (np. 5–15 minut) i udostępnij mechanizm odświeżania tokenów (refresh tokens). - Ogranicz uprawnienia tokenów
Tokeny powinny posiadać minimalny zakres uprawnień niezbędny do wykonania określonych zadań (ang. scopes). - Zabezpiecz przed atakami typu Replay
Dodaj mechanizm weryfikacji jednorazowości żądań (np. nonce lub znacznik czasu). Każde żądanie powinno być unikalne. - Waliduj tokeny po stronie serwera
W przypadku tokenów JWT, weryfikuj ich podpis oraz czas ważności. Jeśli używasz tokenów przechowywanych w bazie danych, upewnij się, że token jest aktywny. - Monitoruj użycie tokenów
Loguj każdą autoryzację i śledź potencjalnie podejrzane wzorce użytkowania (np. żądania z różnych lokalizacji).
7. Unikaj przechowywania tokenów w miejscach narażonych na atak
Nie przechowuj tokenów w przeglądarce (np. localStorage lub sessionStorage), jeśli aplikacja może być podatna na ataki XSS. Zamiast tego można użyć ciasteczek HTTP-Only.
8. Wycofuj tokeny
Zapewnij możliwość unieważniania tokenów, np. w przypadku ich wycieku lub wylogowania użytkownika.
Przykładowa implementacja w PHP
Generowanie tokena:
function generateToken($userId, $secretKey, $expiry = 3600) {
$payload = [
'sub' => $userId,
'iat' => time(),
'exp' => time() + $expiry
];
return base64_encode(json_encode($payload)) . '.' . hash_hmac('sha256', json_encode($payload), $secretKey);
}
$token = generateToken(123, 'secretKey');
echo $token;
Walidacja tokena:
function validateToken($token, $secretKey) {
$parts = explode('.', $token);
if (count($parts) !== 2) {
return false;
}
$payload = json_decode(base64_decode($parts[0]), true);
if (!$payload || $payload['exp'] < time()) {
return false;
}
$signature = hash_hmac('sha256', json_encode($payload), $secretKey);
return hash_equals($signature, $parts[1]);
}
$isValid = validateToken($token, 'secretKey');
if ($isValid) {
echo "Token jest ważny";
} else {
echo "Token jest nieważny";
}
Podsumowanie
Bearer Authorization to potężny mechanizm uwierzytelniania, ale jego skuteczność zależy od bezpiecznej implementacji. Stosowanie HTTPS, ograniczanie uprawnień tokenów oraz środków ochrony przed atakami typu replay może znacznie poprawić poziom bezpieczeństwa. Pamiętaj, że w przypadku wycieku tokena osoba trzecia może uzyskać pełny dostęp, dlatego monitorowanie i unieważnianie tokenów jest kluczowe w zabezpieczaniu aplikacji.