Het http (Hypertext Transfer) protocol

© 2010 Hein Pragt

Inleiding in het http protocol

Wanneer ik mensen lesgeef in de basis van programmeren voor het Internet begin ik meestal met uit te leggen dat er een protocol aan de basis ligt van elk www verzoek. Dit protocol is het HTTP (Hypertext Transfer Protocol) protocol, een vrij eenvoudig tekst gebaseerd protocol, dat de communicatie tussen de browser en de HTTP webserver regelt. Wanneer mensen in HTML, PHP, JSP of DotNet willen gaan programmeren voor het Internet dan is kennis van het onderliggende HTTP protocol bijna onontbeerlijk. Om te begrijpen wat er werkelijk op en neer gaat (round trip) moet men begrijpen hoe de verzoeken en de data heen en weer gaan tussen de browser en de webserver. Ook is het handig om te weten hoe de diverse HTTP headers werken, hoe HTTP omgaat met cookies en wat het verschil is tussen een GET en een POST verzoek.

Ook is het bijvoorbeeld heel belangrijk om te weten dat elk verzoek aan de webserver een afzonderlijk verzoek is en dat tussen uw individuele vezoeken door, de webserver ook allerlei andere verzoeken af zit te handelen. Na elk verzoek (request) volgt een antwoord (response) van de webserver, waarna voor de webserver het verzoek is afgehandeld en vergeten. Alleen in een eventueel logbestand kunt u het verzoek en het antwoord terugvinden. De HTTP server heeft dus geen sessie beheer en wanneer u bijvoorbeeld ingelogd wilt zijn op een server, zult u dit buiten het HTTP protocol moeten oplossen maar op een hoger niveau zoals in bijvoorbeeld de webapplicatie op de webserver door middel van HTTP headers of een cookie waar een gebruikers identificatie staat.

Een HTTP verzoek (request)

Een HTTP verzoek (request) bestaat uit het verzoekcommando, de URL, de headervelden en eventueel een inhoud. Dit zijn de verzoekcommando's:

  • GET - Ontvang het document gespecificeerd door de URL.
  • HEAD - Ontvang alleen de headers van het op te vragen document.
  • POST - Zend data naar de server.
  • PUT - Vervang het document op de server door de verzonden data (is meestal geblokkeerd).
  • DELETE - Verwijder het document (is meestal geblokkeerd).
  • OPTIONS - Vraag de mogelijkheden van de server.

Een HTTP antwoord (response)

Een HTTP antwoord (response) bestaat uit een resultaat code, headervelden en een body (de boodschap).

Een HTTP resultaat code

Een resultaat code bestaat uit minimaal drie cijfers, het eerste cijfer is het belangrijkste:

  • 1xx: een informele boodschap van de webserver die nog gevolgd zal worden door andere data.
  • 2xx: een boodschap van de server dat de gevraagde actie succesvol is afgehandeld.
  • 3xx: een "redirect" naar een andere locatie.
  • 4xx: een foutboodschap (door de client veroorzaakt).
  • 5xx: een foutboodschap (door de server veroorzaakt).
  • 6xx: een proxy fout is opgetreden.

Voorbeelden van veel voorkomende resultaat codes zijn:

  • 200 OK (Het gevraagde document is succesvol opgevraagd).
  • 304 Not Modified (T.o.v. de versie in de cache is de pagina niet gewijzigd).
  • 403 Forbidden (Het opgevraagde document mag niet verzonden worden).
  • 404 Not Found (Het opgevraagde document bestaat niet).
  • 500 Internal Server Error.

Eenvoudig voorbeeld van een HTTP sessie

© 2010 Hein Pragt

Het volgende gebeurt er in de achtergrond wanneer u contact maakt met een Internet host en een specifieke pagina binnen de site opvraagt. Als voorbeeld vragen we om de pagina /spelcomputers/programmeren.php van de website HTTP://www.heinpragt.com op. De volledige URL zal dus: HTTP://www.heinpragt.com/spelcomputers/programmeren.php zijn. Als eerste zal de browser een socket (netwerk) verbinding maken met de host HTTP://www.heinpragt.com op poort 80 (de standaard HTTP poort) waarna het volgende tekst verzoek verzonden zal worden naar deze webserver.

*) Noot: [blanko regel] staat voor een lege regel met alleen een regelterugloop code.

GET /spelcomputers/programmeren.php HTTP/1.1
Host: www.heinpragt.com
User-Agent: Mozilla/5.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: nl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Referer: HTTP://www.heinpragt.com/start/index.php
Cookie: COOKIE data .......... data .......
[blanko regel]

De webserver zal hierna een pagina sturen (gegenereerde HTML door PHP maar voor de ontvanger is het gewoon HTML) voorafgegaan door enkele HTTP headers.

HTTP/1.x 200 OK
Date: Thu, 15 Apr 2010 12:12:02 GMT
Content-Type: text/html
Server: Apache/1.3.34 (Unix) FrontPage/5.0.2.2635 PHP/4.4.0 mod_ssl/2.8.25 OpenSSL/0.9.8a
X-Powered-By: PHP/4.4.0
Content-Type: text/html
Content-Length: 1354
[blanko regel]
<html>
<body>
<h1>Spellen programmeren.</h1>
(Alle HTML...)
</body>
</html>

Nu is het verzoek voor de webserver geheel afgehandeld, de webserver sluit de socket verbinding begint aan het volgende verzoek van een andere gebruiker. Aangezien HTTP een stateless protocol is zal de webserver elk afzonderlijk verzoek afhandelen en daarna is het gereed en afgesloten en weet de webserver bij een volgend verzoek niet of het van dezelfde of een andere host afkomstig is. het HTTP protocol zelf is dus niet in staat een sesie bij te houden.

Dit is een heel eenvoudig voorbeeld, normaal zullen er voor een internet pagina vele HTTP verzoeken na elkaar gedaan worden voor alle include bestanden zoals de .css en .js bestanden, maar ook bijvoorbeeld een afzonderlijk verzoek voor elke afbeelding die op de pagina staat.

Het verschil tussen http GET en http POST

© 2010 Hein Pragt

Het verschil tussen GET en POST is belangrijk als we formulieren gebruiken of via verborgen formulieren in de pagina data willen doorgeven aan een volgend verzoek. Ook zal het drukken op een submit knop binnen een formulier een nieuw HTTP verzoek zenden naar de HTTP webserver waarbij de gegevens uit het formulier ook verzonden zullen worden naar de HTTP webserver. Dit kan op twee verschillende manieren gebeuren, de eerste manier is met de GET methode. Deze methode verstuurt de informatie uit het formulier via de url en in de adresbalk zal het ook zichtbaar zijn.

Voorbeeld: HTTP://www.heinpragt.com/contact.php?contact_naam=Hein&email=hein@hmp.nl

Achter de URL staat een vraagteken om aan te geven dat er parameters volgend, een parameter bestaat uit een veldnaam een = teken en een waarde en meerdere parameters worden gescheiden door een ampersant (&) teken. De gebruiker kan dus de data die verzonden is naar de HTTP webserver ook zien in de adresbalk. Dit is niet fraai en ook gevoelig voor manipulatie omdat eenvoudig gegevens gewijzigd kunnen worden waarna het verzoek opnieuw verzonden kan worden. Een hack poging uit het verleden bestond er uit dat de postbank de sessie id van de gebruiker via de url meegaf aan een volgend verzoek. Door in te loggen onder de eigen naam en daarna het sessie nummer handmatig aan te passen, kon men de sessie van een andere gebruiker overnemen. Nadat dit bekend werd is er snel een aanpassing gemaakt maar deze hack methode werkt nog steeds op een aantal sites die op deze wijze een sessie bijhouden.

Naast de GET methode kunt u de gegevens uit een formulier ook verzenden met de POST methode. In principe werken de POST en GET methode hetzelfde alleen wordt de informatie uit het formulier niet verzonden via de adresbalk maar via een zogenaamd HTTP headers. Bij het versturen van het formulier zal men geen informatie in de adresbalk zien, de informatie wordt niet zichtbaar via HTTP headers verstuurd. Dit maakt de POST methode een stukje veiliger omdat niemand nu kan wat er eigenlijk verstuurd wordt maar een echt hacker is ook in staat om headers te manipuleren.

In een framework zoals PHP worden de GET en de POST variabelen meestal in een array geplaatst voor de webapplicatie. In PHP zullen dit het $_POST[] en het $_GET[] array zijn waarin de variabele namen als keys staan de waarden als valies. Ook bestaat er soms een instelling om de GET en POST variabelen automatisch in globale variabelen te stoppen, maar dit is een bekend veiligheidslek en het zal op de meeste moderne serves ook uitgeschakeld zijn.

Http tools

© 2010 Hein Pragt

U kunt een add-on voor Mozilla Firefox downloaden, waarmee u, wanneer u deze add-on aanzet, alle headers die tussen de browser en de http webserver heen en weer gaan kunt bekijken. dit kan zeer handig zijn wanneer u een webapplicatie moet testen of debuggen.

Live HTTP Headers

Fiddler is een Web Debugging Proxy die alle HTTP(S) verkeer tussen uw computer and het Internet opslaat waarna u het kunt inspecteren. Het is een freeware programma en het werkt voor alle browsers maar ook alle andere web applicaties die HTTP als protocol gebruiken.

Fiddler http monitor

Historie van het Http protocol

© 2010 Hein Pragt

De eerste versie van het HTTP protocol heeft de versie 1.0 en in eerste instantie voldeed dit protocol goed. Toen het web begon te groeien kwamen er ook een aantal tekortkomingen in dit protocol aan het licht die opgelost in de volgende versie 1.1 die vanaf circa 1997 de standaard op het World Wide Web is Technische details van HTTP staan beschreven in verschillende RFC's. HTTP versie 1.0 staat in het RFC met nummer 1945. Versie 1.1 van het protocol staat in RFC met nummer 2616. Deze zijn te downloaden op: www.rfc-editor.org/rfc.html

Last update: 15-05-2015
 Binnen dit thema



 Meer thema's


 Lees hier de privacyverklaring van deze site.

Disclaimer.

Hoewel de heer Hein Pragt de informatie beschikbaar op deze pagina met grote zorg samenstelt, sluit de heer Pragt alle aansprakelijkheid uit met betrekking tot de informatie die, in welke vorm dan ook, via zijn site wordt aangeboden. Het opnemen van een afbeelding of verwijzing is uitsluitend bedoeld als een mogelijke bron van informatie voor de bezoeker en mag op generlei wijze als instemming, goedkeuring of afkeuring worden uitgelegd, noch kunnen daaraan rechten worden ontleend. Op de artikelen van de heer Pragt op deze Internetsite rust auteursrecht. Overname van informatie (tekst en afbeeldingen) is uitsluitend toegestaan na voorafgaande schriftelijke toestemming van de rechthebbende. Voor vragen over copyright en het gebruik van de informatie op deze site kunt u contact opnemen met: (email: mail@heinpragt.com). Dit is mijn