JWT Encoder

Maak en onderteken JSON Web Tokens met HS256, HS384, HS512

Header

Draait lokaal · Veilig om secrets te plakken

Payload

Draait lokaal · Veilig om secrets te plakken

Geheime sleutel

Draait lokaal · Veilig om secrets te plakken

Gecodeerd JWT

Output will appear here…

Je geheime sleutel verlaat nooit je browser. Alle ondertekening gebeurt aan de clientzijde.

Probeer ook:JWT Decoder

Wat is JWT-codering?

JWT-codering is het proces van het maken van een JSON Web Token — een compacte, URL-veilige tekenreeks die een set claims bevat die zijn ondertekend met een cryptografische sleutel. Het resultaat is een driedelig token (header.payload.signature) gedefinieerd door RFC 7519 dat servers kunnen verifiëren zonder de sessietoestand in stand te houden.

De header declareert het ondertekeningsalgoritme (bijv. HS256) en het tokentype. De payload bevat claims — sleutel-waardeparen zoals het onderwerp (sub), de vervaltijd (exp) en eventuele aangepaste gegevens die jouw applicatie nodig heeft. Beide delen worden geserialiseerd als JSON en vervolgens base64url-gecodeerd. De signature wordt berekend over de gecodeerde header en payload met een geheime sleutel, waarmee alle drie segmenten aan elkaar worden gekoppeld.

In tegenstelling tot sessiecookies zijn JWT's zelfstandig: de verificateur hoeft geen database te raadplegen of een externe dienst aan te roepen. Dit maakt JWT-gebaseerde authenticatie populair in REST API's, microservices en single-page applicaties waar staatloze autorisatie de latency vermindert en horizontale schaalbaarheid vereenvoudigt.

Waarom een JWT Encoder gebruiken?

JWT's handmatig genereren vereist base64url-codering, JSON-serialisatie en HMAC-berekening. Dit hulpmiddel voert alle drie stappen onmiddellijk uit, zodat je je kunt concentreren op de juiste claims.

Direct tokens genereren
Bewerk de header, payload en het geheim — de ondertekende JWT wordt direct bijgewerkt. Geen buildstap, geen bibliotheekinstallatie, geen boilerplatecode.
🔒
Meerdere HMAC-algoritmen
Schakel met één klik tussen HS256, HS384 en HS512. De header wordt automatisch bijgewerkt en de signature wordt onmiddellijk opnieuw berekend.
🛡️
Privacy-first verwerking
Alle ondertekening vindt plaats in je browser via de Web Crypto API. Je geheime sleutel en payloadgegevens verlaten nooit je apparaat — geen server, geen logs, geen risico.
📋
Claim-hulpmiddelen met één klik
Voeg iat-, exp+1h- of exp+24h-tijdstempels toe met één knop. Je hoeft Unix-tijdstempels niet handmatig te berekenen of de huidige epoch-tijd op te zoeken.

Gebruikssituaties voor JWT Encoder

Frontend-authenticatietests
Genereer tokens met specifieke claims en vervaltijden om inlogflows, token-vernieuwingslogica en beveiligde routebewakers te testen zonder een backend-authenticatieserver te draaien.
Backend API-ontwikkeling
Maak testtokens met aangepaste sub-, aud- en scope-claims om autorisatiemiddleware, rolgebaseerde toegangscontrole en rechtenmachtigingen te testen tijdens lokale ontwikkeling.
DevOps & CI/CD-pijplijnen
Genereer kortlevende servicetokens voor implementatiescripts, integratietests of communicatie tussen services waarbij een volledige OAuth-flow onnodige complexiteit zou toevoegen.
QA & handmatig testen
Bouw tokens met randgevallen — verlopen tokens, ontbrekende velden, verkeerde doelgroepen — om te controleren of je API de juiste HTTP 401- of 403-antwoorden retourneert.
Beveiligingsauditing
Maak tokens ondertekend met verschillende algoritmen en geheime sleutellengtes om te valideren dat je verificatielogica zwakke of niet-overeenkomende handtekeningen correct afwijst.
Leren & prototypen
Studenten en ontwikkelaars die nieuw zijn met JWT kunnen experimenteren met headervelden, claimstructuren en ondertekeningsalgoritmen om te begrijpen hoe elk deel van het token werkt.

HS256 vs HS384 vs HS512: vergelijking van HMAC-algoritmen

Alle drie algoritmen gebruiken HMAC (Hash-based Message Authentication Code) met een gedeeld geheim. Het verschil zit in de onderliggende hashfunctie, die de lengte van de signature en de veiligheidsmarge beïnvloedt. Voor de meeste toepassingen biedt HS256 voldoende beveiliging. Kies HS384 of HS512 wanneer nalevingsvereisten (bijv. FIPS-140) een sterkere hash voorschrijven of wanneer je tokens beslissingen met hoge autorisatiewaarde bevatten.

AlgoritmeHashHandtekeningSnelheidTypisch gebruik
HS256SHA-25632 BFastestGeneral purpose, default for most libraries
HS384SHA-38448 BFastHigher security margin, FIPS-140 compliant
HS512SHA-51264 BFastMaximum HMAC security, large payloads

Referentie standaard JWT-claims

RFC 7519 definieert zeven geregistreerde claims. Geen enkele is verplicht, maar correct gebruik ervan verbetert de interoperabiliteit en beveiliging. De exp-claim is bijzonder belangrijk — tokens zonder vervaldatum zijn onbeperkt geldig als het geheim niet wordt geroteerd.

ClaimNaamBeschrijvingVoorbeeld
issIssuerWho issued the token"auth.example.com"
subSubjectWho the token represents"user-123"
audAudienceIntended recipient service"api.example.com"
expExpirationUnix timestamp — token invalid after this time1717203600
nbfNot BeforeUnix timestamp — token invalid before this time1717200000
iatIssued AtUnix timestamp when the token was created1717200000
jtiJWT IDUnique token identifier for revocation tracking"a1b2c3d4"

JWT-codering in code

Deze voorbeelden laten zien hoe je JWT's programmatisch aanmaakt en ondertekent. Elk fragment produceert een geldig HS256-ondertekend token. Stel voor productiesystemen altijd de exp-claim in en gebruik een cryptografisch willekeurig geheim van minimaal 256 bits.

JavaScript (Web Crypto API)
async function signJWT(payload, secret, alg = 'HS256') {
  const header = { alg, typ: 'JWT' }
  const enc = new TextEncoder()

  // Base64url encode header and payload
  const b64url = (obj) =>
    btoa(JSON.stringify(obj)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

  const h = b64url(header)
  const p = b64url(payload)

  // Sign with HMAC-SHA256
  const key = await crypto.subtle.importKey(
    'raw', enc.encode(secret),
    { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']
  )
  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(`${h}.${p}`))
  const s = btoa(String.fromCharCode(...new Uint8Array(sig)))
    .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

  return `${h}.${p}.${s}`
}

// Usage
const token = await signJWT(
  { sub: 'user-123', name: 'Alice', iat: Math.floor(Date.now() / 1000) },
  'your-256-bit-secret'
)
// → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."
Python (PyJWT)
import jwt
import time

payload = {
    "sub": "user-123",
    "name": "Alice",
    "iat": int(time.time()),
    "exp": int(time.time()) + 3600,  # expires in 1 hour
}

# Sign with HS256 (default)
token = jwt.encode(payload, "your-256-bit-secret", algorithm="HS256")
# → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."

# Verify and decode
decoded = jwt.decode(token, "your-256-bit-secret", algorithms=["HS256"])
# → {"sub": "user-123", "name": "Alice", "iat": 1717200000, "exp": 1717203600}
Node.js (jsonwebtoken)
const jwt = require('jsonwebtoken')

const payload = {
  sub: 'user-123',
  name: 'Alice',
  role: 'admin',
}

// Sign — iat is added automatically
const token = jwt.sign(payload, 'your-256-bit-secret', {
  algorithm: 'HS256',
  expiresIn: '1h',    // sets exp claim
  issuer: 'auth.example.com',  // sets iss claim
})

// Verify
const decoded = jwt.verify(token, 'your-256-bit-secret')
// → { sub: 'user-123', name: 'Alice', role: 'admin', iat: ..., exp: ... }
Go (golang-jwt)
package main

import (
    "fmt"
    "time"
    "github.com/golang-jwt/jwt/v5"
)

func main() {
    claims := jwt.MapClaims{
        "sub":  "user-123",
        "name": "Alice",
        "iat":  time.Now().Unix(),
        "exp":  time.Now().Add(time.Hour).Unix(),
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signed, _ := token.SignedString([]byte("your-256-bit-secret"))
    fmt.Println(signed)
    // → eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi...
}

Veelgestelde vragen

Wat is het verschil tussen JWT-codering en JWT-decodering?
JWT-codering maakt een ondertekend token van een header, payload en geheime sleutel. JWT-decodering keert het proces om — het leest de base64url-gecodeerde header en payload terug naar JSON. Decodering vereist het geheim niet; codering altijd wel, omdat de handtekening berekend moet worden.
Hoe lang moet mijn JWT-geheime sleutel zijn?
Voor HS256 gebruik je een geheim van minimaal 256 bits (32 bytes). Voor HS384 minimaal 384 bits (48 bytes). Voor HS512 minimaal 512 bits (64 bytes). Kortere geheimen worden door de meeste bibliotheken technisch geaccepteerd, maar verminderen de effectieve beveiliging van de HMAC-handtekening. Genereer geheimen met een cryptografisch veilige willekeurige generator, niet met een door mensen gekozen wachtwoordzin.
Is het veilig om dit hulpmiddel te gebruiken met echte geheime sleutels?
Dit hulpmiddel verwerkt alles in je browser via de Web Crypto API — er worden geen gegevens naar een server gestuurd. Vermijd desondanks het plakken van productiegeheimen in een webtools als algemene beveiligingspraktijk. Gebruik voor productiesleutelbeheer omgevingsvariabelen of een geheimenbeheerder zoals HashiCorp Vault of AWS Secrets Manager.
Moet ik HS256 of RS256 gebruiken voor mijn applicatie?
Gebruik HS256 wanneer dezelfde service tokens zowel aanmaakt als verifieert — het is sneller en eenvoudiger. Gebruik RS256 (asymmetrisch) wanneer diensten van derden je tokens moeten kunnen verifiëren zonder ze zelf te kunnen aanmaken. RS256 is gebruikelijk bij OAuth 2.0-providers, OpenID Connect en multi-tenant SaaS-architecturen.
Waarom verloopt mijn JWT direct na aanmaak?
De exp-claim gebruikt Unix-tijdstempels in seconden, niet milliseconden. Als je exp instelt op Date.now() (dat milliseconden retourneert), lijkt het token duizenden jaren in de toekomst te verlopen — of als je per ongeluk een millisecondewaarde gebruikt waar seconden worden verwacht, kunnen bibliotheken dit interpreteren als al verlopen. Gebruik altijd Math.floor(Date.now() / 1000) in JavaScript of int(time.time()) in Python.
Kan ik gevoelige gegevens in de JWT-payload opslaan?
Dat kan, maar dat moet je niet doen. De JWT-payload is base64url-gecodeerd, niet versleuteld — iedereen met het token kan de claims lezen. Sla geen wachtwoorden, creditcardnummers of persoonsgegevens op in de payload. Als je gevoelige informatie moet opnemen, gebruik dan JWE (JSON Web Encryption) zoals gedefinieerd in RFC 7516, dat de gehele payload versleutelt.
Wat gebeurt er als ik de payload wijzig na ondertekening?
De handtekening wordt ongeldig. De HMAC-handtekening wordt berekend over de exacte bytes van de gecodeerde header en payload. Elke wijziging — zelfs een spatie toevoegen of één teken veranderen — produceert een volledig andere handtekening. Een correct geïmplementeerde verificateur zal het token afwijzen met een handtekening-mismatchfout.