🔐
← Terug naar handleidingen

Base64-URL-veilige codering: wat het is en waarom het ertoe doet

· Tags: base64, url-safe, base64url, jwt, encoding, web-development, api

Wat is Base64-URL-veilige codering?

Base64-URL-veilige codering (ook wel Base64url genoemd) is een variant van standaard Base64 die tekens met speciale betekenissen in URL's en bestandsnamen vervangt door veilige alternatieven. Standaard Base64 gebruikt + en / als onderdeel van het alfabet van 64 tekens, plus = voor opvulling, en alle drie zijn problematisch in URL's, queryreeksen en bestandspaden.

Base64url lost dit op met twee eenvoudige vervangingen:

| Standaard Base64 | URL-veilige Base64 | |-----------------|-----------------| | + (plus) | - (minteken) | | / (schuine streep) | _ (liggend streepje) | | = (opvulling) | weggelaten (meestal) |

Waarom standaard Base64 URL's breekt

Wanneer een Base64-gecodeerde tekenreeks met + of / in een URL verschijnt, wordt het gedrag van browser en server onvoorspelbaar.

Het +-probleem

In URL-queryreeksen wordt het +-teken geïnterpreteerd als een spatie. Dit gedrag komt uit de application/x-www-form-urlencoded-specificatie en zorgt ervoor dat gedecodeerde gegevens onverwachte spaties bevatten.

Een Base64-tekenreeks zoals Pj4+Pz8/Pw== bevat bijvoorbeeld +-tekens. Als dit in een URL-parameter ?token=Pj4+Pz8/Pw== verschijnt, ziet de server ?token=Pj4 Pz8/Pw== — de + wordt een spatie.

Het /-probleem

In URL-paden is het /-teken een padseparator. Een Base64-tekenreeks zoals ab/CD+Ef== bevat een / die als een mapniveau wordt geïnterpreteerd. Als dit in een URL-segment verschijnt, kunnen zowel de client als de server de structuur verkeerd interpreteren.

Het =-probleem

Het =-teken wordt gebruikt voor sleutel-waardeparen in queryreeksen. Een afsluitende = in ?data=SGVsbG8= kan dubbelzinnig zijn — is de = onderdeel van de Base64-opvulling of van de queryparametersyntaxis?

Hoewel procent-codering deze problemen kan oplossen (+ wordt %2B, / wordt %2F), zwelt het de lengte van de tekenreeks op en maakt het debuggen moeilijker. Base64url is een schonere oplossing.

Hoe Base64url werkt

Base64url is formeel gedefinieerd in RFC 4648 sectie 5. Het gebruikt exact hetzelfde algoritme als standaard Base64 — 3 bytes worden 4 tekens — maar met de vervanging van één teken op posities 62 en 63 van het alfabet:

  • Alfabetindex 62: +- (minteken)
  • Alfabetindex 63: /_ (liggend streepje)

Opvulling (=) wordt doorgaans verwijderd, omdat deze bij het decoderen kan worden afgeleid uit de lengte van de tekenreeks. Een Base64url-tekenreeks is altijd een geldig URL-onderdeel zonder extra escaping.

Voor en na

Zo ziet dezelfde binaire gegevens er in beide formaten uit:

Standard:  Pj4+Pz8/Pw==
URL-safe:  Pj4-Pz8_Pw

Waar Base64url wordt gebruikt

JSON Web Tokens (JWT)

JWT is de meest prominente gebruiker van Base64url. Elk JWT bestaat uit drie delen — header, payload en handtekening — elk URL-veilig Base64-gecodeerd en gescheiden door punten:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNqP0m2iTgCjD0

Let op de streepjes en liggende streepjes — geen plustekens of schuine strepen. Als JWT standaard Base64 zou gebruiken, zouden tokens breken wanneer ze als URL-parameters worden doorgegeven, wat de meest gebruikelijke manier is waarop ze in webapplicaties worden gebruikt.

OAuth en OpenID Connect

Zowel OAuth 2.0 als OpenID Connect vertrouwen op JWT voor toegangstokens en ID-tokens, waardoor Base64url-codering fundamenteel is voor moderne authenticatie. De autorisatiecodestroom, impliciete stroom en client-credentials-stroom verzenden allemaal tokens die Base64url gebruiken.

Web-API's en queryparameters

Veel REST- en GraphQL-API's accepteren Base64-gecodeerde gegevens in queryparameters voor paginatiecursors, filters of gecodeerde payloads. Base64url zorgt ervoor dat deze parameters correct werken zonder extra URL-codering.

Voorbeeld uit de praktijk — API-cursorpaginatie:

GET /api/users?cursor=MjAyNC0wMS0xNVQxMDozMDowMFo

De API van GitHub gebruikt dit exacte patroon voor het pagineren van grote resultaatsets.

Bestandsnamen en bestandsopslag

Base64url-tekenreeksen vormen veilige bestandsnamen omdat ze geen padseparatoren (/), geen speciale tekens die bestandssystemen verwarren en geen tekens die ongeldig zijn op Windows (:, *, ?, enz.) bevatten.

Content Delivery Networks en cache-sleutels

CDN's en cachelagen gebruiken vaak Base64url-gecodeerde waarden als cache-sleutels. Standaard Base64 met / zou nep-maphiërarchieën in de cache-naamruimte creëren, wat leidt tot dubbelzinnige sleutels.

Converteren tussen standaard Base64 en Base64url

Converteren tussen de twee varianten is in elke taal eenvoudig:

JavaScript

// Standard Base64 to URL-safe Base64
function base64ToBase64url(base64) {
  return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}

// URL-safe Base64 to Standard Base64
function base64urlToBase64(base64url) {
  let result = base64url.replace(/-/g, '+').replace(/_/g, '/');
  // Restore padding
  while (result.length % 4) {
    result += '=';
  }
  return result;
}

Node.js

Node.js biedt native Base64url-ondersteuning sinds versie 15.7.0:

// Encode to Base64url
const encodedUrl = Buffer.from('Hello, world!').toString('base64url');
console.log(encodedUrl);
// Output: SGVsbG8sIHdvcmxkIQ

// Decode from Base64url
const decoded = Buffer.from(encodedUrl, 'base64url').toString('utf-8');
console.log(decoded);
// Output: Hello, world!

Python

import base64

# Encode to Base64url
encoded = base64.urlsafe_b64encode(b"Hello, world!")
print(encoded.decode())
# Output: SGVsbG8sIHdvcmxkIQ==

# Decode from Base64url
decoded = base64.urlsafe_b64decode(encoded)
print(decoded.decode())
# Output: Hello, world!

Wanneer standaard Base64 vs Base64url gebruiken

Gebruik standaard Base64 wanneer:

  • E-mailbijlagen worden gecodeerd (de MIME-standaard vereist dit)
  • Data-URL's voor HTML/CSS-insluiting worden gegenereerd
  • Gegevens worden opgeslagen in databases waar URL-veiligheid niet relevant is
  • Er wordt geïnteracteerd met legacy-systemen die standaard Base64 verwachten

Gebruik Base64url wanneer:

  • JWT-tokens worden gemaakt of geparseerd
  • Gecodeerde gegevens in URL-queryparameters of padsegmenten worden doorgegeven
  • Bestandsnamen uit binaire gegevens worden gegenereerd
  • Cache-sleutels of id's worden gemaakt
  • Er wordt gewerkt met OAuth-tokens of OpenID Connect

Probeer Base64-URL-veilige codering online

Gebruik onze gratis online Base64-coder en -decoder om te converteren tussen standaard Base64- en URL-veilige Base64-formaten. Plak uw gegevens, kies uw variant en u krijgt direct het resultaat.