Ga naar hoofdinhoud

Cookies afschermen: in de praktijk

httponly uit de oplossing houdt scripts bij de cookie weg. Er zijn nog drie dingen die echte sites met hun cookies doen.

samesite: niet meesturen vanaf een andere site​

De browser stuurt een cookie mee bij verzoeken naar jouw site, ook als dat verzoek begint op een andere site. Stel dat je bent ingelogd op je gastenboek, en een andere pagina laat je browser op de achtergrond een verzoek naar je gastenboek sturen. Dan gaat je sessie-cookie mee, en voor je server lijkt het een verzoek van jou. Dat heet CSRF, cross-site request forgery: een andere site laat jouw browser iets doen op een site waar jij bent ingelogd.

samesite is het antwoord. FastAPI zet samesite="lax" vanzelf, en dat betekent: stuur de cookie niet mee bij een verzoek dat een andere site op de achtergrond start. Bij een gewone klik op een link naar jouw site gaat hij wel mee. Met samesite="strict" gaat hij zelfs bij zo'n klik niet mee. Voor de meeste sites is lax de goede keuze, en dus hoef je er niets voor te doen.

secure: alleen over https​

Tot nu toe draait je server op http, en dan gaat een cookie als leesbare tekst over het netwerk. Op een echte site gebruik je https, waar alles versleuteld is. Met secure=True stuurt de browser de cookie alleen over https:

antwoord.set_cookie(
key="sessie_id",
value=sessie_id,
max_age=60 * 60 * 24 * 30,
httponly=True,
samesite="lax",
secure=True,
)

Op 127.0.0.1 zou secure=True je cookie tegenhouden, want daar is geen https. Zet hem daarom pas aan als je project echt online staat.

Uitloggen en verlopen​

Een sessie hoort niet eeuwig te duren. Twee dingen horen erbij:

  • Verlopen: met max_age verdwijnt de cookie na een tijd vanzelf. Voor een banksite is dat kort, voor een gastenboek mag het langer.
  • Uitloggen: dan gooi je de sessie weg aan de kant van de server, en haal je de cookie weg met antwoord.delete_cookie("sessie_id"). Alleen de cookie weghalen is niet genoeg: staat het sessie-id nog in sessies.db, dan werkt het weer zodra iemand het opnieuw als cookie meestuurt.

Opdracht: welke instelling helpt?​

Kies bij elke situatie de cookie-instelling die het meest helpt.

  1. Een script dat via een gat in de pagina komt, probeert het sessie-id te lezen.
  2. Een andere site laat de browser van een ingelogde bezoeker stiekem een bericht plaatsen.
  3. Iemand luistert het netwerk af om cookies te onderscheppen.
Antwoord
  1. httponly: een script kan de cookie dan niet lezen.
  2. samesite: de cookie gaat niet mee met een verzoek vanaf een andere site. FastAPI zet lax al standaard.
  3. secure samen met https: de cookie gaat alleen versleuteld over het netwerk.