Zoek even op wat "stateless authentication" is. Dat is jusit geen traditionele cookie. Het werkt dan ook niet 1-2-3 in een standaardbrowser maar moet het besturingssysteem aanspreken. OAuth, Firebase, Android JWT, etc, hoef je niet te laten werken met cookies. Dat kan, maar hoeft niet. Je kan ook een auth token en refresh token opsturen. Deze kan je zelfs in de TPM laten opslaan. Dan wordt het al heel lastig om de sessie te kapen.
Uh, nee, nee, nee en nee.
Je kunt niets in de TPM opslaan. Daar heb je vanuit een browser geen enkele toegang toe. Je kunt wel 2FA hebben die *mogelijk* op dingen als de TPM (of T2 bijvoorbeeld) leunt, maar daar heb je geen rechtstreekse controle over. Keychain en soortgelijke dingen kun je ook niets mee.
Met al die authenticatie methodes moet je alsnog je token(s) ergens op slaan om ze vervolgens te kunnen gebruiken. Je doet het voorkomen alsof OAuth en JWT authenticatie methodes zijn (wellicht een fout in de manier waarop je het stelt), maar dat is niet zo. OAuth is een standaard voor authorisatie (waar je als gebruiker toegang toe hebt), niet authenticatie (bevestigen van de identiteit van de gebruiker; inloggen dus). Daarvoor heb je
OIDC, dat bovenop OAuth2 zit. JWT is dan weer een data structuur standaard waarmee je de benodigde gegevens tussen verschillende systemen heen en weer stuurt. Dan zijn er ook dingen als WebAuthN, maar het zijn allemaal slechts standaarden en geen van allen zegt ook maar iets over hoe je de authenticatie methode opslaat en verifiëert.
Ongeacht welke standaarden je wel of niet gebruikt, je token moet ergens in de browser opgeslagen worden en de enige realistische methodes daarvoor zijn cookies en/of local-/sessionstorage. Ook zonder OAuth en dergelijke kun je "stateless authentication" zonder problemen doen - en zo doen de meeste sites dat ook. Stateless betekent alleen dat de server jouw sessie niet bij hoeft te houden; met andere woorden, de ene HTTP request staat los van de volgende en de server zal bij beide requests opnieuw je gegevens verifiëren. Cookies kunnen dus wél stateless zijn, want als de inhoud van het cookie enkel een token bevat dat vervolgens geverifiëerd moet worden door de server, is er geen state die bijgehouden wordt. Of dat een sessie cookie of een HTTP cookie is doet er verder niet toe, een sessie cookie betekent enkel dat het cookie verloopt als je je browser afsluit. De permanente methodes zijn daarnaast ook uit te lezen búiten de browser; ik kan je zonder meer een stukje malware geven dat al jouw cookies of applicatie data uit leest, op alle besturingssystemen.
Op jouw Android telefoon is niets van dit alles ook maar een greintje veiliger in de browser. In native apps deels wel, door de sandboxing van de app gegevens. Maar net als in de browser is je client-secret bijvoorbeeld niet veilig, dat kun je gewoon achterhalen door de app te decompilen, dus ook dan zijn dingen als PKCE gewenst.
En nee, cookies zijn nooit en te nimmer IP-gebonden. Dat kan niet. Ze zijn hooguit domein- en/of protocol-gebonden. Een HttpOnly + secure cookie met de correcte domein setting wordt enkel naar het betreffende domein verzonden met een beveiligde verbinding en kan niet vanuit JavaScript uitgelezen worden. Wél kan je login-sessie IP-gebonden zijn, maar dat zit niet in het cookie, dat zit in de authenticatie gegevens die de server opgeslagen heeft en doet pas iets nadat je de gegevens in het cookie naar de server gestuurd hebt.
Of gewoon niet meer met sessie-cookies werken voor iets gevoeligs als een politiemedewerkerdatabase en ga over op token-based auth met 2FA. Zoiets is veel moeilijker te kapen, zeker als je de sessielengtes heel kort houdt en werkt met refresh tokens.
Nope. Dat refresh token moet gewoon in de browser opgeslagen worden en als ik dat uit kan lezen en weet hoe het voor een access token uitgewisseld moet worden, kan ik jouw sessie gewoon kapen. Als ik zelf toegang tot de site in kwestie heb, heb ik dat zo uitgevogeld.
Al het bovenstaande voegt niets toe aan de beveiliging van sessies. Daarvoor moet je andere dingen doen. Zolang je enkel op een token vertrouwt voor authenticatie, is het te kapen. Zelfs als je PKCE toe voegt is dat niet per definitie veiliger, omdat je ook daar dingen lokaal op moet slaan en zowel in browsers als in native apps zijn er manieren om aan die gegevens te komen.
[Reactie gewijzigd door Werelds op 9 november 2024 10:30]