Nagłówki HTTP
Nagłówki żądań i odpowiedzi: Content-Type, Authorization, Cache-Control.
Wprowadzenie: Metadane Sieci Web
W każdej komunikacji główna wiadomość to tylko część historii. Otacza ją warstwa informacji kontekstowej, czyli metadanych, które informują odbiorcę, jak postępować z wiadomością. Kiedy wysyłasz paczkę pocztową, nie wkładasz po prostu przedmiotu do pudełka; dodajesz etykietę wysyłkową z adresem odbiorcy, adresem nadawcy, wagą i być może specjalnymi instrukcjami, jak 'Ostrożnie'. W cyfrowym świecie sieci, te niezbędne metadane są przekazywane za pomocą .
Nagłówki HTTP są podstawową częścią zarówno komunikatów żądań, jak i odpowiedzi HTTP. Następują po początkowej linii żądania lub statusu i składają się z par nazwa-wartość (w nazwie nie ma znaczenia wielkość liter), oddzielonych dwukropkiem. Na przykład, Content-Type: text/html to nagłówek, który informuje przeglądarkę, że dane, które ma zamiar odebrać, to dokument HTML. Te proste linie tekstu są niezwykle potężne. Kontrolują krytyczne aspekty funkcjonowania sieci, w tym buforowanie przeglądarki, uwierzytelnianie, polityki bezpieczeństwa, kompresję danych i zarządzanie stanem użytkownika za pomocą ciasteczek. Zrozumienie nagłówków to nie tylko techniczny szczegół; to podstawa do zrozumienia, jak budować wydajne, bezpieczne i bogate w funkcje aplikacje internetowe.
Kategorie Nagłówków HTTP
Aby lepiej zorganizować i zrozumieć ich role, nagłówki HTTP są zazwyczaj grupowane w cztery główne kategorie. Chociaż kategoryzacja ta ewoluowała nieznacznie w różnych wersjach specyfikacji HTTP, podział funkcjonalny pozostaje użyteczną ramą do nauki.
- Nagłówki Ogólne (General Headers)
- Te nagłówki mogą być zawarte zarówno w komunikatach żądań, jak i odpowiedzi, i zawierają informacje, które są istotne dla całej wiadomości, a nie tylko dla żądania lub przesyłanego zasobu. Przykłady to
Date, który określa datę i godzinę utworzenia wiadomości, orazConnection, który kontroluje, czy połączenie sieciowe pozostaje otwarte po zakończeniu bieżącej transakcji. - Nagłówki Żądania (Request Headers)
- Te nagłówki są wysyłane tylko przez klienta (np. Twoją przeglądarkę) i dostarczają serwerowi więcej informacji o samym żądaniu i możliwościach klienta. Pozwalają serwerowi dostosować swoją odpowiedź. Przykłady to
User-Agent(identyfikujący przeglądarkę),Accept-Language(określający preferowane języki) iAuthorization(dostarczający poświadczenia). - Nagłówki Odpowiedzi (Response Headers)
- Te nagłówki są wysyłane tylko przez serwer w jego odpowiedzi. Dostarczają dodatkowych informacji o odpowiedzi, które wykraczają poza zawartość samego zasobu. Przykłady to
Server(identyfikujący oprogramowanie serwera),Location(używany do przekierowań) iSet-Cookie(używany do ustawiania ciasteczka u klienta). - Nagłówki Reprezentacji (Representation Headers, dawniej Entity Headers)
- Te nagłówki opisują ładunek lub ciało (body) wiadomości. Mogą pojawiać się zarówno w żądaniach (jak żądanie POST zawierające dane JSON), jak i w odpowiedziach. Opisują format, rozmiar i kodowanie przesyłanego zasobu. Przykłady to
Content-Type,Content-LengthiContent-Encoding.
Szczegółowa Analiza Kluczowych Nagłówków Reprezentacji
Nagłówki reprezentacji są fundamentalne, ponieważ opisują faktyczne dane, które są transferowane. Bez nich przeglądarki i serwery musiałyby zgadywać format danych, co prowadziłoby do błędów i niekompatybilności.
Content-Type
Jest to być może najważniejszy nagłówek reprezentacji. Informuje on odbiorcę o typie medium zasobu w ciele wiadomości. Ta informacja jest kluczowa dla klienta, aby mógł poprawnie przetworzyć treść. Na przykład, przeglądarka musi wiedzieć, czy otrzymuje dokument HTML do wyrenderowania, plik CSS do zastosowania stylów, plik JavaScript do wykonania, czy plik graficzny do wyświetlenia.
Wartością tego nagłówka jest , po którym często następują dodatkowe dyrektywy.
Popularne typy MIME:
text/html: Dla standardowych stron internetowych.text/css: Dla arkuszy stylów.application/javascript: Dla kodu JavaScript.application/json: Dla danych w formacie JSON, popularnym w API.image/jpeg,image/png: Dla obrazów.multipart/form-data: Dla formularzy zawierających przesyłane pliki.
Dyrektywy:
Dyrektywy to dodatkowe parametry. Najczęstszą jest charset, która określa użyte kodowanie znaków (np. ).
Content-Type: text/html; charset=UTF-8Content-Length
Ten nagłówek wskazuje rozmiar ciała wiadomości w bajtach (jako liczba dziesiętna). Jest to prosta, ale niezbędna informacja. Odbiorca używa tej wartości, aby wiedzieć, ile dokładnie danych odczytać z połączenia sieciowego, aby otrzymać kompletne ciało wiadomości. Bez tego odbiorca musiałby czekać, aż serwer zamknie połączenie, aby wiedzieć, że wiadomość jest kompletna, co jest nieefektywne.
Content-Length: 1548Content-Encoding
Ten nagłówek określa algorytm kompresji, który został zastosowany do ciała wiadomości. Aby zaoszczędzić pasmo i skrócić czas ładowania, serwery często kompresują dane przed ich wysłaniem. Przeglądarka, widząc ten nagłówek, wie, że musi zdekompresować ciało, zanim będzie mogła go użyć.
Popularne kodowania:
gzip: Szeroko wspierany i efektywny format kompresji.deflate: Inny powszechny algorytm kompresji.br: Brotli, nowszy algorytm opracowany przez Google, często oferujący lepszą kompresję niż gzip.
Content-Encoding: gzipKluczowe Nagłówki Żądania do Określania Kontekstu i Kontroli
Nagłówki żądania pozwalają klientowi dostarczyć serwerowi niezbędny kontekst na swój temat i na temat tego, czego oczekuje, co umożliwia wszystko, od hostingu wirtualnego po bezpieczne uwierzytelnianie.
Host
Nagłówek Host jest obowiązkowy we wszystkich żądaniach HTTP/1.1. Określa nazwę domenową serwera, z którym klient próbuje się połączyć, oraz opcjonalnie numer portu. Ten nagłówek jest tym, co umożliwia działanie . Jeden serwer z jednym adresem IP może hostować setki różnych stron internetowych. Kiedy żądanie dociera do serwera, używa on nagłówka Host, aby określić, do której strony internetowej żądanie jest skierowane, i serwuje odpowiednią treść.
Host: www.example.comNagłówki Accept-* i Negocjacja Treści
Potężną cechą HTTP jest negocjacja treści. Pozwala to klientowi określić swoje preferencje co do typu treści, którą może obsłużyć, a serwer może wtedy wybrać najodpowiedniejszą reprezentację zasobu do odesłania. Odbywa się to głównie za pomocą zestawu nagłówków Accept-*.
- Accept: Informuje serwer, jakie typy mediów (typy MIME) klient może zrozumieć. Na przykład, przeglądarka może wskazać, że obsługuje HTML, XML i obrazy.
- Accept-Language: Informuje serwer o preferowanych językach użytkownika. Pozwala to serwerowi na odpowiedź ze stroną w języku polskim, angielskim lub niemieckim, w oparciu o ustawienia przeglądarki użytkownika.
- Accept-Encoding: Informuje serwer, jakie algorytmy kompresji obsługuje klient.
Klienci mogą również określać swoje preferencje za pomocą wartości jakości (q-factor), liczby od 0 do 1. Wyższa liczba oznacza wyższą preferencję. Na przykład, Accept-Language: pl, en-US;q=0.9, en;q=0.8 oznacza, że klient preferuje język polski, następnie amerykański angielski, a na końcu dowolny angielski.
Authorization
Ten nagłówek jest standardowym sposobem na dostarczanie poświadczeń w celu uwierzytelnienia klienta na serwerze. Istnieje kilka schematów uwierzytelniania. Dwa najczęstsze to:
- Basic: Ten schemat wysyła nazwę użytkownika i hasło zakodowane w Base64. Nie jest bezpieczny, ponieważ Base64 jest łatwo odkodowywalne, a poświadczenia są przesyłane otwartym tekstem. Powinien być używany wyłącznie przez połączenie HTTPS.
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l - Bearer: Jest to schemat używany w nowoczesnych aplikacjach internetowych, w szczególności z frameworkami takimi jak . Klient wysyła kryptograficzny token (jak JSON Web Token lub JWT), który serwer może zweryfikować, aby udzielić dostępu. Sam token jest uzyskiwany w oddzielnym procesie logowania.
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Nagłówki Buforowania: Przyspieszanie Sieci
Buforowanie (caching) to jeden z najskuteczniejszych sposobów na poprawę wydajności stron internetowych. HTTP dostarcza zaawansowany zestaw nagłówków, które pozwalają deweloperom precyzyjnie kontrolować, jak przeglądarki i pośredniczące serwery proxy buforują odpowiedzi. Pozwala to uniknąć ponownego pobierania zasobów, które się nie zmieniły, oszczędzając czas, pasmo i zasoby serwera.
Cache-Control
Jest to najważniejszy i nowoczesny nagłówek odpowiedzi służący do określania polityk buforowania. Jest to nagłówek ogólny, ale najpotężniejszy w odpowiedziach. Może zawierać różne dyrektywy:
- public: Odpowiedź może być przechowywana przez dowolną pamięć podręczną, w tym współdzielone proxy.
- private: Odpowiedź jest przeznaczona dla jednego użytkownika i nie może być przechowywana przez współdzieloną pamięć podręczną. Prywatna pamięć podręczna przeglądarki użytkownika nadal może ją przechowywać.
- no-store: Odpowiedź nie może być nigdzie buforowana. Jest to przeznaczone dla bardzo poufnych danych.
- no-cache: Ta dyrektywa jest często źle rozumiana. nie oznacza ona „nie buforuj”. Oznacza, że pamięć podręczna musi ponownie zweryfikować z serwerem źródłowym przed użyciem zbuforowanej kopii. Zmusza to pamięć podręczną do sprawdzenia, czy zasób się zmienił, używając nagłówków walidacyjnych, takich jak ETag.
- max-age=: Określa maksymalny czas w sekundach, przez który zasób jest uważany za świeży. Przez ten czas przeglądarka może używać zbuforowanej kopii bez kontaktowania się z serwerem.
# Zbuforuj ten obraz we wszystkich pamięciach podręcznych na rok
Cache-Control: public, max-age=31536000
# Zbuforuj dane specyficzne dla użytkownika w przeglądarce na godzinę
Cache-Control: private, max-age=3600
# Zawsze sprawdzaj z serwerem przed użyciem zbuforowanego HTML
Cache-Control: no-cacheETag i If-None-Match (Walidacja)
Gdy max-age wygaśnie, zbuforowana treść jest uważana za przestarzałą. Jednak zasób na serwerze mógł się faktycznie nie zmienić. Aby uniknąć ponownego pobierania całego pliku, HTTP dostarcza mechanizm walidacji.
- Serwer dołącza nagłówek
ETag(Entity Tag) w swojej pierwotnej odpowiedzi. ETag to unikalny identyfikator lub skrót dla określonej wersji zasobu. - Kiedy przeglądarka musi ponownie zweryfikować przestarzały zasób, wysyła warunkowe żądanie GET i dołącza wartość ETag w nagłówku żądania
If-None-Match. - Serwer porównuje ETag klienta z bieżącą wersją zasobu. Jeśli są takie same, zasób się nie zmienił. Serwer odpowiada specjalnym statusem
304 Not Modifiedi pustym ciałem. Przeglądarka wie wtedy, że może bezpiecznie użyć swojej zbuforowanej kopii na kolejny okres. Oszczędza to znaczną ilość pasma.
Plac zabaw nagłówków HTTP
Przełączaj grupy nagłówków, sprawdzaj co robią i kopiuj poprawny format przesyłu.
Dotyczą całej wiadomości HTTP, niezależnie od kierunku.
Wartości zgodne z RFC 7231 pomagają keszom i klientom ocenić świeżość oraz różnice zegarów.
Typowe zastosowania
- Heurystyki buforowania
- Diagnostyka problemów z czasem
Wskazówka wdrożeniowa
Synchronizuj zegary serwerów z NTP i nie wysyłaj daty późniejszej niż realne nadanie.
Przykład odpowiedzi