HTTP Protokollen hver webutvikler må vite - del 2

I min tidligere artikkel dekket vi noen av HTTPs grunnleggende, for eksempel URL-ordningen, statuskoder og forespørsel / svarhodet. Med det som grunnlag, vil vi se på de finere aspektene ved HTTP, for eksempel tilkoblingshåndtering, autentisering og HTTP-caching. Disse emnene er ganske omfattende, men vi dekker de viktigste brikkene.


HTTP-tilkoblinger

Det må etableres en tilkobling mellom klienten og serveren før de kan kommunisere med hverandre, og HTTP bruker den pålitelige TCP-transportprotokollen for å gjøre denne tilkoblingen. Som standard bruker webtrafikk TCP-port 80. En TCP-strøm er delt inn i IP-pakker, og det sikrer at disse pakkene alltid kommer i riktig rekkefølge uten å feile. HTTP er en applikasjonslagprotokoll over TCP, som er over IP.

HTTPS er en sikker versjon av HTTP, og legger inn et ekstra lag mellom HTTP og TCP som heter TLS eller SSL (henholdsvis Transport Layer Security eller Secure Sockets Layer). HTTPS kommuniserer via port 443 som standard, og vi vil se på HTTPS senere i denne artikkelen.

En HTTP-tilkobling er identifisert av og . På en klient er et HTTP-program identifisert av a tuppel. Etablering av en forbindelse mellom to endepunkter er en multi-trinns prosess og involverer følgende:

  • løse IP-adressen fra vertsnavnet via DNS
  • opprett en forbindelse med serveren
  • send en forespørsel
  • vent på svar
  • nær tilknytning

Serveren er ansvarlig for alltid å svare med de riktige overskriftene og svarene.

I HTTP / 1.0 ble alle tilkoblinger stengt etter en enkelt transaksjon. Så, hvis en klient ønsket å be om tre separate bilder fra samme server, gjorde det tre separate forbindelser til den eksterne verten. Som du ser fra diagrammet ovenfor, kan dette introdusere mange forsinkelser i nettverket, noe som resulterer i en suboptimal brukeropplevelse.

For å redusere forbindelses-etableringsforsinkelser, introduserte HTTP / 1.1 vedvarende forbindelser, Langlivede forbindelser som forblir åpne til klienten lukker dem. Vedvarende tilkoblinger er standard i HTTP / 1.1, og det å foreta en enkelt transaksjonsforbindelse krever at klienten stiller inn Tilkobling: Lukk be om header. Dette forteller at serveren skal lukke tilkoblingen etter å ha sendt svaret.

I tillegg til vedvarende forbindelser bruker nettlesere / klienter også en teknikk, kalt parallelle tilkoblinger, for å minimere forsinkelser i nettverket. Det eldgamle konseptet med parallelle tilkoblinger innebærer å skape et basseng av tilkoblinger (vanligvis på seks tilkoblinger). Hvis det er seks eiendeler som klienten trenger å laste ned fra et nettsted, gjør klienten seks parallelle tilkoblinger for å laste ned disse eiendelene, noe som resulterer i en raskere tilbakeslag. Dette er en stor forbedring over serielle tilkoblinger der klienten bare laster ned en ressurs etter at du har fullført nedlastingen for en tidligere ressurs.

Parallelle tilkoblinger, i kombinasjon med vedvarende tilkoblinger, er dagens svar for å minimere nettverksforsinkelser og skape en jevn opplevelse på klienten. For en grundig behandling av HTTP-tilkoblinger, se Tilkoblinger-delen av HTTP-spesifikasjonen.

Tilkoblingshåndtering på server side

Serveren lytter mest etter innkommende tilkoblinger og behandler dem når den mottar en forespørsel. Operasjonene innebærer:

  • opprette en stikkontakt for å begynne å lytte på port 80 (eller en annen port)
  • mottar forespørselen og analyserer meldingen
  • behandler svaret
  • angir svarhodene
  • sender svaret til klienten
  • lukk forbindelsen hvis a Tilkobling: Lukk forespørselsoverskrift ble funnet

Selvfølgelig er dette ikke en uttømmende liste over operasjoner. De fleste applikasjoner / nettsteder trenger å vite hvem som gjør en forespørsel for å skape mer tilpassede svar. Dette er riket til identifikasjon og godkjenning.


Identifikasjon og godkjenning

HTTP er en applikasjonslagprotokoll over TCP, som er over IP.

Det er nesten obligatorisk å vite hvem som kobler til en server for å spore en apps eller nettstedets bruk og de generelle samhandlingsmønstrene til brukerne. Forutsetningen for identifikasjon er å skreddersy svaret for å gi en personlig opplevelse; Naturligvis må serveren vite hvem en bruker er for å kunne tilby den funksjonaliteten.

Det er noen forskjellige måter en server kan samle inn denne informasjonen, og de fleste nettsteder bruker en hybrid av disse tilnærmingene:

  • Behovsoverskrifter: Fra, Referer, Bruker agent - Vi så disse topptekstene i del 1.
  • Klient-IP - IP-adressen til klienten
  • Fat Urls - lagrer tilstanden til den nåværende brukeren ved å endre URL-adressen og omdirigere til en annen nettadresse på hvert klikk; hvert klikk samler i hovedsak tilstand.
  • kjeks - den mest populære og ikke-påtrengende tilnærmingen.

Cookies tillater at serveren legger til vilkårlig informasjon for utgående svar via Set-Cookie svar overskrift. En informasjonskapsel er satt med en eller flere name = verdi par skilt av semikolon (;), som i Set-Cookie: session-id = 12345ABC; username = nettuts.

En server kan også begrense informasjonskapslene til et bestemt domene og sti, og det kan gjøre dem vedholdende med en utløper verdi. Cookies sendes automatisk av nettleseren for hver forespørsel til en server, og nettleseren sikrer at bare domene- og sti-Spesifikke informasjonskapsler sendes i forespørselen. Forespørselsoverskriften Cookie: navn = verdi [; name2 = value2] brukes til å sende disse informasjonskapslene til serveren.

Den beste måten å identifisere en bruker på er å kreve at de registrerer seg og logger på, men implementeringen av denne funksjonen krever en viss innsats av utvikleren, samt brukeren.

Teknikker som OAuth forenkler denne typen funksjon, men det krever fortsatt brukerens samtykke for å kunne fungere riktig. Autentisering spiller en stor rolle her, og det er trolig den eneste måten å identifisere og verifisere brukeren på.

Godkjenning

HTTP støtter en rudimentær form for godkjenning som kalles Grunnleggende godkjenning, så vel som sikrere Digest-godkjenning.

I grunnleggende godkjenning nekter serveren først og fremst klientens forespørsel med en WWW-Verifisere svarheader og a 401 Uautorisert statuskode. Ved å se denne overskriften, viser nettleseren en innloggingsdialog, som ber om et brukernavn og passord. Denne informasjonen sendes i et base-64 kodet format i Godkjenning be om header. Serveren kan nå validere forespørselen og gi tilgang hvis legitimasjonene er gyldige. Noen servere kan også sende en Autentisering-Info header med ytterligere autentiseringsdetaljer.

En følge av grunnleggende autentisering er Proxy-godkjenning. I stedet for en webserver blir autentiseringsutfordringen forespurt av en mellomliggende proxy. Fullmakten sender en Proxy-Verifisere header med a 407 Uautorisert statuskode. Til gjengjeld skal klienten sende legitimasjonene via Proxy-Authorization be om header.

Digest Authentication ligner Basic og bruker samme håndtrykksteknikk med WWW-Verifisere og Autorisasjon overskrifter, men Digest bruker en sikrere hashing-funksjon for å kryptere brukernavnet og passordet (vanligvis med MD5 eller KD-fordøyelsesfunksjoner). Selv om Digest Authentication skal være sikrere enn Basic, bruker nettsteder vanligvis Basic Authentication på grunn av det enkle. For å redusere sikkerhetsproblemene, er Basic Auth brukt i forbindelse med SSL.

Sikker HTTP

HTTPS-protokollen gir en sikker tilkobling på nettet. Den enkleste måten å vite om du bruker HTTPS, er å sjekke nettleserens adressefelt. HTTPs sikre komponent innebærer å sette inn et lag av kryptering / dekryptering mellom HTTP og TCP. Dette er Secure Sockets Layer (SSL) eller forbedret Transport Layer Security (TLS).

SSL bruker en kraftig form for kryptering ved hjelp av RSA og public key-kryptering. Fordi sikre transaksjoner er så viktige på nettet, har en allestedsnærværende standardbasert Public Key Key Infrastructure (PKI) innsats for ganske en gang.

Eksisterende klienter / servere trenger ikke å endre måten de håndterer meldinger på, fordi det meste av det harde arbeidet skjer i SSL-laget. Dermed kan du utvikle webapplikasjonen din ved hjelp av Basic Authentication, og høst automatisk fordelene ved SSL ved å bytte til https: // protokoll. Men for å få webapplikasjonen til å fungere over HTTPS, må du ha et fungerende digitalt sertifikat utplassert på serveren.

sertifikater

Akkurat som du trenger ID-kort for å vise identiteten din, trenger en webserver et digitalt sertifikat for å identifisere seg. Sertifikater (eller "certs") utstedes av en sertifiseringsinstans (CA) og garanterer din identitet på nettet. CA er foresatte av PKI. Den vanligste formen for sertifikater er X.509 v3-standarden, som inneholder informasjon, for eksempel:

  • sertifikatutstederen
  • algoritmen som brukes til sertifikatet
  • fagnavnet eller organisasjonen for hvem denne cert er opprettet
  • offentlig nøkkelinformasjon for emnet
  • Sertifiseringsmyndighetens signatur, ved hjelp av den angitte signeringsalgoritmen

Når en klient gjør en forespørsel over HTTPS, forsøker den først å finne et sertifikat på serveren. Hvis certifikatet er funnet, forsøker det å verfiy det mot sin kjente liste over CA'er. Hvis det ikke er en av de oppgitte CA, kan det vise en dialog til brukerens advarsel om nettstedets certficate.

Når sertifikatet er bekreftet, er SSL-håndtrykk fullført og sikker overføring er i kraft.


HTTP Caching

Det er generelt avtalt at det å gjøre det samme arbeidet to ganger er sløsing. Dette er hovedprinsippet om begrepet HTTP-caching, en grunnleggende søyle for HTTP-nettverksinfrastrukturen. Fordi de fleste operasjonene er over et nettverk, hjelper en hurtigbuffer med å spare tid, kostnad og båndbredde, samt gi en bedre opplevelse på nettet.

Caches brukes på flere steder i nettverksinfrastrukturen, fra nettleseren til opprinnelsesserveren. Avhengig av hvor den befinner seg, kan en cache kategoriseres som:

  • Privat: I en nettleser caches brukernavn, passord, nettadresser, nettleserlogg og webinnhold. De er generelt små og spesifikke for en bruker.
  • Offentlig: Utplassert som caching proxy mellom server og klient. Disse er mye større fordi de tjener flere brukere. En vanlig praksis er å holde flere caching-proxyer mellom klienten og opprinnelsesserveren. Dette bidrar til å betjene ofte åpnet innhold, samtidig som det tillates en tur til serveren for sjelden nødvendig innhold.

Cache Processing

Uansett hvor en cache er plassert, er prosessen med å opprettholde en cache ganske lik:

  • Motta forespørsel melding.
  • Analyser nettadressen og overskriftene.
  • Se opp en lokal kopi; ellers, hent og lagre lokalt
  • Gjør a friskhetskontroll å bestemme alder av innholdet i hurtigbufferen; Be om å oppdatere innholdet bare hvis det er nødvendig.
  • Opprett respons fra den bufret kroppen og oppdaterte overskrifter.
  • Sende svaret tilbake til klienten.
  • eventuelt, Logg transaksjonen.

Selvfølgelig er serveren ansvarlig for alltid å svare med de riktige overskriftene og svarene. Hvis et dokument ikke er endret, skal serveren svare med en 304 ikke endret. Hvis den bufret kopien er utløpt, skal den generere et nytt svar med oppdaterte svarhodene og returnere med en 200 OK. Hvis ressursen slettes, skal den komme tilbake med 404 ikke funnet. Disse svarene hjelper til med å justere cachen og sørge for at uaktuelt innhold ikke holdes for lenge.

Cache Control Headers

Parallelle tilkoblinger, i kombinasjon med vedvarende tilkoblinger, er dagens svar for å minimere nettverksforsinkelser.

Nå som vi har en følelse av hvordan en cache fungerer, er det på tide å se på forespørselen og svarhodene som aktiverer cache-infrastrukturen. Å holde innholdet friskt og oppdatert er et av de viktigste ansvarene for hurtigbufferen. For å holde den hurtigbufrede kopien konsistent med serveren, gir HTTP noen enkle mekanismer, nemlig Dokumentets utløp og Server Revalidation.

Dokumentets utløp

HTTP tillater en opprinnelsesserver å legge ved en utløpsdato til hvert dokument ved hjelp av Cache-Control og utløper respons overskrifter. Dette hjelper klienten og andre cache-servere å vite hvor lenge et dokument er gyldig og frisk. Cachen kan tjene kopien så lenge som alder av dokumentet er innen utløpsdato. Når et dokument utløper, må hurtigbufferen sjekke med serveren for en nyere kopi og oppdatere sin lokale kopi tilsvarende.

utløper er en eldre HTTP / 1.0 respons header som spesifiserer verdien som en absolutt dato. Dette er bare nyttig hvis serverklokkene synkroniseres med klienten, noe som er en forferdelig antakelse om å gjøre. Denne overskriften er mindre nyttig sammenlignet med nyere Cache-Control: maksimal alder = header introdusert i HTTP / 1.1. Her, max-age er en relativ alder, spesifisert i sekunder, fra det tidspunktet svaret ble opprettet. Dermed hvis et dokument skal utløpe etter en dag, bør utløpshovedet være Cache-Control: maksimal alder = 86400.

Server Revalidation

Når et hurtigbufret dokument utløper, må hurtigbufferen fornyes med serveren for å sjekke om dokumentet er endret. Dette kalles server fornyelse og fungerer som en spørringsmekanisme for foreldet-ness av et dokument. Bare fordi en bufret kopi er utløpt, betyr det ikke at serveren faktisk har nyere innhold. Revalidation er bare et middel for å sikre at hurtigbufferen forblir frisk. På grunn av utløpstidspunktet (som angitt i et tidligere serverrespons), trenger ikke hurtigbufferen å sjekke med serveren for hver enkelt forespørsel, og dermed spare båndbredde, tid og redusere nettverkstrafikken.

Kombinasjonen av dokumentutløp og serverrevalidering er en meget effektiv mekanisme, og gjør det mulig for distribuerte systemer å opprettholde kopier med en utløpsdato.

Hvis innholdet er kjent for ofte endring, kan utløpetiden reduseres, slik at systemene kan synkroniseres oftere.

Forhøyelsestrinnet kan oppnås med to typer forespørsler: If-Modified-Since og If-None-Match. Den tidligere er for datobasert validering mens sistnevnte bruker Entity-Tags (ETags), en hash av innholdet. Disse overskriftene bruker dato eller ETag-verdier oppnådd fra et tidligere serverrespons. I tilfelle If-Modified-Since, de Sist endret svar overskrift brukes til If-None-Match, det er den ETag svar overskrift.

Kontrollerer cachability

Gyldighetsperioden for et dokument skal defineres av serveren som genererer dokumentet. Hvis det er en aviswebside, bør hjemmesiden utløpe etter en dag (eller noen ganger også hver time!). HTTP gir Cache-Control og utløper svar overskrifter for å angi utløp på dokumenter. Som nevnt tidligere, utløper er basert på absolutte datoer og ikke en pålitelig løsning for å kontrollere cachen.

De Cache-Control header er langt mer nyttig og har noen forskjellige verdier for å begrense hvordan klienter skal cache svaret:

  • Cache-Control: no-cache: klienten har lov til å lagre dokumentet Det må imidlertid fornyes med serveren på hver forespørsel. Det heter en HTTP / 1.0-kompatibilitetsoverskrift som heter Pragma: no-cache, som fungerer på samme måte.
  • Cache-Control: no-store: Dette er et sterkere direktiv til klienten for ikke å lagre dokumentet i det hele tatt.
  • Cache-Control: må-revalidere: Dette forteller klienten å omgå sin friskhetsberegning og alltid fornyes med serveren. Det er ikke tillatt å betjene den cacherte responsen dersom serveren ikke er tilgjengelig.
  • Cache-Control: maksimal alder: Dette angir en relativ utløpstid (i sekunder) fra det tidspunktet svaret genereres.

Som en side, hvis serveren ikke sender noen Cache-Control overskrifter, er klienten fri til å bruke sin egen heuristiske utløpsalgoritme for å bestemme friskhet.

Begrensende friskhet fra kunden

Cachability er ikke bare begrenset til serveren. Det kan også spesifiseres fra klienten. Dette gjør at klienten kan legge inn begrensninger på hva det er villig til å akseptere. Dette er mulig via det samme Cache-Control header, om enn med noen forskjellige verdier:

  • Cache-Control: min-frisk =: Dokumentet må være friskt i det minste sekunder.
  • Cache-Control: maksimal foreldet eller Cache-Control: maksimal foreldet =: Dokumentet kan ikke vises fra hurtigbufferen hvis det har vært foreldet i lengre tid enn sekunder.
  • Cache-Control: maksimal alder =: hurtigbufferen kan ikke returnere et dokument som er blitt cachet lenger enn sekunder.
  • Cache-Control: no-cache eller Pragma: no-cache: Klienten aksepterer ikke en bufret ressurs med mindre den er blitt revalidert.

HTTP-caching er faktisk et veldig interessant emne, og det er noen svært sofistikerte algoritmer for å administrere hurtigbufret innhold. For en dypere titt på dette emnet, se Caching-delen av HTTP-spesifikasjonen.


Sammendrag

Vår tur til HTTP begynte med grunnlaget for nettadressesystemer, statuskoder og forespørsel / responsoverskrifter. Basert på disse konseptene, så vi på noen av de finere områdene av HTTP, for eksempel tilkoblingshåndtering, identifikasjon og autentisering og caching. Jeg håper at denne turen har gitt deg en god smak for bredden til HTTP og nok poeng for å utforske denne protokollen videre..

referanser

  • RFC 2616, HTTP-spesifikasjon
  • HTTP Definitive Guide