HTTP Basic Authentication to jeden z najstarszych i najprostszych sposobów zabezpieczenia zasobu hasłem: przeglądarka pyta o login i hasło, a oba trafiają do serwera przy każdym żądaniu. Ta prostota jest jednocześnie jej największą słabością.
Jak powstaje nagłówek Authorization
Login i hasło łączy się dwukropkiem (login:haslo), po czym cały ciąg koduje się w Base64 i umieszcza w nagłówku Authorization: Basic <zakodowany_ciąg>. Przeglądarka automatycznie dołącza ten nagłówek do każdego kolejnego żądania po pierwszym udanym logowaniu.
Dlaczego Base64 to nie bezpieczeństwo
Base64 to schemat kodowania, a nie szyfrowanie: każdy może w kilka sekund zdekodować ciąg z powrotem do postaci login:haslo, bez żadnego klucza. Jeśli żądanie zostanie przechwycone — na przykład w niezabezpieczonej publicznej sieci Wi-Fi — dane uwierzytelniające są natychmiast ujawnione.
Polskie znaki diakrytyczne a rozmiar tokenu Base64
Base64 koduje bajty, nie znaki, więc kodowanie oryginalnego ciągu ma znaczenie. Litera bez znaku diakrytycznego zajmuje w UTF-8 tylko 1 bajt, natomiast polskie znaki ą, ć, ę, ł, ń, ó, ś, ź, ż zajmują po 2 bajty każdy. Hasło takie jak Żółć_Gęślą123 wygeneruje więc zauważalnie dłuższy token Base64 niż hasło czysto ASCII o tej samej liczbie znaków. Do 2015 roku, kiedy powstał RFC 7617, specyfikacja Basic Auth w ogóle nie definiowała kodowania znaków dla loginu i hasła, co bywało źródłem niespójności między różnymi klientami HTTP przy znakach spoza ASCII.
Do czego się to przydaje
- Szybko zabezpieczyć hasłem serwer staging albo narzędzie wewnętrzne w trakcie developmentu.
- Zbudować poprawny nagłówek Authorization do ręcznego testowania API przez curl lub Postmana.
- Zrozumieć, dlaczego Basic Auth przez zwykłe HTTP jest uznawane za poważną lukę bezpieczeństwa.
Basic Auth nie ma wbudowanego mechanizmu wylogowania
Przeglądarka buforuje dane uwierzytelniające i automatycznie dołącza nagłówek Authorization do każdego kolejnego żądania w ramach tego samego origin, dopóki karta nie zostanie zamknięta — protokół po prostu nie przewiduje standardowego przycisku „wyloguj". Aby wymusić wylogowanie użytkownika, serwery uciekają się do sztuczek: celowo zwracają 401 z inną wartością realm albo liczą na to, że użytkownik sam zamknie wszystkie karty przeglądarki.