WebOntwikkeling 2024
DigitAP
  • Introductie
  • Tooling
    • Devcontainers
    • Git
    • Terminal en bash
  • NodeJS + TypeScript
    • Wat is NodeJS?
    • Waarom TypeScript?
    • Nieuw project
    • Input lezen
    • Type Systeem
      • Basic types
      • Arrays
      • Interfaces
      • Functions
    • Exceptions
    • Modules
    • Asynchroon Programmeren
      • Promises
      • Async/Await
      • Fetch
      • Extra voorbeelden
  • Express.js
    • Wat is een backend framework?
    • Basis
    • Nodemon
    • Statische Bestanden
    • EJS
    • Request
      • GET Request
      • POST Request
      • Multi-part form data
    • Response
    • Router
    • Middleware
    • Deployment
  • MongoDB
    • Wat is MongoDB?
    • MongoDB driver
    • Insert
    • Find
    • Limit & Sort
    • Query Operators
    • Update
    • Delete
    • Text Search
    • Gebruik in Express.js
      • CRUD
  • Security & Testing
    • Environment Variables
    • Cookies
    • Hashing & Encryptie
    • Sessions
      • Session Based Login
    • JWT Tokens
      • JWT NPM package
      • Tokens veilig opslaan
      • Token Based Login
    • Testing
  • Labos
    • 1. Tooling
    • 2. Basis
      • Hello Name
      • BMI Calculator
      • BMI Calculator Multi
      • Interest Calculator
      • Uren en Minuten
      • Wisselgeld
      • Name from Email
      • Text Box
    • 3. Arrays
      • Som van getallen
      • Puntenboek
      • Rot13
      • Pokemon Team
      • Todo List String
      • Tick Tac Toe
    • 4. Interfaces & functies
      • Interfaces
        • Recepten
        • Movies Objects
        • Todo List Objects
      • Functies
        • Math Fun
        • Short Notation
        • Array Sum
        • Movies Functions
        • Filter Numbers
        • At Least Two
    • 5. Async & fetch
      • Fake Fetch
      • Promise All
      • Slow Sum
      • Todo List Fetch
      • Cocktails Promise All
      • Bitcoin API
      • Joke API
      • School API
      • Cocktails API
      • Unix Timestamp API
    • 6. Modules en NPM Packages
      • Math Module
      • Export Interfaces
      • Cowsay Module
      • Cat GPT
      • Rainbow Chalk
    • 7. Express
      • Hello Express
      • DadJoke Express
      • Bitcoin current
    • 8. EJS + Static
      • Hello Express EJS
      • Cat Static
      • Maaltafels
      • Newspaper
    • 9. Get Request
      • Hello Query
      • Math Service
      • Newspaper Route
      • Newspaper Search
      • Steam
    • 10. Post Request
      • Pet Shelter
      • Redirect Form
      • Contact Form
    • 11. Router en Middleware
      • Router Combi
      • Utility Middleware
      • Rate Limiter
    • 12. Herhaling
      • Twitter
      • Word Guess
    • 13. Mongo Basics
      • Guestbook
      • MoviesDB
      • Pokemon Team
    • 14. Mongo Queries
      • Pet Shelter
      • Games DB
    • 15. Mongo + Express
      • Pet Shelter Express
      • Guestbook Express
      • Pokemon Team Express
    • 16. CRUD
      • Users CRUD
      • Pokedex
    • 17. Session & Cookies
      • Shopping Cookie
      • View Counter Cookies
      • View Counter Sessions
    • 18. Session based login
      • Login Express
      • Pokedex Express Sessions
    • 19. Token based login
      • JWT Sign
      • Login Express JWT
    • 20. Testing
      • Math Test
      • String Test
      • Math Express Test
      • Form Express Test
      • Pet Shelter Express Test
    • 21. Herhaling
      • Youtube Favorites
      • Beerster
    • Extra oefeningen
      • DNA Match
      • View Counter
      • Hogwarts Express CRUD
  • Project
    • Voorbereiding (devcontainer + github)
    • Semester 2
      • Milestone 1 - Terminal App
      • Milestone 2 - Express
      • Milestone 3 - MongoDB
      • Milestone 4 - Security
Powered by GitBook
On this page
  • Local storage
  • Cookies (aangeraden oplossing)
  • Implementatie in Express
Export as PDF
  1. Security & Testing
  2. JWT Tokens

Tokens veilig opslaan

PreviousJWT NPM packageNextToken Based Login

Last updated 1 year ago

JSON web tokens kunnen vrij gedeeld worden. Dat biedt veel gebruiksgemak, maar het zorgt er ook voor dat we ze met enige voorzichtigheid moeten opslaan: als een aanvaller een JWT kan stelen, kan die zich ook voordoen als het slachtoffer.

Local storage

is, eenvoudig gesteld, opslagruimte in de browser die bij een bepaalde website hoort. Dit lijkt een goede plaats om een JWT op te slaan (en dit wordt ook vaak gedaan). Het risico bestaat echter dat een externe partij JavaScriptcode kan "injecteren" in onze applicatie en dan local storage kan uitlezen. Dit komt omdat alle JavaScriptcode op onze website toegang heeft tot local storage, of we ze nu zelf geschreven hebben of niet. Dit type aanval heet een "cross-site scripting attack", omdat er een script wordt uitgevoerd dat niet van onze eigen site afkomstig is.

Het is niet gegarandeerd dat iemand er in zou slagen JavaScriptcode te injecteren (dat hangt af van hoe veel vrijheid de gebruikers hebben om informatie naar de site te sturen), maar het is niet eenvoudig alles dicht te timmeren.

Cookies (aangeraden oplossing)

Cookies zijn iets lastiger in het gebruik dan local storage, maar ze bieden ook persistentie. Ze bieden ook een "HTTP-only" optie aan, zodat ze niet door JavaScriptcode gelezen kunnen worden, maar wel met HTTP-requests naar onze site worden verstuurd. Dit maakt een cross-site scripting attack onmogelijk.

Ze kunnen ook geconfigureerd worden zodat ze enkel over HTTPS verstuurd worden. Gewoon HTTP-verkeer is leesbaar op elke tussenstop, maar HTTPS is dat niet. Dus het is niet erg dat cookies gewone tekstbestanden zijn.

Ten slotte kunnen we cookies zo instellen dat ze enkel naar de bronsite worden verstuurd. Dit is belangrijk om een ander type aanval te voorkomen, namelijk de "Cross Site Request Forgery". Dit is een techniek waarbij een aanvaller het slachtoffer informatie naar de verkeerde website doet sturen (bijvoorbeeld door deze te overtuigen op een bepaalde link te klikken).

Implementatie in Express

Om een JWT token in te stellen in een Express applicatie, kan je volgende code gebruiken:

// token is een eerder aangemaakt JWT token
// "jwt" is hier een identifier voor je cookie
// de exacte betekenis van de waarden vind je op https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
res.cookie("jwt", token, { httpOnly: true, sameSite: "lax", secure: true });
Local storage