Loading...

Cette présentation est un site en HTML5

Appuyez sur la touche pour avancer.

HTTP

HyperText Transfer Protocol

Grégory PAUL - paulgreg.me

Présentation

Sommaire

  1. Vue d’ensemble
  2. Versions 0.9, 1.0. 1.1
  3. Verbes
  4. Codes de retour
  5. Négociation de contenu
  6. Réponse partielle
  7. SOP, CORS
  8. Cookies
  9. Cache
  10. Authentification
  11. HTTP 2.0

Vue d’ensemble

Illustration

Diagramme réseau HTTP

HTTP à la main

Connexion à http://neverssl.com

➜  ~ host neverssl.com
neverssl.com has address 52.85.74.244
➜  ~ telnet 52.85.74.244 80
Trying 52.85.74.244...
Connected to 52.85.74.244.
Escape character is '^]'.
GET / HTTP/1.1
Host: neverssl.com

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 2536
Date: Sat, 18 Aug 2018 21:13:03 GMT
...
<html>...
ou plus simplement...
curl -I -v -XGET http://neverssl.com/

Séquence

Diagramme requête HTTP

(URI / URL / URN)

URI / URL / URN

URN / URL / URI

Une URI identifie.

Une URL identifie et localise.

une URN identifie et nomme.

URLs :

URNs :

  • urn:mpeg:mpeg7:schema:2001urn:isbn:0451450523
  • urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C
  • urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66

Et n’oubliez pas

« Cool URIs don’t change » (depuis 1998)

HTTP 0.9, 1.0 et 1.1

HTTP 0.9

  • inventé en 1989 par Tim Berners-Lee et Robert Cailliau au CERN
  • n’est pas un standard
  • un seul verbe : GET
  • port 80
  • introduit les concepts d’URI, de code de retour, d’entêtes
  • sans état...
  • ...mais Lou Montulli invente les cookies en 94 pour un site d’ecommerce
  • en 1993, le NCSA créé le navigateur Mosaic et le serveur HTTPd qui deviendra Apache HTTP Server

HTTP 1.0

  • en 1996, RFC 1945 par l’IETF
  • verbe GET, POST, HEAD mais aussi PUT, DELETE, LINK, UNLINK
  • standardisation des entêtes, des réponses, des codes d’erreurs
  • cache côté client via Last-modified, Pragma, Expires
  • compression via Accept-encoding et Content-encoding

HTTP 1.1

  • RFC 2068 en 1997 + 19 révisions entre 2007 et 2012
  • OPTIONS, CONNECT et TRACE (LINK, UNLINK)
  • en-tête Host (permettant plusieurs sites web depuis une même IP)
  • négociation de langue et de contenu (Accept*),
  • envoi de la réponse en morceaux via Transfer-Encoding: chunked (souvenez-vous des premiers chats « temps réel »)
  • Connection: keep-alive permettant le pipelining : HTTP Pipelining

Verbes

Verbes

  • GET : récupération d’une ressource
  • HEAD : seulement les entêtes
  • POST : soumission d’un formulaire / modification d’une ressource
  • PUT : création d’une ressource
  • DELETE : suppression d’une ressource
  • TRACE : echo de la requête
  • OPTIONS : informations complémentaires sur la resource
  • CONNECT : SSL/TLS pour les proxies
  • PATCH : modification partielle (RFC 5789, mai 2010)

Code de retour (status code)

Codes de retour

  • 1xx Informational
    • 100 Continue
    • 101 Switching Protocols
    • 102 Processing (WebDAV; RFC 2518)
  • 2xx Success
    • 200 OK
    • 201 Created
    • 202 Accepted
    • 203 Non-Authoritative Information (since HTTP/1.1)
    • 204 No Content
    • 205 Reset Content
    • 206 Partial Content
    • 207 Multi-Status (WebDAV; RFC 4918)
    • 208 Already Reported (WebDAV; RFC 5842)
    • 226 IM Used (RFC 3229)
  • 3xx Redirection
    • 300 Multiple Choices
    • 301 Moved Permanently
    • 302 Found
    • 303 See Other (since HTTP/1.1)
    • 304 Not Modified
    • 305 Use Proxy (since HTTP/1.1)
    • 306 Switch Proxy
    • 307 Temporary Redirect (since HTTP/1.1)
    • 308 Permanent Redirect (approved as experimental)
  • 4xx Client Error
    • 400 Bad Request
    • 401 Unauthorized
    • 402 Payment Required
    • 403 Forbidden
    • 404 Not Found
    • 405 Method Not Allowed
    • 406 Not Acceptable
    • 407 Proxy Authentication Required
    • 408 Request Timeout
    • 409 Conflict
    • 410 Gone
    • 411 Length Required
    • 412 Precondition Failed
    • 413 Request Entity Too Large
    • 414 Request-URI Too Long
    • 415 Unsupported Media Type
    • 416 Requested Range Not Satisfiable
    • 417 Expectation Failed
    • 418 I'm a teapot (RFC 2324)
    • 420 Enhance Your Calm (Twitter)
    • 422 Unprocessable Entity (WebDAV; RFC 4918)
    • 423 Locked (WebDAV; RFC 4918)
    • 424 Failed Dependency (WebDAV; RFC 4918)
    • 424 Method Failure (WebDAV)
    • 425 Unordered Collection (Internet draft)
    • 426 Upgrade Required (RFC 2817)
    • 428 Precondition Required (RFC 6585)
    • 429 Too Many Requests (RFC 6585)
    • 431 Request Header Fields Too Large (RFC 6585)
    • 444 No Response (Nginx)
    • 449 Retry With (Microsoft)
    • 450 Blocked by Windows Parental Controls (Microsoft)
    • 451 Unavailable For Legal Reasons (Internet draft)
    • 494 Request Header Too Large (Nginx)
    • 495 Cert Error (Nginx)
    • 496 No Cert (Nginx)
    • 497 HTTP to HTTPS (Nginx)
    • 499 Client Closed Request (Nginx)
  • 5xx Server Error
    • 500 Internal Server Error
    • 501 Not Implemented
    • 502 Bad Gateway
    • 503 Service Unavailable
    • 504 Gateway Timeout
    • 505 HTTP Version Not Supported
    • 506 Variant Also Negotiates (RFC 2295)
    • 507 Insufficient Storage (WebDAV; RFC 4918)
    • 508 Loop Detected (WebDAV; RFC 5842)
    • 509 Bandwidth Limit Exceeded (Apache bw/limited extension)
    • 510 Not Extended (RFC 2774)
    • 511 Network Authentication Required (RFC 6585)
    • 598 Network read timeout error (Unknown)
    • 599 Network connect timeout error (Unknown)

Négociation de contenu

Négociation de contenu

Navigateur demandant une page web

GET / HTTP/1.1
Host: www.exemple.org
Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6, image/jpeg; q=0.6, image/*; q=0.5, */*; q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate
Accept-Language: fr-FR; q=1.0, en; q=0.5
... 
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Length: 25719
Content-type: text/html; charset=UTF-8
Content-Language: en-US
...

q est un « facteur de qualité relatif » (priorité), cf RFC2616.

Négociation de contenu

Client d’API REST

GET /shops/all/address HTTP/1.1
Host: www.exemple.org
Accept: application/json; q=1.0, text/xml; q=0.8
Accept-Charset: ISO-8859-1,utf-8; q=0.7, *; q=0.3
Accept-Encoding: gzip,deflate
Accept-Language: fr-FR; q=1.0, en; q=0.5
... 
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Length: 25719
Content-type: application/json; charset=utf-8
Content-Language: en-US
 ...

Requête et réponse partielle

Requête et réponse partielle

HEAD /2390/2253727548_a413c88ab3_s.jpg HTTP/1.1
Host: farm3.static.flickr.com
HTTP/1.0 200 OK
Date: Mon, 05 May 2008 00:33:14 GMT
Server: Apache/2.0.52 (Red Hat)
Accept-Ranges: bytes
Content-Length: 3980
Content-Type: image/jpeg
GET /2390/2253727548_a413c88ab3_s.jpg HTTP/1.1
Host: farm3.static.flickr.com
Range: bytes=0-999
HTTP/1.0 206 Partial Content
Date: Mon, 05 May 2008 00:36:57 GMT
Server: Apache/2.0.52 (Red Hat)
Accept-Ranges: bytes
Content-Length: 1000
Content-Range: bytes 0-999/3980
Content-Type: image/jpeg
...

Utilisé pour reprendre les téléchargements ou pour les médias (audio, vidéo, exemple)

Same Origin Policy

Same Origin Policy

Mécanisme des navigateurs qui restreint l’interaction d’un script JS en fonction de son origine (appel Ajax, cookie, localStorage, IndexedDB).

Même origine ?

URLOutcomeReason
http://www.example.com/OKProtocol, host and port
http://www.example.com/other.htmlOKSame protocol, host and port
http://user:[email protected]www.example.com/OKSame protocol, host and port
http://www.example.com:81/KODifferent port
https://www.example.com/KODifferent protocol
http://en.example.com/KODifferent host
http://example.com/KODifferent host
http://v2.www.example.com/KODifferent host

Comment faire un appel Ajax sur un autre domaine ?

Historiquement en JSONP ou maintenant avec CORS

Cross-Origin Resource Sharing

Cross-Origin Resource Sharing

1. Requêtes simples

GET, HEAD, POST sous certaines conditions

Depuis inside.com/index.html, je souhaite appeler outside.com/file.json

GET /file.json HTTP/1.1
Host: outside.com
Accept: text/html;q=0.9,*/*;q=0.8
Referer: http://inside.com/index.html
Origin: http://inside.com
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://inside.com
Content-Type: application/json

[json data]

Sans l’entête Access-Control-Allow-Origin, le navigateur bloquera le contenu (notez que le serveur a servi sa réponse).

Cross-Origin Resource Sharing

2. Requêtes complexes nécessitant une requête préliminaire (preflight)

PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH ou si certains entêtes/valeurs

Le navigateur envoie une requête préliminaire (preflight)

OPTIONS /resource/ HTTP/1.1
Host: outside.com
Referer: http://inside.com/form.html
Origin: http://inside.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://inside.com
Access-Control-Allow-Methods: PUT, GET
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
Content-Length: 0

Le serveur autorise le verbe PUT et les entêtes spéciaux, le navigateur envoie alors la vraie requête

Cross-Origin Resource Sharing

PUT /resource/ HTTP/1.1
Host: service.com
Referer: http://example.org/form.html
Origin: http://example.org
X-PINGOTHER: pingpong
Content-Type: text/xml; charset=UTF-8
Content-Length: 10

[body data]
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.org

Cache

Cache : En Action

Chargement initial, sans cache :

First twitter load

Rechargement de la même page :

Second twitter load

Cache : Introduction

Qui ?

  • Navigateur / Client
  • Proxy (squid, équipement réseau ou « network appliance »)
  • Reverse-proxy (squid, varnish, etc)
  • CDN (CloudFlare, Amazon Cloud Front, Akamai,...)

2 types :

  • Cache privé (client final tel qu’un navigateur)
  • Cache public (intermédaire tel qu’un proxy)

Définitions :

  • ✔ cache hit
  • ✘ cache miss
  • revalidation

Cache : Date et Expires

Date: Tue, 04 Sep 2016 09:24:26 GMT
Expires: Thu, 01 Dec 1994 16:00:00 GMT
  • Date obligatoire !
  • Expires > now : caché jusqu’à la date indiquée puis revalidation
  • Expires == now : caché mais revalidation à la prochaine requête
  • Expires < now || Expires == -1 : pas de cache

Cache : Cache-Control

  • Cache-Control: private : cache client
  • Cache-Control: public : cache client et proxy
  • Cache-Control: no-cache : cache client et proxy mais revalidation
  • Cache-Control: no-cache=Set-Cookie : pas de cache sur cet entête
  • Cache-Control: no-store : cache client ou proxy interdit
  • Cache-Control: must-revalidate : revalidation après expiration
  • Cache-Control: proxy-revalidate : idem mais pour les proxies
  • Cache-Control: max-age=xxx : temps relatif, en secondes
  • Cache-Control: s-maxage=xxx : idem mais que pour les proxies
  • Cache-Control: no-transform : les proxies ne doivent pas transformer le contenu

Cache : Last-Modified et requête conditionnelle

GET /logo.png HTTP/1.1
...
HTTP/1.1 200 OK
Date: Mon, 03 Sep 2012 15:05:20 GMT
Expires: Mon, 03 Sep 2012 15:05:20 GMT
Last-Modified: Mon, 02 Apr 2012 02:13:37 GMT
...
Second appel
GET /logo.png HTTP/1.1
If-Modified-Since: Mon, 02 Apr 2012 02:13:37 GMT
...
HTTP/1.1 304 Not Modified
Date: Mon, 03 Sep 2012 15:07:07 GMT
Expires: Mon, 03 Sep 2012 15:07:07 GMT
...

Cache : Entity Tag et requête conditionnelle

GET /logo.png HTTP/1.1
...
HTTP/1.1 200 OK
ETag: "8eca4-205f-17b94c"
...
Second appel
GET /logo.png HTTP/1.1
If-None-Match "8eca4-205f-17b94c"
...
HTTP/1.1 304 Not Modified
ETag: "8eca4-205f-17b94c"
...

Cache : Vary

Exemple sur la compression :

GET /file.js HTTP/1.1
Accept-Encoding: gzip, deflate
...
HTTP/1.1 200 OK
Content-Encoding: gzip
Date: Thu, 06 Sep 2012 13:56:47 GMT
Expires: Thu, 13 Sep 2012 13:56:47 GMT
ETag: M0-0eb75f26
Vary:Accept-Encoding
...

Cache : Recommandations

  • Utilisez soit Expires, soit Cache-Control: max-age
  • avec soit Last-Modified, soit ETag pour permettre les requêtes conditionnelles
  • Idéalement, cachez plusieurs mois (mais pas plus d’un an) et utiliser l’« url fingerprinting » (version ou hash dans l’url)
  • Limitez les cookies aux ressources qui ont en besoin (html personnalisé par client)
  • Ressources statiques sur un autre sous-domaine ou CDN
  • Attention de bien configurer Vary en fonction du Content-Encoding, Content-Type ou encore sur les champs Accept (Négociation de contenu)

Authenfication

Authenfication basique

GET / HTTP/1.1
Host: fr.mappyrecette.com
...
HTTP/1.1 401 Authorization Required
WWW-Authenticate: Basic realm="Mappy authentication"
...
authentification box

Encodage base 64

$ echo -n "Aladdin:open sesame" | base64 - # QWxhZGRpbjpvcGVuIHNlc2FtZQ==
GET / HTTP/1.1
Host: fr.mappyrecette.com
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
$ echo -n QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 -d # Aladdin:open sesame

Authenfication Digest

HTTP/1.1 401 Authorization Required
WWW-Authenticate: Digest realm="[email protected]",
qop="auth, auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
Content-type: text/html
...
GET /private/index.html HTTP/1.1
Host: www.exemple.org
Authorization: Digest username="paulgreg",
realm="[email protected]",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
uri="/private/index.html",
qop=auth,
nc=00000001,
cnonce="0a4f113b",
response="6629fae49393a05397450978507c4ef1",
opaque="5ccc069c403ebaf9f0171e9517f40e41"

Extension

Extension : WebDAV

  • permet de récupérer, déposer, synchroniser et publier des fichiers/dossiers,
  • gestion des droits d’accès, vérrouillage des fichiers,
  • Nouvelles méthodes, entêtes et codes de retour (RFC 4918) :
COPY /~fielding/index.html HTTP/1.1
Host: www.example.com
Destination: http://www.example.com/users/f/fielding/index.html
If: <http://www.example.com/users/f/fielding/index.html> (<urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6>)
HTTP/1.1 423 Locked
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx

<?xml version="1.0" encoding="utf-8" ?>
<D:error xmlns:D="DAV:">
<D:lock-token-submitted>
<D:href>/locked/</D:href>
</D:lock-token-submitted>
</D:error>

HTTP/2

HTTP/2 (ou h2)

  • Google propose SPDY en 2009
  • ne remplace pas HTTP mais optimise l’échange des données
  • création d’un groupe de travail (httpbis) par l’IETF
  • SPDY deviendra la base de HTTP/2, il sera publié en 2015 (RFC7540)
  • rétro-compatibilité complète avec HTTP/1.1
  • multiplexage (plusieurs streams) au sein d’une seule requête TCP :

HTTP/2 (ou h2)

  • suppression des entêtes identiques entre les requêtes d’une session (user-agent, accept, etc),
  • compression des entêtes via HPACK (conséquence : que du binaire),
  • le serveur peut ré-ordonner les réponses (priorité),
  • le serveur peut pousser des resources que le navigateur n’a pas demandé
  • TLS obligatoire
  • supporté par tous les navigateurs récents (même IE11) et la majorité des serveurs (Apache 2.4.17+, nginx 1.9.5+, Tomcat 8.5+)

Outils et resources