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_ageverdwijnt 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 insessies.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.
- Een script dat via een gat in de pagina komt, probeert het sessie-id te lezen.
- Een andere site laat de browser van een ingelogde bezoeker stiekem een bericht plaatsen.
- Iemand luistert het netwerk af om cookies te onderscheppen.
Antwoord
httponly: een script kan de cookie dan niet lezen.samesite: de cookie gaat niet mee met een verzoek vanaf een andere site. FastAPI zetlaxal standaard.securesamen methttps: de cookie gaat alleen versleuteld over het netwerk.