HTTP protokollet varje webbutvecklare måste veta - del 2

I min tidigare artikel täckte vi några av HTTP: s grunder, till exempel URL-schema, statuskoder och begäran / svarhuvud. Med det som vår grund kommer vi att titta på de finare aspekterna av HTTP, som anslutningshantering, autentisering och HTTP-caching. Dessa ämnen är ganska omfattande, men vi täcker de viktigaste bitarna.


HTTP-anslutningar

En anslutning måste etableras mellan klienten och servern innan de kan kommunicera med varandra, och HTTP använder det tillförlitliga TCP-transportprotokollet för att göra denna anslutning. Som standard använder webtrafik TCP-port 80. En TCP-ström bryts i IP-paket, och det säkerställer att dessa paket alltid kommer fram i rätt ordning utan att misslyckas. HTTP är ett programlagerprotokoll över TCP, vilket är över IP.

HTTPS är en säker version av HTTP, och lägger in ytterligare ett lager mellan HTTP och TCP som heter TLS eller SSL (Transport Layer Security eller Secure Sockets Layer, respektive). HTTPS kommunicerar via port 443 som standard, och vi kommer att titta på HTTPS senare i den här artikeln.

En HTTP-anslutning identifieras av och . På en klient identifieras en HTTP-applikation av a tupel. Att upprätta en anslutning mellan två ändpunkter är en process med flera steg och innefattar följande:

  • lösa IP-adress från värdnamn via DNS
  • upprätta en anslutning till servern
  • skicka en förfrågan
  • vänta på ett svar
  • nära anslutning

Servern ansvarar för att alltid svara med rätt rubriker och svar.

I HTTP / 1.0 stängdes alla anslutningar efter en enda transaktion. Så om en klient ville begära tre separata bilder från samma server gjorde det tre separata anslutningar till fjärrvärden. Som du kan se från ovanstående diagram kan detta introducera mycket nätverksförseningar, vilket resulterar i en suboptimal användarupplevelse.

För att minska fördröjningarna för anslutningsinrättningar infördes HTTP / 1.1 ihållande anslutningar, långlivade förbindelser som är öppna tills kunden stänger dem. Hållbara anslutningar är standard i HTTP / 1.1, och det krävs att en enkel transaktionsanslutning kräver att klienten ställer in Anslutning: nära begära rubrik Detta berättar att servern stänger anslutningen efter att ha skickat svaret.

Förutom ihållande anslutningar använder webbläsare / klienter också en teknik som heter parallella anslutningar, för att minimera nätverksförseningar. Det åldrade begreppet parallella anslutningar innebär att man skapar en anslutningspool (i allmänhet avkortad vid sex anslutningar). Om det finns sex tillgångar som klienten behöver ladda ner från en webbplats, gör klienten sex parallella anslutningar för att hämta dessa tillgångar, vilket resulterar i snabbare vändning. Det här är en stor förbättring jämfört med seriella anslutningar där klienten endast hämtar en tillgång efter att ha laddat ner nedladdningen för en tidigare tillgång.

Parallella anslutningar, i kombination med ihållande anslutningar, är dagens svar för att minimera nätverksförseningar och skapa en jämn upplevelse på klienten. För en fördjupad behandling av HTTP-anslutningar, se avsnittet Anslutningar i HTTP-specifikationen.

Serveranslutningshantering

Servern lyssnar mestadels på inkommande anslutningar och behandlar dem när den mottar en förfrågan. Verksamheten omfattar:

  • upprätta ett uttag för att börja lyssna på port 80 (eller någon annan port)
  • tar emot förfrågan och analyserar meddelandet
  • bearbeta svaret
  • inställning av svarhuvud
  • skickar svaret till klienten
  • stäng anslutningen om a Anslutning: nära begäran om rubrik hittades

Det här är naturligtvis inte en uttömmande lista över verksamheter. De flesta applikationer / webbplatser behöver veta vem som gör en förfrågan för att skapa mer anpassade svar. Detta är riken till Identifiering och autentisering.


Identifiering och autentisering

HTTP är ett programlagerprotokoll över TCP, vilket är över IP.

Det är nästan obligatoriskt att veta vem som ansluter till en server för att spåra en applikations eller webbplatsens användning och användarnas allmänna interaktionsmönster. Identifikationsprincipen är att skräddarsy svaret för att ge en personlig upplevelse. Naturligtvis måste servern veta vem en användare är för att tillhandahålla den funktionen.

Det finns några olika sätt som en server kan samla in den här informationen, och de flesta webbplatser använder en hybrid av dessa tillvägagångssätt:

  • Begär rubriker: Från, referer, User-Agent - Vi såg dessa rubriker i del 1.
  • Klient-IP - klientens IP-adress
  • Fat Urls - lagrar tillståndet för den nuvarande användaren genom att ändra webbadressen och omdirigera till en annan URL på varje klick; varje klick samlar i huvudsak tillstånd.
  • Småkakor - det mest populära och icke-påträngande sättet.

Cookies tillåter servern att bifoga godtycklig information för utgående svar via Set-Cookie svarhuvud. En cookie är inställd med en eller flera name = värde par separerade av semikolon (;), som i Set-Cookie: session-id = 12345ABC; användarnamn = nettuts.

En server kan också begränsa cookies till en specifik domän och väg, och det kan göra dem ihållande med en löper ut värde. Cookies skickas automatiskt av webbläsaren för varje begäran som görs till en server, och webbläsaren ser till att endast domän- och väg-Speciella cookies skickas i förfrågan. Förfrågan header Kaka: namn = värde [; namn2 = värde2] används för att skicka dessa cookies till servern.

Det bästa sättet att identifiera en användare är att kräva att de registrerar sig och loggar in, men att implementera denna funktion kräver en viss insats av utvecklaren, såväl som användaren.

Tekniker som OAuth förenklar denna typ av funktion, men det kräver fortfarande användarens samtycke för att fungera korrekt. Autentisering spelar en stor roll här, och det är förmodligen det enda sättet att identifiera och verifiera användaren.

autentisering

HTTP stöder en rudimentär form av autentisering som heter Grundläggande autentisering, såväl som säkrare Digest Authentication.

I Basic Authentication nekar servern ursprungligen klientens begäran med en WWW-Authenticate svarhuvud och a 401 Ej auktoriserad statuskod. När du tittar på den här rubriken visar webbläsaren en inloggningsdialog som kräver ett användarnamn och lösenord. Denna information skickas i ett bas-64 kodat format i autentisering begära rubrik Servern kan nu validera förfrågan och tillåta åtkomst om referensuppgifterna är giltiga. Vissa servrar kan också skicka en Authentication-Info rubrik som innehåller ytterligare autentiseringsuppgifter.

En följd av Basic-Authentication är Proxy-autentisering. Istället för en webbserver begärs autentikationsutmaningen av en mellanproxy. Proxy skickar en Proxy-Autentisera rubrik med a 407 Ej auktoriserad statuskod. I gengäld ska kunden skicka referenser via Proxy-Tillstånd begära rubrik.

Digest Authentication liknar Basic och använder samma handskakningsteknik med WWW-Authenticate och Tillstånd rubriker, men Digest använder en säkrare hashing-funktion för att kryptera användarnamnet och lösenordet (vanligtvis med MD5 eller KD-digestfunktioner). Även om Digest Authentication ska vara säkrare än Basic använder webbplatser vanligtvis Basic Authentication på grund av dess enkelhet. För att mildra säkerhetsproblemen används Basic Auth i samband med SSL.

Säker HTTP

HTTPS-protokollet ger en säker anslutning på webben. Det enklaste sättet att veta om du använder HTTPS är att kontrollera webbläsarens adressfält. HTTPs säkra komponent innebär att infoga ett lager av kryptering / dekryptering mellan HTTP och TCP. Det här är Secure Sockets Layer (SSL) eller den förbättrade transportlagssäkerheten (TLS).

SSL använder en kraftfull form av kryptering med hjälp av RSA och public key-kryptering. Eftersom säkra transaktioner är så viktiga på webben har en allmänt förekommande standardbaserad Public Key Key Infrastructure (PKI) ansträngning pågått ganska länge.

Befintliga kunder / servrar behöver inte ändra hur de hanterar meddelanden eftersom det mesta av det hårda arbetet händer i SSL-lagret. Således kan du utveckla din webbapplikation med Basic Authentication och skörda automatiskt fördelarna med SSL genom att växla till https: // protokoll. Men för att få webbapplikationen att fungera över HTTPS måste du ha ett fungerande digitalt certifikat som används på servern.

certifikat

Precis som du behöver ID-kort för att visa din identitet behöver en webbserver ett digitalt certifikat för att identifiera sig själv. Certifikat (eller "certs") utfärdas av en certifikatmyndighet (CA) och garanterar din identitet på webben. CA: erna är väktare till PKI. Den vanligaste formen av certifikat är X.509 v3-standarden, som innehåller information, till exempel:

  • certifikatutgivaren
  • Den algoritm som används för certifikatet
  • ämnesnamnet eller organisationen för vilken denna cert är skapad
  • den offentliga nyckelinformationen för ämnet
  • Certifieringsmyndighetens signatur, med den angivna signeringsalgoritmen

När en klient gör en begäran via HTTPS försöker den först att hitta ett certifikat på servern. Om certifikatet hittas försöker det verifiera det mot sin kända lista över certifierade myndigheter. Om det inte är en av de angivna CA: erna, kan det visa en dialogruta för användarens varning om webbplatsens certficate.

När certifikatet är verifierat är SSL-handslaget fullständigt och säker överföring är i kraft.


HTTP-caching

Det är allmänt överens om att göra samma arbete två gånger är slösigt. Detta är vägledande för begreppet HTTP-caching, en grundläggande pelare för HTTP-nätverksinfrastrukturen. Eftersom de flesta operationerna är över ett nätverk, hjälper en cache till att spara tid, kostnad och bandbredd, samt ge en förbättrad upplevelse på webben.

Cacher används på flera ställen i nätverksinfrastrukturen, från webbläsaren till ursprungsservern. Beroende på var den ligger kan en cache kategoriseras som:

  • Privat: I en webbläsare caches användarnamn, lösenord, webbadresser, webbhistorik och webbinnehåll. De är generellt små och specifika för en användare.
  • offentlig: distribueras som caching proxy mellan servern och klienten. Dessa är mycket större eftersom de tjänar flera användare. En vanlig praxis är att hålla flera cache proxies mellan klienten och ursprungsservern. Detta bidrar till att tjäna ofta åtkomst till innehåll, samtidigt som det tillåter en tur till servern för sällan behövs innehåll.

Cache Processing

Oavsett var en cache finns är processen för att behålla en cache ganska lik:

  • Motta begär meddelande.
  • parse webbadressen och rubrikerna.
  • Slå upp en lokal kopia; annars, hämta och lagra lokalt
  • Gör en friskhetskontroll för att bestämma åldern för innehållet i cacheminnet; Gör en förfrågan om att bara uppdatera innehållet om det behövs.
  • Skapa svar från den cachade kroppen och uppdaterade rubriker.
  • Skicka svaret tillbaka till klienten.
  • Valfritt, logga transaktionen.

Självklart är servern ansvarig för att alltid svara med rätt rubriker och svar. Om ett dokument inte har ändrats, ska servern svara med en 304 Ej modifierad. Om den cachade kopian har gått ut bör den generera ett nytt svar med uppdaterade svarhuvud och returnera med en 200 OK. Om resursen raderas bör den komma tillbaka med 404 Ej Hittad. Dessa svar hjälper till att ställa in cacheminnet och se till att det gamla innehållet inte hålls för länge.

Cache Control Headers

Parallella anslutningar, i kombination med ihållande anslutningar, är dagens svar för att minimera nätverksförseningar.

Nu när vi har en känsla av hur en cache fungerar, är det dags att titta på begäran och svarhuvudet som aktiverar cachningsinfrastrukturen. Att hålla innehållet fräscht och aktuellt är ett av de främsta ansvaren för cacheminnet. För att hålla den cachade kopian i enlighet med servern, ger HTTP några enkla mekanismer, nämligen Dokumentets utgång och Server Revalidation.

Dokumentets utgång

HTTP tillåter en ursprungsserver att bifoga en utgångsdatum till varje dokument med hjälp av Cache-Control och Utgår svar rubriker. Detta hjälper klienten och andra cacheservrar att veta hur länge ett dokument är giltigt och friskt. Cacheminnet kan servera kopian så länge som ålder av dokumentet är inom förfallodagen. När ett dokument har löpt ut måste cachen kontrollera med servern för en nyare kopia och uppdatera dess lokala kopia i enlighet med detta.

Utgår är en äldre HTTP / 1.0-responsrubrik som anger värdet som ett absolut datum. Detta är bara användbart om serverns klockor synkroniseras med klienten, vilket är ett hemskt antagande att göra. Den här rubriken är mindre användbar jämfört med den nyare Cache-Control: max-age = rubrik introducerad i HTTP / 1.1. Här, max-ålder är en relativ ålder, specificerad i sekunder, från det att svaret skapades. Således om ett dokument skulle upphöra efter en dag, bör expirationsrubriken vara Cache-Control: max-age = 86400.

Server Revalidation

När ett cachelagrat dokument har löpt ut måste cachen uppdateras med servern för att kontrollera om dokumentet har ändrats. Det här kallas server förnyelse och fungerar som en frågemekanism för inaktuella-ness av ett dokument. Bara för att en cachad kopia har löpt ut betyder inte att servern faktiskt har nyare innehåll. Förnyelse är bara ett sätt att se till att cacheminnet blir friskt. På grund av utgångstiden (som anges i ett tidigare serverns svar) behöver cachen inte kontrollera med servern för varje enskild begäran, vilket sparar bandbredd, tid och sänker nätverkstrafiken.

Kombinationen av expiration av dokument och serverförnyelse är en mycket effektiv mekanism, det gör det möjligt för distribuerade system att behålla kopior med ett utgångsdatum.

Om innehållet är känt att det ofta ändras kan utloppstiden minskas, vilket gör det möjligt för systemen att synkronisera oftare.

Förhöjningstrinnet kan åstadkommas med två typer av begäranhuvuden: If-Modified-Since och Om-None-Match. Den tidigare är för datumbaserad validering medan den senare använder Entity-Tags (ETags), en hash av innehållet. Dessa rubriker använder datum eller ETag-värden som erhållits från ett tidigare serverns svar. I fall att If-Modified-Since, de Senast ändrad svarhuvud används för Om-None-Match, det är ETag svarhuvud.

Kontrollerar kapaciteten

Giltighetsperioden för ett dokument ska definieras av servern som genererar dokumentet. Om det är en tidningswebbplats bör hemsidan gå ut efter en dag (eller ibland även varje timme!). HTTP tillhandahåller Cache-Control och Utgår svarhuvud för att ange utgången på dokument. Som tidigare nämnts, Utgår baseras på absoluta datum och inte en tillförlitlig lösning för kontroll av cacheminnet.

De Cache-Control rubrik är mycket mer användbar och har några olika värden för att begränsa hur klienter ska cacha svaret:

  • Cache-Control: no-cache: Klienten får lagra dokumentet. Det måste dock förlängas med servern vid varje förfrågan. Det heter en HTTP / 1.0-kompatibilitetsrubrik som heter Pragma: No-Cache, som fungerar på samma sätt.
  • Cache-Control: no-store: Detta är ett starkare direktiv till kunden att inte lagra dokumentet alls.
  • Cache-Control: måste-revalidera: Detta berättar för klienten att kringgå sin friskhetsberäkning och alltid förlänga med servern. Det är inte tillåtet att betjäna det cachade svaret om servern inte är tillgänglig.
  • Cache-Control: max-age: Detta anger en relativ utgångstid (i sekunder) från det att svaret genereras.

Som en sida, om servern inte skickar någon Cache-Control rubriker är klienten fri att använda sin egen heuristiska utgångsalgoritm för att bestämma friskhet.

Begränsa friskhet från kunden

Cachability är inte bara begränsad till servern. Det kan också anges från klienten. Detta gör att klienten kan införa begränsningar på vad det är villigt att acceptera. Detta är möjligt via samma Cache-Control header, om än med några olika värden:

  • Cache-Control: min-färsk =: Dokumentet måste vara färskt åtminstone sekunder.
  • Cache-Control: maximal inaktuell eller Cache-Control: max-stale =: Dokumentet kan inte serveras från cacheminnet om det har varit gammalt längre än sekunder.
  • Cache-Control: max-age =: cacheminnet kan inte returnera ett dokument som har cachats längre än sekunder.
  • Cache-Control: no-cache eller Pragma: No-Cache: Klienten accepterar inte en cachad resurs om den inte har förnyats.

HTTP-caching är faktiskt ett mycket intressant ämne, och det finns några mycket sofistikerade algoritmer för att hantera cachad innehåll. För en djupare titt på detta ämne, se avsnittet Caching i HTTP-specifikationen.


Sammanfattning

Vår tur på HTTP började med grunden för URL-scheman, statuskoder och begäran / svarhuvud. På grundval av dessa begrepp tittade vi på några av de finare områdena av HTTP, såsom anslutningshantering, identifiering och autentisering och caching. Jag hoppas att denna turné har gett dig en bra smak för HTTPs bredd och tillräckligt med tips för att ytterligare utforska detta protokoll.

referenser

  • RFC 2616, HTTP-specifikation
  • HTTP-slutgiltig guide