Wat is JWT? JSON-webtokens uitgelegd met een werkend voorbeeld

  1. Home
  2. Blog
  3. Softwareontwikkeling

Softwareontwikkeling

Wat is JWT? JSON-webtokens uitgelegd met een werkend voorbeeld

Met een JWT kan een server een verzoek vertrouwen zonder iets op te zoeken. Bouw er een helemaal opnieuw, probeer ermee te knoeien en zie hoe het mislukt, leer vervolgens wanneer tokens sessies verslaan en hoe je ze veilig kunt gebruiken.

9 min leestijd
Wat is JWT? JSON Web Tokens uitgelegd met een werkend voorbeeld

Belangrijkste punten

  • Een JWT is een compact, ondertekend token dat uit drie delen bestaat: header, payload en handtekening.
  • De handtekening bewijst dat een token niet is gewijzigd, zodat de server deze kan vertrouwen zonder dat er iets hoeft te worden opgezocht.
  • De payload is door iedereen leesbaar, dus stop er nooit geheimen in.
  • Tokens zijn moeilijk in te trekken, dus houd ze van korte duur en verifieer ze bij een vertrouwde bibliotheek.

Hoe weet een server, nadat u zich heeft aangemeld, dat elk later verzoek echt van u afkomstig is? Een populair antwoord is een JSON Web Token, of JWT, meestal uitgesproken als ‘jot’. Het is een klein, ondertekend stukje gegevens dat de client bij elk verzoek verzendt, en de server kan dit controleren zonder een database aan te raken.

De snelste manier om een ​​JWT te begrijpen, is door er een te bouwen en deze vervolgens te breken. We hebben dat gedaan met alleen de standaardbibliotheek van Python, op Python 3.13, en de onderstaande uitvoer komt uit die run. Deze code is bedoeld om te leren. Gebruik in een echte toepassing een goed onderhouden bibliotheek, omdat de details van de verificatie gemakkelijk fout kunnen gaan.

Wat is een JWT?

JWT is een open standaard, gedefinieerd in RFC 7519, voor het doorgeven van claims tussen twee partijen als een compacte string. Een claim is eenvoudigweg een verklaring, zoals “de ID van deze gebruiker is 42”. Omdat het token is ondertekend, kan de ontvanger bevestigen wie het heeft uitgegeven en dat niemand het heeft gewijzigd.

Denk hierbij aan een festivalbandje. Het personeel bij de poort controleert je ticket één keer en geeft je een band die moeilijk te vervalsen is. Daarna kijkt elke kraam alleen maar naar de band, zonder dat je de kassa hoeft te bellen. Een JWT werkt op vrijwel dezelfde manier voor een API.

Hoe JWT-aanmelding werkt

  1. De gebruiker verzendt een gebruikersnaam en wachtwoord naar het inlogeindpunt.
  2. De server controleert ze en maakt een ondertekend token.
  3. De client slaat het token op.
  4. Elk later verzoek bevat het, meestal in een header: Authorization: Bearer <token>.
  5. De server verifieert de handtekening en de vervaldatum en leest vervolgens de claims.

Het belangrijkste voordeel zit in stap 5. De server hoeft geen sessie op te zoeken, wat handig is als veel services of servers hetzelfde token moeten controleren. Als u nog niet bekend bent met API’s, begin dan met wat is een API.

De drie delen van een JWT

Een JWT ziet eruit als willekeurige tekst, maar bestaat uit drie Base64URL-gecodeerde secties, gescheiden door punten. Hier is er een die we hebben gegenereerd:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiI0MiIsInJvbGUiOiJ1c2VyIiwiaWF0IjoxNzkzNTAwMDAwLCJleHAiOjE3OTM1MDA5MDB9
.7YfUDH_T-iDh8bMmUT8mmKYwOstzT8Ty--DTTAmQGWM

We hebben regeleinden toegevoegd om het lezen gemakkelijker te maken. Het decoderen van de eerste twee delen levert duidelijke JSON op:

Header:  {"alg":"HS256","typ":"JWT"}
Payload: {"sub":"42","role":"user","iat":1793500000,"exp":1793500900}
Deel Bevat Doel
Koptekst Tokentype en ondertekeningsalgoritme Zegt hoe het token moet worden geverifieerd
Laadvermogen Claims over de gebruiker of sessie De feitelijke informatie
Handtekening Een hash van de eerste twee delen, met behulp van een sleutel Bewijst integriteit en herkomst

Standaard claims

Beweren Naam Betekenis
sub Onderwerp Over wie het token gaat, meestal een gebruikers-ID
is Uitgever Wie heeft het token gemaakt
hoor Publiek Voor wie is het token bedoeld?
exp Vervaldatum Wanneer het token niet meer geldig is
ja Uitgegeven op Toen het werd gemaakt
nbf Niet eerder Wanneer het geldig begint te worden
jti JWT-ID Een unieke ID voor dit token

Je kunt ook aangepaste claims toevoegen, zoals role. Tijden zijn Unix-tijdstempels, in seconden. Houd de payload klein, aangezien het token met elk verzoek meegaat.

Bouw er zelf een

Het maken van een token omvat het coderen van de twee JSON-onderdelen en het vervolgens ondertekenen ervan met een geheim met behulp van HMAC-SHA256:

import base64, hashlib, hmac, json

SECRET = b"demo-secret-do-not-use-in-production"

def b64url(data):
    return base64.urlsafe_b64encode(data).rstrip(b"=").decode()

def sign(message):
    return b64url(hmac.new(SECRET, message.encode(), hashlib.sha256).digest())

def create_token(payload):
    header = {"alg": "HS256", "typ": "JWT"}
    parts = [
        b64url(json.dumps(header, separators=(",", ":")).encode()),
        b64url(json.dumps(payload, separators=(",", ":")).encode()),
    ]
    message = ".".join(parts)
    return message + "." + sign(message)

Verificatie werkt door de handtekening opnieuw te berekenen en deze te vergelijken met die in het token. Alleen iemand met het geheim kan een bijpassend geheim produceren:

def verify_token(token, now):
    header, payload, signature = token.split(".")
    expected = sign(header + "." + payload)
    if not hmac.compare_digest(signature, expected):
        raise ValueError("bad signature")
    claims = json.loads(b64url_decode(payload))
    if claims["exp"] < now:
        raise ValueError("token expired")
    return claims

Een geldig token heeft de claims geretourneerd zoals verwacht. compare_digest wordt gebruikt omdat het in constante tijd draait, waardoor het lekken van informatie door timingverschillen wordt vermeden.

Probeer ermee te knoeien

Stel dat een aanvaller de payload decodeert, "role":"user" in "role":"admin" verandert, deze opnieuw codeert en de oude handtekening behoudt. We hebben dit geprobeerd, samen met twee andere aanvallen:

Poging Resultaat
De rol gewijzigd in beheerder slechte handtekening
Gebruikte het token 1 seconde na de vervaldatum token verlopen
Stel "alg":"none" in en verwijder de handtekening slechte handtekening

Die laatste poging richt zich op een echte historische zwakte. Sommige bibliotheken vertrouwden ooit op de eigen header van het token, zodat een aanvaller eenvoudigweg kon verklaren dat er geen handtekening nodig was. Onze code gebruikt altijd één vast algoritme en is daarom afgewezen. Geef in een echte bibliotheek altijd de algoritmen op die u accepteert.

Ondertekend, niet gecodeerd

Dit is het meest onbegrepen punt over JWT’s. Ons vervalste token werd afgewezen, maar de inhoud was nog steeds perfect leesbaar:

{"sub":"42","role":"admin","iat":1793500000,"exp":1793500900}

Base64URL is een codering, geen codering, en iedereen kan dit zonder enige sleutel omkeren. De handtekening verhindert dat mensen de gegevens wijzigen, maar niet lezen. Plaats dus nooit wachtwoorden, kaartnummers of persoonlijke privégegevens in een JWT-payload. Als de inhoud verborgen moet worden, gebruik dan gecodeerde tokens (JWE) of bewaar de gegevens gewoon op de server.

HS256 versus RS256

Aspect HS256 RS256 of ES256
Typ Symmetrisch Asymmetrisch
Sleutels Eén gedeeld geheim Een private sleutel tekent, een publieke sleutel verifieert
Wie kan tokens maken Iedereen die het geheim bewaart Alleen de houder van de privésleutel
Beste voor Eén dienst, of een kleine vertrouwde groep Veel diensten, derde partijen, identiteitsproviders

Met asymmetrische ondertekening kunnen andere diensten tokens verifiëren zonder hun eigen tokens te kunnen maken, wat de schade beperkt als er een wordt gecompromitteerd.

JWT versus sessies

JWT’s worden vaak gepresenteerd als een moderne vervanging voor sessies. In werkelijkheid heeft elk zijn afwegingen:

Aspect Serversessie JWT
Waar de staat leeft Op de server In het teken
Zoek op elk verzoek Meestal Niet nodig
Uitloggen of intrekken Makkelijk, verwijder de sessie Moeilijk vóór de vervaldatum
Maat per aanvraag Kleine identiteitskaart Groter token (de onze was 161 tekens)
Bij veel diensten Heeft gedeelde opslag nodig Iedereen kan het rechtstreeks verifiëren
Machtigingen wijzigen Is onmiddellijk van toepassing Het oude token blijft geldig tot de vervaldatum

Voor een traditionele server-gerenderde website is een sessiecookie vaak eenvoudiger en veiliger. JWT’s zijn doorgaans zinvoller voor API’s die door verschillende services worden gebruikt, of voor mobiele clients.

Tip: Kies niet voor JWT alleen maar omdat het staatloos klinkt. Veel echte systemen voegen een denylist of een databasecontrole toe om het uitloggen te ondersteunen, waardoor de zoekopdracht terugkomt die JWT had moeten vermijden.

Waar tokens in een browser kunnen worden opgeslagen

Locatie XSS-risico CSRF-risico Opmerkingen
lokale opslag Hoog, zoals scripts het kunnen lezen Laag Eenvoudig, maar blootgesteld aan elk geïnjecteerd script
HttpOnly-cookie Lager, omdat scripts het niet kunnen lezen Heeft bescherming nodig Gebruik Secure en SameSite
Variabele in het geheugen Lager Laag Verloren bij vernieuwen, dus er is een vernieuwingsstroom nodig

Veel beveiligingshandleidingen geven de voorkeur aan HttpOnly, Secure, SameSite cookies voor webapps. Welke je ook kiest, gebruik altijd HTTPS. Als u een token wilt verzenden vanuit JavaScript, raadpleegt u onze JavaScript Fetch API-tutorial.

Tokens vernieuwen

Een korte vervaldatum beperkt de schade van een gestolen token, maar niemand wil elke 15 minuten inloggen. De gebruikelijke oplossing gebruikt twee tokens:

  • Toegangstoken: van korte duur, zoals minuten, en verzonden bij elk API-verzoek.
  • Vernieuwingstoken: heeft een langere levensduur, wordt zorgvuldiger bewaard en wordt alleen gebruikt om nieuwe toegangstokens te verkrijgen.

De server houdt vernieuwingstokens bij, zodat hij deze kan intrekken, waardoor u praktisch kunt uitloggen. Door ze bij elk gebruik te roteren, kunt u ook diefstal opsporen, omdat een gestolen oud token opnieuw wordt afgespeeld.

Veel voorkomende beveiligingsfouten

  • Decoderen zonder verificatie. Het lezen van een payload maakt deze niet betrouwbaar. Controleer altijd de handtekening.
  • Elk algoritme accepteren. Stel een expliciete lijst met toegestane algoritmen in.
  • Een zwak geheim gebruiken. Korte geheimen kunnen offline worden gekraakt. Gebruik een lange willekeurige waarde en houd deze buiten bronbeheer.
  • Vervaldatum overslaan. Tokens zonder exp kunnen voor altijd blijven werken als ze worden gestolen.
  • Niet controleren van iss en aud. Anders kan een token dat voor de ene dienst is uitgegeven, door een andere worden geaccepteerd.
  • Vertrouwen op verouderde claims. Een rol binnen een token kan verouderd zijn totdat deze verloopt.
  • Logboektokens. Iedereen die uw logboeken leest, kan deze opnieuw gebruiken.
  • Foutpaden niet testen. Voeg tests toe voor verlopen en gewijzigde tokens, evenals voor geldige tokens. Onze gids voor API-testen met Postman kan hierbij helpen.

Tot slot

Een JWT bestaat uit ondertekende gegevens die een server kan vertrouwen zonder opzoeken, geen geheime container en geen automatische upgrade tijdens sessies. Gebruik een korte vervaldatum, verifieer alles met een onderhouden bibliotheek en houd privégegevens buiten de payload. Om het zelf te zien, voert u een klein script uit zoals het onze, wijzigt u één teken van een token en ziet u hoe de verificatie mislukt.

Veelgestelde vragen

Waar wordt een JWT voor gebruikt?

JWT’s worden meestal gebruikt voor authenticatie en autorisatie in API’s. Na het inloggen verzendt een client het token bij elk verzoek, en de server verifieert dit om de gebruiker te identificeren.

Is een JWT gecodeerd?

Meestal niet. Een standaard JWT is ondertekend en gecodeerd, zodat iedereen de lading ervan kan lezen. De handtekening verhindert alleen wijzigingen. Gecodeerde tokens gebruiken een verwant formaat genaamd JWE.

Hoe lang moet een JWT duren?

Toegangstokens zijn doorgaans van korte duur, vaak minuten in plaats van dagen. Koppel ze aan een vernieuwingstoken, zodat gebruikers niet voortdurend hoeven in te loggen.

Kan een JWT worden ingetrokken?

Niet op zichzelf, want het blijft geldig totdat het vervalt. Voor intrekking is tracking aan de serverzijde vereist, zoals een denylist, waardoor een deel van het staatloze voordeel wordt verwijderd.

Is JWT beter dan sessies?

Geen van beide is altijd beter. Sessies zijn eenvoudiger in te trekken en geschikt voor veel websites, terwijl JWT’s geschikt zijn voor API’s en services die de identiteit onafhankelijk moeten verifiëren.

Blijf leren

Werk met Stack Quora

Hulp nodig met testen, WordPress of SEO?

We helpen teams betere software te leveren en hun sites te laten groeien. Vertel ons waar u mee bezig bent en wij stellen een duidelijke volgende stap voor.

Blijf lezen

Meer handleidingen over testen, AI en moderne ontwikkeling

Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.

Kunstmatige intelligentie

AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen

AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…

Lees artikel →
DevOps

Omgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan

Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…

Lees artikel →
Softwareontwikkeling

API-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten

API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…

Lees artikel →
Testautomatisering

Spotten in Python: unittest.mock, patch en de fouten die tests doen liegen

Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…

Lees artikel →
Softwaretesten

Codedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent

Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…

Lees artikel →
Databases & SQL

DELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken

DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…

Lees artikel →
Databases & SQL

SQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden

SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…

Lees artikel →
Softwareontwikkeling

TypeScript-interface versus type: echte verschillen, getest met de compiler

TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…

Lees artikel →
Softwareontwikkeling

Python *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden

Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…

Lees artikel →
Softwareontwikkeling

Python Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken

Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…

Lees artikel →
Kunstmatige intelligentie

Wat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren

Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…

Lees artikel →
DevOps

Monitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen

Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…

Lees artikel →
DevOps

Docker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier

Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…

Lees artikel →
Testautomatisering

TDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt

TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…

Lees artikel →
Softwaretesten

Gebruikersacceptatietesten (UAT): proces, checklist en echte voorbeelden

Gebruikersacceptatietesten uitgelegd: wie voert het uit, hoe het verschilt van QA, een proces in zeven stappen, een UAT-testcase-sjabloon, een check…

Lees artikel →
Databases & SQL

SQL NULL-waarden uitgelegd: IS NULL, COALESCE, NULLIF en de te vermijden vallen

SQL NULL-waarden uitgelegd met query's die we hebben uitgevoerd: logica met drie waarden, IS NULL, COALESCE, NULLIF, hoe aggregaten, joins en sorter…

Lees artikel →
Databases & SQL

SQL CASE WHEN-instructie: syntaxis, echte voorbeelden en veelvoorkomende fouten

SQL CASE WHEN uitgelegd met vragen die we hebben uitgevoerd: eenvoudige en doorzochte formulieren, volgorde van de voorwaarden, draaipunten met SUM,…

Lees artikel →
Softwareontwikkeling

Wat is JWT? JSON-webtokens uitgelegd met een werkend voorbeeld

Wat is JWT? JSON Web Tokens uitgelegd: de drie delen, een token gebouwd en waarmee is geknoeid in de code die we hebben uitgevoerd, JWT versus sessi…

Lees artikel →
Softwareontwikkeling

JavaScript-gebeurtenislus uitgelegd: call-stack, microtaken en timers met voorbeelden

De JavaScript-gebeurtenislus uitgelegd met code die we hebben uitgevoerd: call-stack, taak- en microtask-wachtrijen, waarom setTimeout 0 niet onmidd…

Lees artikel →
Softwareontwikkeling

Python-generatoren en opbrengst uitgelegd: bespaar geheugen met echte voorbeelden

Python-generatoren en opbrengst uitgelegd met code die we hebben uitgevoerd: hoe ze pauzeren en hervatten, gemeten geheugenbesparingen, pijplijnen, …

Lees artikel →
Kunstmatige intelligentie

Wat zijn inbeddingen? Vectoren en cosinusovereenkomst eenvoudig uitgelegd

Wat zijn insluitingen? Een gids in duidelijke taal over vectoren, cosinusovereenkomst en semantisch zoeken, met een klein voorbeeld dat we hebben ui…

Lees artikel →
DevOps

Implementatie van blauwgroen versus kanarie: verschillen, afwegingen en hoe te kiezen

Blauw-groen versus kanarie-implementatie uitgelegd: hoe elk werkt, kosten, risico's en terugdraaien, stabiele gebruikersbucket die we hebben getest,…

Lees artikel →
Testautomatisering

Schilferige tests: wat de oorzaak ervan is en hoe u ze voorgoed kunt oplossen

Zwakke tests uitgelegd met demo's die we hebben uitgevoerd: de belangrijkste oorzaken, hoe je er een kunt bevestigen en diagnosticeren, goede oploss…

Lees artikel →
Softwaretesten

Belastingtesten versus stresstesten: verschillen, statistieken en k6-voorbeelden

Belastingtesten versus stresstesten uitgelegd: wat elk bewijst, piek- en soak-tests, de statistieken die er toe doen, waarom gemiddelden misleiden, …

Lees artikel →
Softwaretesten

Testcase versus testscenario: belangrijkste verschillen, voorbeelden en wanneer deze te gebruiken

Testcase versus testscenario uitgelegd: duidelijke definities, een tabel naast elkaar, één functie voor het opnieuw instellen van wachtwoorden, over…

Lees artikel →
Databases & SQL

Optimalisatie van SQL-query's: lees uitvoeringsplannen en repareer langzame query's, met timing

Optimalisatie van SQL-query's getest op een miljoen rijen: lees uitvoeringsplannen, voeg de juiste indexen toe, repareer niet-sargeerbare filters, g…

Lees artikel →
Databases & SQL

SQL UNION versus UNION ALL: verschillen, voorbeelden en geteste prestaties

SQL UNION versus UNION ALL uitgelegd met de query's die we hebben uitgevoerd: duplicaten, de regels volgen beide, een echte databug, gemeten prestat…

Lees artikel →
Softwareontwikkeling

JavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs

Een JavaScript Fetch API-tutorial getest tegen een lokale server: GET en POST, waarom 404 niet gooit, een herbruikbare helper, queryreeksen, time-ou…

Lees artikel →
Softwareontwikkeling

Python-bestandsverwerking: lezen, schrijven, CSV, JSON en pathlib met voorbeelden

Het verwerken van Python-bestanden uitgelegd met code die we hebben uitgevoerd: open modi, met het lezen van grote bestanden, CSV, JSON, pathlib, bi…

Lees artikel →
Softwareontwikkeling

Python-klassen en -objecten: OOP-zelfstudie met echte voorbeelden

Python-klassen en -objecten uitgelegd met code die we hebben uitgevoerd: __init__, methoden, klasse versus instantie-attributen, overerving, eigensc…

Lees artikel →
Kunstmatige intelligentie

Wat is een groot taalmodel? Hoe LLM's werken, uitgelegd zonder de hype

Wat is een groot taalmodel? LLM's uitgelegd in duidelijke taal: tokens, inbedding, aandacht, training, temperatuur- en contextvensters, een kleine d…

Lees artikel →
DevOps

Linux-opdrachten voor beginners: de essentiële terminalgids met voorbeelden

Linux-opdrachten voor beginners, gegroepeerd op taak: navigatie, bestanden, logboeken bekijken, grep, pipelines, machtigingen, processen en archieve…

Lees artikel →
Testautomatisering

Selenium versus toneelschrijver: belangrijkste verschillen, code vergeleken en welke te kiezen

Selenium versus Playwright vergeleken: architectuur, wachten, browser- en taalondersteuning, debuggen, dezelfde test in beide tools, migratieadvies …

Lees artikel →
Softwaretesten

Equivalentiepartitionering: testontwerptechniek uitgelegd met uitgewerkte voorbeelden

Equivalentiepartitionering uitgelegd: hoe je geldige en ongeldige partities kunt vinden, uitgewerkte voorbeelden voor leeftijden, wachtwoorden en ko…

Lees artikel →
Softwaretesten

Ernst versus prioriteit bij het testen van software: verschillen, matrix en echte voorbeelden

Ernst versus prioriteit bij het testen van software uitgelegd: duidelijke definities, een vierwegmatrix met voorbeelden, niveauschalen, wie deze bep…

Lees artikel →
Databases & SQL

Tutorial voor SQL-subquery's: typen, gecorreleerde subquery's en BESTAAN met voorbeelden

Een SQL-subquery-tutorial met query's die we hebben uitgevoerd: scalaire, IN-, FROM- en SELECT-subquery's, gecorreleerde subquery's, EXISTS, de NOT …

Lees artikel →
Databases & SQL

SQL-transacties en ACID uitgelegd: COMMIT-, ROLLBACK- en isolatieniveaus

SQL-transacties en ACID uitgelegd met een bankoverschrijving die we hebben uitgevoerd: COMMIT, ROLLBACK, savepoints, locks, isolatieniveaus, dirty r…

Lees artikel →
Softwareontwikkeling

Git merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt

Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.

Lees artikel →
Softwareontwikkeling

Python list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt

Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.

Lees artikel →
Databases & SQL

SQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)

Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.

Lees artikel →