Webtechnologien
Wintersemester 2024
Hypertext Transfer Protocol
♯
♫
Hypertext Transfer Protocol
<section bg="http-cover.jpg" id="http" class="slide cover"><div><h2>HTTP</h2> <p>Hypertext Transfer Protocol</p> <p class="note">Quelle: <a href="https://www.flickr.com/photos/125167502@N02/14374243546/in/set-72157645122678735">Markus Spiske</a></p> <footer> <p>Ihr geht auf htw-berlin.de. Was genau passiert? Euer Browser benutzt eine Sprache, HTTP, um mit dem Server zu reden. Aber das ist keine Programmiersprache, sondern ein Protokoll. Eine Menge an Regeln, wie man miteinander redet. Wie in der echten Welt gibt es dabei feste Abläufe, beispielsweise komme ich zur dir und sage: Hi, mein Name ist Max. Und dann antwortest du mit deinem Namen. Dann schütteln wir Hände und haben dieses eigenartige Protokoll durchgezogen.</p> </footer> </div></section> <section class="slide" id="aufbau"><div><h2>Aufbau</h2> <p><img src="http.svg" alt="HTTP" class="right" width="450" /></p> <ul> <li>Grundlegendes Protokoll des World Wide Web</li> <li>Nachrichten basiert</li> <li>Anfrage-Antwort-Paar</li> <li>ASCII-Byte-Streams</li> <li>Zustandslos</li> </ul> <footer> <ul> <li>1989 von Roy Fielding, Tim Berners-Lee und anderen am CERN entwickelt</li> <li>aktuelle Version sind 1.1 / 2 / 3</li> <li>simple request and response mechanism: Eine Anfrage hin, eine Antwort zurück</li> <li>beide folgen demselben Format</li> <li>ASCII: Kann einfach geschrieben und gelesen werden (HTTP 2.0 nicht mehr ASCII, HTTP 3.0 nicht mehr über TCP)</li> </ul> </footer> </div></section> <section class="slide" id="aufbau-einer-get-anfrage"><div><h2>Aufbau einer GET-Anfrage</h2> <ul> <li>Der Client baut über den Domain-Namen oder die IP des Hosts eine TCP-Verbindung zum ihm auf</li> <li>Ist kein Port gegeben, wird Port 80 verwendet</li> <li>Der Client stellt eine Anfrage nach einem Dokument (beendet durch <code class="language-plaintext highlighter-rouge">CRLF</code>)</li> <li>Die Anfrage beginnt mit dem Wort <code class="language-plaintext highlighter-rouge">GET</code>, einem Leerzeichen, der reinen Adresse und dann der verwendeten HTTP-Version</li> </ul> <footer> <ul> <li>CRLF = carriage return, line feed</li> <li>Protokoll, Host und Port werden nur für die initiale Verbindung benötigt</li> </ul> </footer> </div></section> <section class="slide" id="beispielhafte-get-anfrage"><div><h2>Beispielhafte GET-Anfrage</h2> <pre class="highlight language-http" data-lang="http"><code><span class="nf">GET</span> <span class="nn">/index.php</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="na">Host</span><span class="p">:</span> <span class="s">www.htw-berlin.de</span> <span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span> <span class="na">Accept</span><span class="p">:</span> <span class="s">text/html, … ;q=0.9,image/webp,*/*;q=0.8</span> <span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) …</span> <span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip,deflate,sdch</span> <span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.8,de;q=0.6</span> </code></pre> <ul> <li><a href="https://de.wikipedia.org/wiki/Liste_der_HTTP-Headerfelder">Liste der HTTP-Headerfelder</a></li> <li><a href="https://en.wikipedia.org/wiki/Internet_media_type">Internet Media Type</a></li> </ul> <footer> <ul> <li>Beispiel: <code class="language-plaintext highlighter-rouge">nc -l 8080</code> und mit Browser zugreifen</li> <li>Erste Zeile ist die Request Line</li> <li>3 Teile: <ul> <li>die Aktion (auch HTTP-Methode)</li> <li>die Ressource (auf die die Aktion angewendet wird)</li> <li>die HTTP-Version (1.1)</li> </ul> </li> <li>Danach kommen <em>n</em> Header-Lines (teilen zusätzliche Informationen mit) <ul> <li>Host: Domain-Name des Servers</li> <li>Connection: Welchen Typ von Verbindung der Client bevorzugt (<code class="language-plaintext highlighter-rouge">keep-alive</code>, <code class="language-plaintext highlighter-rouge">close</code>) (<code class="language-plaintext highlighter-rouge">close</code> heißt: 10 Bilder im HTML = 11 Anfragen)</li> <li>Accept: Welche Dateitypen der Client verarbeiten kann (Internet Media Type / MIME-Type: Angabe des Medientyps + Angabe eines Subtyps)</li> <li>User-Agent: Informationen über den Client</li> <li>Accept-Encoding: Welche komprimierten Formate der Client unterstützt. Über Content Negotiation wird eine passend komprimierte Datei ausgeliefert. (sdch = Shared Dictionary Compression Over HTTP (von Google))</li> <li>Accept-Language: Welche Sprachen der Client akzeptiert. Auswahl per Content Negotiation. (q = quality factor)</li> <li>Referrer: Herkunftsseite</li> <li>Cookie</li> <li>If-Modified-Since: <em>datum</em></li> </ul> </li> <li>Header endet mit einer Leerzeile</li> <li>Danach käme optional noch ein Body; hier aber nicht</li> </ul> </footer> </div></section> <section class="slide" id="beispiel-antwort"><div><h2>Beispiel-Antwort</h2> <pre class="highlight language-http" data-lang="http"><code><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span> <span class="na">Date</span><span class="p">:</span> <span class="s">Mon, 06 Oct 2014 16:07:02 GMT</span> <span class="na">Server</span><span class="p">:</span> <span class="s">Apache</span> <span class="na">X-Powered-By</span><span class="p">:</span> <span class="s">PHP/5.3.15</span> <span class="na">Set-Cookie</span><span class="p">:</span> <span class="s">fe_typo_user=7ffafacc72…; path=/; domain=.htw-berlin.de</span> <span class="na">Cache-Control</span><span class="p">:</span> <span class="s">private</span> <span class="na">Vary</span><span class="p">:</span> <span class="s">User-Agent,Accept-Encoding</span> <span class="na">Content-Encoding</span><span class="p">:</span> <span class="s">gzip</span> <span class="na">Content-Length</span><span class="p">:</span> <span class="s">3253</span> <span class="na">Keep-Alive</span><span class="p">:</span> <span class="s">timeout=15, max=100</span> <span class="na">Connection</span><span class="p">:</span> <span class="s">Keep-Alive</span> <span class="na">Content-Type</span><span class="p">:</span> <span class="s">text/html; charset=utf-8</span> </code></pre> <footer> <ul> <li>Beispiel: <code class="language-plaintext highlighter-rouge">echo -e "HTTP/1.1 200 OK\r\n" | nc -l 8080</code></li> <li>Erste Zeile ist oder Status Line</li> <li>Header <ul> <li>Date: Zeitpunkt des Absendens</li> <li>Server: Serverkennung (so wie <code class="language-plaintext highlighter-rouge">User-Agent</code> für den Client)</li> <li>Set-Cookie: Ein Cookie</li> <li>X-Powered-By: nicht-standardisiert, gibt die benutzte Technologie an</li> <li>Cache-Control: Sagt, wie lange unterwegs gecachet werden darf (in Sekunden, e.g. <code class="language-plaintext highlighter-rouge">max-age=3600</code>). <code class="language-plaintext highlighter-rouge">private</code> = nur auf dem Client (nicht Proxy oder so)</li> <li>Vary: Sagt Proxies, was sie zukünftig machen sollen</li> <li>Content-Encoding: Codierung des Inhalts</li> <li>Content-Length: Länge des Body in Bytes</li> <li>Keep-Alive: informiert Client über Regeln zum Umgang mit der Verbindung</li> <li>Connection: kennen wir schon</li> <li>Content-Type: Der MIME-Typ der angeforderten Datei (noch vor Charset im HTML)</li> </ul> </li> </ul> </footer> </div></section> <section class="slide" id="http-methoden"><div><h2>HTTP-Methoden</h2> <table> <tbody> <tr> <td>GET</td> <td>Anfragen einer Ressource</td> </tr> <tr> <td>POST</td> <td>Anlegen einer Ressource (oder ändern)</td> </tr> <tr> <td>HEAD</td> <td>Nur Header, nicht Body senden.</td> </tr> <tr> <td>PUT</td> <td>Ersetzt eine Ressource (oder legt sie an)</td> </tr> <tr> <td>DELETE</td> <td>Löschen einer Ressource</td> </tr> <tr> <td>TRACE</td> <td>Echo der Anfrage</td> </tr> <tr> <td>OPTIONS</td> <td>Liste der unterstützten Methoden</td> </tr> <tr> <td>CONNECT</td> <td>Stellt einen Tunnel zur Verfügung und leitet weiter</td> </tr> <tr> <td>PATCH</td> <td>Verändert eine Ressource (teilweise)</td> </tr> </tbody> </table> <footer> <ul> <li>Viele HTTP-Methoden, man verwendet aber gemeinhin nur zwei.</li> <li><code class="language-plaintext highlighter-rouge">GET</code>: Soll nur Daten abrufen und sonst keine Auswirkungen haben (Res. verändern o.ä.)</li> <li><code class="language-plaintext highlighter-rouge">POST</code>: Schickt (unbegrenzt) Daten an den Server (Key-Value, binary) Es können auch hier Daten an die URI angehängt werden</li> <li><code class="language-plaintext highlighter-rouge">HEAD</code>: Wie GET, aber ohne Body</li> <li><code class="language-plaintext highlighter-rouge">PUT</code> und <code class="language-plaintext highlighter-rouge">DELETE</code> selten implementiert, aber durch REST wieder populär (~ CRUD per HTTP)</li> <li><code class="language-plaintext highlighter-rouge">TRACE</code>: Sinnvoll für das Debugging von Verbindungen (e.g. ob Proxy was verändert hat)</li> <li><code class="language-plaintext highlighter-rouge">OPTIONS</code>: Quasi Speisekarte des Servers</li> </ul> </footer> </div></section> <section class="slide" id="http-methoden--argumente"><div><h2>HTTP-Methoden – Argumente</h2> <div class="parts "> <div class="part"> <h3 id="get">GET</h3> <ul> <li>Daten Teil der URL / des Headers</li> <li>Bleiben in der History</li> <li>Landen womöglich in Server-Logs</li> </ul> </div><div class="part"> <h3 id="post">POST</h3> <ul> <li>Daten im Body</li> <li>Werden (meist) nicht gespeichert</li> </ul> </div> </div> <pre class="highlight language-" data-lang=""><code>JA: https://host.tld/search.php?q=Suchbegriff NEIN: https://host.tld/login.php?name=admin&password=auchadmin </code></pre> <footer> <ul> <li>Sharing: GET liefert theoretisch selbes Ergebnis, POST wahrscheinlich nicht</li> </ul> </footer> </div></section> <section class="slide" id="http-methoden--beispiel-post"><div><h2>HTTP-Methoden – Beispiel POST</h2> <pre class="highlight language-http" data-lang="http"><code><span class="nf">POST</span> <span class="nn">/wiki/Spezial:Search</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="na">Host</span><span class="p">:</span> <span class="s">de.wikipedia.org</span> <span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/x-www-form-urlencoded</span> <span class="na">Content-Length</span><span class="p">:</span> <span class="s">24</span> search=Katzen&go=Artikel </code></pre> <pre class="highlight language-http" data-lang="http"><code><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">302</span> <span class="ne">Found</span> <span class="na">Date</span><span class="p">:</span> <span class="s">Fri, 13 Jan 2006 15:32:43 GMT</span> <span class="na">Location</span><span class="p">:</span> <span class="s">https://de.wikipedia.org/wiki/Katzen</span> </code></pre> </div></section> <section class="slide" id="status-codes"><div><h2>Status Codes</h2> <table> <thead> <tr> <th scope="col">Code</th> <th scope="col">Gruppe</th> <th scope="col">Bedeutung</th> </tr> </thead> <tbody> <tr> <td>1xx</td> <td>Informational</td> <td>Bearbeitung der Anfrage dauert noch an</td> </tr> <tr> <td>2xx</td> <td>Success</td> <td>Anfrage war erfolgreich</td> </tr> <tr> <td>3xx</td> <td>Redirection</td> <td>Bearbeitung erfordert weitere Schritte des Clients</td> </tr> <tr> <td>4xx</td> <td>Client Error</td> <td>Ursache des Scheiterns liegt wohl bei Client</td> </tr> <tr> <td>5xx</td> <td>Server Error</td> <td>Ursache des Scheiterns liegt wohl bei Server</td> </tr> </tbody> </table> </div></section> <section class="slide" id="status-codes--häufig-verwendet"><div><h2>Status Codes – häufig verwendet</h2> <table> <thead> <tr> <th scope="col">Code</th> <th scope="col">Nachricht</th> <th scope="col">Bedeutung</th> </tr> </thead> <tbody> <tr> <td>200</td> <td>OK</td> <td>Anfrage erfolgreich beendet</td> </tr> <tr> <td>201</td> <td>Created</td> <td>Alles gut, Ressource angelegt.</td> </tr> <tr> <td>301</td> <td>Moved Permanently</td> <td>Adresse nicht mehr gültig, Umleitung zu neuer Location</td> </tr> <tr> <td>307</td> <td>Temporary Redirect</td> <td>Vorübergehend woanders vorhanden</td> </tr> </tbody> </table> <footer> <ul> <li><code class="language-plaintext highlighter-rouge">201</code>: Das <code class="language-plaintext highlighter-rouge">Location</code>-Header-Feld enthält eventuell die Adresse der erstellten Ressource.</li> <li><code class="language-plaintext highlighter-rouge">301</code>: SEO: Suchmaschine zeigt zukünftig auf neue URL (gut bei Domainumzug, Redesign etc)</li> </ul> </footer> </div></section> <section class="slide" id="status-codes--häufig-verwendet-1"><div><h2>Status Codes – häufig verwendet</h2> <table> <thead> <tr> <th scope="col">Code</th> <th scope="col">Nachricht</th> <th scope="col">Bedeutung</th> </tr> </thead> <tbody> <tr> <td>401</td> <td>Unauthorized</td> <td>Authentifizierung erfordert</td> </tr> <tr> <td>403</td> <td>Forbidden</td> <td>Client ist nicht berechtigt</td> </tr> <tr> <td>404</td> <td>Not Found</td> <td>Ressource wurde nicht gefunden</td> </tr> <tr> <td>500</td> <td>Internal Server Error</td> <td>Irgendwas ging auf dem Server schief</td> </tr> <tr> <td>503</td> <td>Service Unavailable</td> <td>Server eventuell überlastet</td> </tr> </tbody> </table> <ul> <li><a href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes">List of HTTP status codes</a></li> </ul> <footer> <ul> <li><code class="language-plaintext highlighter-rouge">401</code>: Im <code class="language-plaintext highlighter-rouge">WWW-Authenticate</code>-Header-Feld steht wie geauthet werden soll</li> <li><code class="language-plaintext highlighter-rouge">404</code>: Kann auch benutzt werden, um ohne näheren Grund abzulehnen</li> <li><code class="language-plaintext highlighter-rouge">503</code>: Server steht temporär nicht zur Verfügung, zum Beispiel wegen Überlastung oder Wartungsarbeiten. Ein <code class="language-plaintext highlighter-rouge">Retry-After</code>-Header-Feld in der Antwort kann den Client auf einen Zeitpunkt hinweisen, zu dem die Anfrage eventuell bearbeitet werden könnte.</li> </ul> </footer> </div></section> <section class="slide" id="beispiel-curl"><div><h2>Beispiel: cURL</h2> <pre class="highlight language-sh" data-lang="sh"><code>curl <span class="nt">-v</span> htw-berlin.de </code></pre> <div class="parts auto "> <div class="part"> <h3 id="anfrage">Anfrage</h3> <pre class="highlight language-http" data-lang="http"><code><span class="nf">GET</span> <span class="nn">/</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="na">User-Agent</span><span class="p">:</span> <span class="s">curl/7.30.0</span> <span class="na">Host</span><span class="p">:</span> <span class="s">htw-berlin.de</span> <span class="na">Accept</span><span class="p">:</span> <span class="s">*/*</span> </code></pre> </div><div class="part"> <h3 id="antwort">Antwort</h3> <pre class="highlight language-http" data-lang="http"><code><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">302</span> <span class="ne">FOUND</span> <span class="na">Server</span><span class="p">:</span> <span class="s">Apache</span> <span class="na">Location</span><span class="p">:</span> <span class="s">http://www.htw-berlin.de/</span> <span class="na">Content-Length</span><span class="p">:</span> <span class="s">0</span> <span class="na">Content-Type</span><span class="p">:</span> <span class="s">text/plain; charset=ISO-8859-1</span> </code></pre> </div> </div> <footer> <ul> <li>cURL benutzt keinen Cache, darum sehen Anfragen immer gleich aus</li> </ul> </footer> </div></section> <section class="slide" id="beispiel-curl-1"><div><h2>Beispiel: cURL</h2> <div class="parts auto "> <div class="part"> <h3 id="anfrage">Anfrage</h3> <pre class="highlight language-http" data-lang="http"><code><span class="nf">GET</span> <span class="nn">/</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="na">User-Agent</span><span class="p">:</span> <span class="s">curl/7.30.0</span> <span class="na">Host</span><span class="p">:</span> <span class="s">www.htw-berlin.de</span> <span class="na">Accept</span><span class="p">:</span> <span class="s">*/*</span> </code></pre> </div><div class="part"> <h3 id="antwort">Antwort</h3> <pre class="highlight language-http" data-lang="http"><code><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span> <span class="na">Server</span><span class="p">:</span> <span class="s">Apache</span> <span class="na">X-Powered-By</span><span class="p">:</span> <span class="s">PHP/5.3.15</span> <span class="na">Set-Cookie</span><span class="p">:</span> <span class="s">fe_typo_user=7dc990a5a…</span> <span class="na">Cache-Control</span><span class="p">:</span> <span class="s">private</span> <span class="na">Content-Type</span><span class="p">:</span> <span class="s">text/html; charset=utf-8</span> <span class="cp"><!DOCTYPE html></span> <span class="nt"><html</span> <span class="na">lang=</span><span class="s">"de"</span><span class="nt">></span> <span class="nt"><head></span> … </code></pre> </div> </div> <footer> <ul> <li>Dokument wird ausgeliefert, obwohl nicht explizit angegeben → Config</li> </ul> </footer> </div></section> <section class="slide" id="cookies"><div><h2>Cookies</h2> <ul> <li>HTTP zustandslos → Erschwert Indentifizierung eines Nutzers</li> <li>Entwicklung der <q>Magic Cookies</q> durch Netscape</li> <li>Älteste und weitest verbreitete Speichermöglichkeit im Client</li> <li>Werden bei jeder HTTP-Anfrage mitgeschickt</li> <li>Unterscheidung zwischen Session cookie und Persistent cookie</li> </ul> <pre class="highlight language-" data-lang=""><code>Set-Cookie: value[; expires=date][; domain=name][; path=path] [; secure][; HttpOnly] </code></pre> <footer> <ul> <li>Overhead (Cookie-less-Domains)</li> <li>Tracking durch externe Ressourcen</li> <li>Können durch JavaScript geschrieben und gelesen werden</li> <li>Session cookie: Wenn kein Verfallsdatum gesetzt, gelöscht mit Schließen des Browsers</li> <li>Persistent cookie: Bleiben gesetzte Zeit X bestehen</li> <li>Nutzung: SessionID, Cache-Botschafter</li> </ul> </footer> </div></section> <section class="slide" id="cookies--1-anfrage"><div><h2>Cookies – 1. Anfrage</h2> <pre class="highlight language-http" data-lang="http"><code><span class="nf">GET</span> <span class="nn">/</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="na">Host</span><span class="p">:</span> <span class="s">www.facebook.com</span> </code></pre> </div></section> <section class="slide" id="cookies--1-antwort"><div><h2>Cookies – 1. Antwort</h2> <pre class="highlight language-http" data-lang="http"><code><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span> <span class="na">Set-Cookie</span><span class="p">:</span> <span class="s">datr=cQw8VCSHQe2BlCBjtE4JvYOa;</span> <span class="s"> expires=Wed, 12-Oct-2016 17:31:55 GMT; Max-Age=63072000;</span> <span class="s"> path=/; domain=.facebook.com; httponly</span> <span class="na">Set-Cookie</span><span class="p">:</span> <span class="s">reg_ext_ref=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT;</span> <span class="s"> Max-Age=0; path=/; domain=.facebook.com</span> <span class="na">Set-Cookie</span><span class="p">:</span> <span class="s">reg_fb_ref=https%3A%2F%2Fwww.facebook.com%2F; path=/;</span> <span class="s"> domain=.facebook.com</span> <span class="na">Set-Cookie</span><span class="p">:</span> <span class="s">reg_fb_gate=https%3A%2F%2Fwww.facebook.com%2F; path=/;</span> <span class="s"> domain=.facebook.com</span> </code></pre> </div></section> <section class="slide" id="cookies--folgende-anfragen"><div><h2>Cookies – Folgende Anfragen</h2> <pre class="highlight language-http" data-lang="http"><code><span class="nf">GET</span> <span class="nn">/</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="na">Cookie</span><span class="p">:</span> <span class="s">datr=cQw8VCSHQe2BlCBjtE4JvYOa;</span> <span class="s"> reg_fb_ref=https%3A%2F%2Fwww.facebook.com%2F;</span> <span class="s"> reg_fb_gate=https%3A%2F%2Fwww.facebook.com%2F</span> </code></pre> </div></section> <section class="slide" id="http-authentifizierung"><div><h2>HTTP-Authentifizierung</h2> <!-- From: http://bramp.github.io/js-sequence-diagrams/ Client->Server: GET /secret.html Server->Client: 401 Unauthorized note left of Client: Browser fragt\nnach Daten Client->Server: GET /secret.html + Credentials Server->Client: 200 OK + Daten Client->Server: GET /secret2.html + Credentials Server->Client: 200 OK + Daten --> <p><img src="auth.svg" alt="HTTP-Authentifizierung" class="right" width="470" /></p> <ul> <li>Authentifizierung muss serverseitig konfiguriert werden</li> <li>Verfahren <ul> <li>Basic Authentication</li> <li>Digest Access Authentication</li> </ul> </li> </ul> <footer> <ul> <li>Konfig im Apache HTTP Server in <code class="language-plaintext highlighter-rouge">.htaccess</code> und <code class="language-plaintext highlighter-rouge">.htpasswd</code>-Datei</li> <li>Basic Authentication: <ul> <li>Browser sucht nach Benutzername und Passwort</li> <li>Fragt gegebenenfalls User und speichert Antwort</li> <li>Schickt zukünftig jeder Anfrage die Base64-kodierte Version mit</li> <li>Keine Verschlüsselung! (Kodierung = andere Darstellung von Klartext)</li> </ul> </li> <li>Digest Access Authentication <ul> <li>Server sendet Nonce</li> <li>Client berechnet Hash (MD5, SHA1) aus Benutzername, Passwort, Nonce, HTTP-Methode und angeforderter URI</li> <li>Sendet Benutzernamen, Hash und Nonce</li> <li>sicher, solange Verfahren sicher, da Daten nicht rekonstruierbar</li> <li>(MD5 nicht mehr <q>sicher</q>)</li> </ul> </li> </ul> </footer> </div></section> <section class="slide" id="beispiel-basic-authentication"><div><h2>Beispiel: Basic Authentication</h2> <pre class="highlight language-http" data-lang="http"><code><span class="nf">GET</span> <span class="nn">/</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> </code></pre> <p>⇣</p> <pre class="highlight language-http" data-lang="http"><code><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">401</span> <span class="ne">Authorization Required</span> <span class="na">Server</span><span class="p">:</span> <span class="s">Apache/2.2.16 (Debian)</span> <span class="na">WWW-Authenticate</span><span class="p">:</span> <span class="s">Basic realm="Authorized personnel only."</span> </code></pre> <p>⇣</p> <pre class="highlight language-http" data-lang="http"><code><span class="nf">GET</span> <span class="nn">/</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="na">Authorization</span><span class="p">:</span> <span class="s">Basic YWRtaW46eW9sbw==</span> </code></pre> </div></section> <section class="slide" id="debugging"><div><h2>Debugging</h2> <ul> <li><a href="https://curl.haxx.se/">cURL</a></li> <li><a href="https://httpie.org/">HTTPie</a></li> </ul> </div></section>