De quoi sont faites les URL
Une URL est une instruction compacte pour récupérer ou localiser une ressource : quel protocole parler, quel serveur contacter, quel chemin demander, et quels paramètres inclure. Les analyseurs traitent certains caractères comme syntaxe ; les données qui les contiennent doivent être encodées sinon l’URL casse. Comprendre chaque segment aide à déboguer routage, clés de cache, analytics et open redirects avant qu’ils deviennent des incidents.
8 min de lecture · Mis à jour le 2026-10-04

URI, URL et URN
URI (Uniform Resource Identifier) est le terme générique. Une URL (Uniform Resource Locator) décrit comment accéder à une ressource — https://example.com/page est une URL. Une URN nomme une ressource sans lieu (urn:isbn:978-…). Au quotidien en développement web, « URL » et « URI » sont souvent interchangeables pour les adresses http(s), mais les specs distinguent nom vs localisateur. API et journaux devraient stocker des URL canoniques avec encodage cohérent.
Exemple annoté
https://www.example.com:443/products/item?id=42&color=blue%20green#reviews
Full URL: https://www.example.com:443/products/item?id=42&color=blue%20green#reviews
01 · Schéma
https://
Protocole plus délimiteur d’autorité ; https implique TLS et port 443 par défaut quand il est omis.
02 · Sous-domaine
www.
Labels d’hôte à gauche du domaine registrable ; fait toujours partie de l’autorité envoyée dans l’en-tête Host.
03 · Hôte
example.com
Nom DNS ou IP que le client résout avant d’ouvrir une connexion.
04 · Port
:443
Optionnel ; explicite ici pour l’enseignement — les navigateurs masquent souvent le port https par défaut dans la barre d’adresse.
05 · Chemin
/products/item
Chemin hiérarchique de ressource sur le serveur ; apparaît sur la ligne de requête HTTP (avec la query).
06 · Requête
?id=42&color=blue%20green
Paramètres clé-valeur après ? ; espaces encodés en %20 (ou + dans certains corps de formulaire — pas toujours interchangeables).
07 · Fragment
#reviews
Ancre côté client seulement ; non envoyée à l’origine lors d’un fetch de document typique.
Concaténer les segments colorés reconstruit l’URL complète. Userinfo (user:pass@) est omis ici — les navigateurs modernes le dé-emphasisent dans les URL de navigation.
Rôle de chaque segment dans HTTP
| Composant | Envoyé à l’origine ? | Piège typique |
|---|---|---|
| Schéma | Indirectement (TLS vs clair) | Ressources http mixtes sur pages https |
| Autorité (hôte + port) | En-tête Host (+ port si non par défaut) | Mauvaise URL de base dans SPA et liens e-mail |
| Chemin + query | Ligne de requête | Double ? quand une URL imbriquée n’est pas encodeURIComponent |
| Fragment | Non | Attendre que #section atteigne le routage côté serveur |
Analyser l’URL complète
Séparer schéma, autorité, chemin, requête, fragment
Ligne de requête HTTP
Méthode + chemin + requête + version HTTP
En-tête Host
Hôte de l’autorité (et port si non par défaut)
Fragment abandonné
#syntax ne quitte jamais le navigateur pour le fetch réseau
Scroll au rendu
Après réponse, sauter vers id=syntax si présent dans le HTML
Les fragments permettent des ancres in-page sans aller-retour serveur.
Schéma et ports par défaut
Schémas courants
| Schéma | Port par défaut | Usage typique |
|---|---|---|
| http | 80 | HTTP clair (legacy, redirections https sur sites modernes) |
| https | 443 | HTTP sur TLS — défaut des apps web |
| ws / wss | 80 / 443 | WebSockets ; wss est TLS |
| mailto | — | Ouvre le client mail avec paramètres d’adresse |
| file | — | Accès fichier local ; règles sandbox spéciales en navigateur |
Omettre le port signifie « utiliser le défaut pour ce schéma ». Un :8080 explicite l’emporte quand les serveurs de dev écoutent hors standard.
Chemin, requête et pièges d’analyse
Les segments de chemin sont délimités par /. Les slash finaux peuvent compter pour caches et hôtes statiques — choisissez une forme canonique. Les query strings commencent à ? et utilisent & entre paires ; clés et valeurs séparées par =. ?key= vide envoie key avec valeur vide ; ?key seul peut être traité différemment selon les frameworks. Clés répétées (?tag=a&tag=b) sont valides ; le code serveur doit décider première, dernière ou toutes.
Les URL relatives se résolvent contre une base (RFC 3986). Un lien href="guides/foo" sur https://example.com/docs/ devient https://example.com/docs/guides/foo — des bugs apparaissent quand la base est fausse dans emails ou SPA.
Encodage pourcent (URL encoding)
Les caractères réservés — espace, &, =, ?, #, +, /, etc. — ont un rôle syntaxique. Quand ils apparaissent dans des données (termes de recherche, noms de fichier), encodez-les en % suivi de deux chiffres hex. L’espace est souvent %20 ; + dans les query strings signifiait historiquement espace dans application/x-www-form-urlencoded — ne supposez pas + et %20 interchangeables à chaque couche.
const q = "rock & roll";
encodeURIComponent(q); // "rock%20%26%20roll"
// Use encodeURIComponent for query VALUES;
// encodeURI for full URLs without breaking structure.Noms de domaine internationalisés et chemins
Les noms d’hôte Unicode apparaissent en punycode (xn--…) dans le DNS. Les chemins peuvent contenir de l’Unicode UTF-8 encodé en pourcent quand serveurs et frameworks autorisent les IRI. Normalisation et attaques homographes ( « a » cyrillique vs « a » latin ) sont des enjeux sécurité — les navigateurs appliquent same-origin sur les formes punycode.
Origine et règles same-site
L’origine combine schéma, hôte et port. Cookies, CORS et politiques fetch s’appuient sur l’origine — pas seulement le préfixe de chemin. Une page sur https://app.example.com/settings et une API sur https://api.example.com sont des origines différentes même sur le même domaine registrable ; des prises de sous-domaine cassent les hypothèses si le DNS est négligé.
Considérations de sécurité
Les URL sont à la fois navigation et surface d’attaque. Comme elles apparaissent dans barres d’adresse, emails, analytics et journaux serveur, de petites différences d’analyse entre framework, CDN et WebView mobile deviennent des bugs d’autorisation. Traitez chaque cible de redirection, URL de callback et endpoint webhook comme entrée non fiable jusqu’à parsing avec une API conforme aux specs et comparaison origine, chemin et forme encodée à une allowlist.
- Open redirects : valider les paramètres next= contre une allowlist de chemins ou hôtes.
- URL javascript : javascript:… dans href peut exécuter du script ; bloquer dans les liens générés par utilisateurs.
- Contenu mixte : pages https chargeant des sous-ressources http affaiblissent les garanties TLS.
- Données sensibles dans la query : les URL finissent dans journaux, Referer et historique — préférer corps POST ou en-têtes pour les jetons.
- Encodage trop long : %252F double-encodé contourne des filtres naïfs — normaliser avant contrôles d’autorisation.
- Phishing userinfo : https://evil.com@trusted.com/ peut ressembler à trusted.com dans l’UI — les navigateurs modernes dé-emphasisent userinfo.
- Hôtes avec point final : example.com. peut se résoudre différemment de example.com selon les résolveurs — normaliser avant les allowlists.
- Backslash vs slash : https://example.com\@evil.com/ trompe les parseurs qui traitent \ comme / avant validation.
- Smuggling de schéma : javascript: ou data: dans href si votre sanitizer ne vérifie que http — bloquer les schémas non navigables dans le contenu utilisateur.
Erreurs courantes dans le code applicatif
- Construire des query strings avec des templates au lieu de URLSearchParams — des & dans les valeurs scindent les paramètres silencieusement.
- Utiliser decodeURIComponent sur le href complet avant de vérifier l’hôte — peut masquer homographes ou traversal double-encodé.
- Mettre en cache sur la chaîne URL complète incluant l’ordre des paramètres de tracking — cache misses et PII dans les logs quand les id changent d’ordre.
- Supposer que Referer omet les chemins : strict-origin-when-cross-origin fuit encore l’origine ; les secrets appartiennent aux en-têtes ou corps POST.
SSRF et hôtes internes
Du code serveur qui fetch une URL fournie par l’utilisateur (cartes preview, importeurs, webhooks) peut être piégé pour appeler http://127.0.0.1, endpoints metadata ou adresses RFC 1918 privées. Bloquer hôtes link-local et loopback après parsing ; ne pas compter sur des contains string pour localhost. Same-origin policy protège les navigateurs ; les serveurs n’ont pas cette protection par défaut.
Pattern plus sûr
- 1
Parser avec l’API URL
new URL(input, base) en JS moderne
- 2
Allowlist hôte/chemin
Comparer l’origine après normalisation
- 3
Encoder les données sortantes
encodeURIComponent sur les valeurs seulement
- 4
Journaliser des URL redactées
Retirer jetons et ids de session en analytics
Pattern risqué
- 1
Concaténation de chaînes
Construire des URL avec ? et & manuels
- 2
Filtres blacklist
Bloquer seulement des littéraux
- 3
Décoder deux fois lâchement
Accepter des encodages trop longs
- 4
Secrets en query
Clés API visibles dans fuites Referer
Résolution relative dans les apps
Applications monopage et modèles email livrent souvent des liens relatifs. La résolution RFC 3986 fusionne une référence relative avec une URL de base : ../api/v1/users depuis https://example.com/app/dashboard/ devient https://example.com/app/api/v1/users quand les segments sont normalisés. De mauvaises balises base en HTML ou un basename de routeur incorrect produisent des 404 qui ressemblent à des bugs serveur mais sont des erreurs d’algèbre URL côté client.
const base = "https://example.com/app/page";
const rel = "../api/items?q=1";
console.log(new URL(rel, base).href);
// "https://example.com/app/api/items?q=1"Outils et specs alignés
Les url-encoder et url-decoder SmartKitio tournent dans le navigateur pour encoder en pourcent termes de recherche, URL next= imbriquées et segments de chemin non ASCII sans deviner quels caractères sont réservés. Quand un lien mal formé renvoie 404 ou 400, http-status-lookup explique le code pendant que vous découpez l’URL avec new URL() — schéma, hôte, chemin et searchParams doivent être inspectés séparément, pas comme une chaîne opaque.
Pour aller plus loin
- WHATWG URL Standard
- RFC 3986 — Uniform Resource Identifier (URI): Generic Syntax
- MDN — URL
- MDN — encodeURIComponent()
- RFC 9110 — HTTP semantics (origin, routing context) — Comment les requêtes ciblent des ressources identifiées par URL
Articles associés

Technologie
Que se passe-t-il quand vous saisissez une URL ?
Un chemin étape par étape, de la touche à la première peinture, incluant DNS, TLS, redirections et cache.
9 min de lecture · 2026-10-04
Lire l’article
Programmation
Encodage et chiffrement : quelle différence ?
Encodage, chiffrement, hachage et compression résolvent des problèmes différents. Les confondre — surtout Base64 avec le secret — provoque de vraies failles de sécurité.
7 min de lecture · 2026-10-04
Lire l’article
Programmation
Qu’est-ce qu’une API et comment ça marche ?
Les API sont des contrats entre programmes. Les API HTTP JSON en sont la face visible — méthodes, en-têtes, corps, codes de statut, auth et versioning expliqués.
9 min de lecture · 2026-10-04
Lire l’article
Web
Traitement côté client et côté serveur
L’endroit où le calcul s’exécute façonne vie privée, latence, coût et confiance. Carte pratique du travail navigateur versus serveur — et ce que font vraiment les apps hybrides.
6 min de lecture · 2026-10-04
Lire l’article
