Wszystkie artykuły

Basic Authentication: jak działa najprostszy sposób ochrony zasobu HTTP

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.

Wypróbuj narzędzie