URL je zároveň strojový formát i součást uživatelského rozhraní. Prohlížeč jej rozloží na přesně definované komponenty, zatímco člověk čte doménu, kopíruje odkaz a očekává, že bude fungovat i později. Jediný řádek popisuje protokol, síťový cíl, zdroj, parametry a místní stav dokumentu. Zacházet s URL jako se strukturou je proto spolehlivější než jej skládat jako libovolný string.

Schéma určuje první způsob interpretace

Část před dvojtečkou, například https, mailto nebo ftp, říká klientovi, jak se zbytkem naložit. HTTPS znamená síťové spojení s TLS, mailto může otevřít poštovní program.

Validace nemá pouze ověřit, zda hodnota připomíná adresu. Musí určit povolená schémata. Pole webu obvykle přijme HTTPS, ale odmítne javascript:, lokální soubor nebo interní protokol.

Authority popisuje síťový cíl

Za // bývá host a volitelný port. Host ovlivňuje certifikát, cookies, same-origin pravidla a CORS. Jiný port může vést k jiné službě na stejném stroji.

URL může historicky obsahovat userinfo před znakem @. V adrese trusted.example@evil.test je skutečný host vpravo. Bezpečnostní kontrola má používat parser, ne hledat známé slovo v textu.

Doménu je třeba porovnávat po celých labelech

Test endsWith("example.com") může přijmout také notexample.com. Allowlist musí kontrolovat hranice labelů a vědomě rozhodnout, zda povoluje subdomény.

Internacionalizované názvy používají IDNA. Vizuálně podobné znaky mohou sloužit k phishingu, takže bezpečnostní rozhodnutí vychází z normalizované reprezentace parseru.

Cesta je veřejná routingová smlouva

Path vypadá jako adresářová hierarchie, ale framework jej může mapovat na controller, databázový záznam nebo dynamický obsah. /articles/base64 nemusí odpovídat fyzickému souboru.

Publikovaná cesta se stane bookmarkem, výsledkem hledání a odkazem v dokumentaci. Interní reorganizace ji nemá automaticky změnit. Nový tvar potřebuje redirect ze starého.

Segment cesty není celá cesta

Lomítko odděluje segmenty. ID nebo slug se má vložit pomocí encoderu jednoho segmentu. Zakódování celé URL by změnilo také strukturální lomítka a dvojtečku.

Encoded slash zpracovávají proxy a frameworky různě. Authorization a router musí pracovat se stejným normalizovaným výsledkem, jinak vzniká prostor pro bypass.

Query nese parametry pohledu nebo operace

Za otazníkem bývá hledání, filtr, řazení, stránkování a tracking. Ampersand odděluje parametry a rovná se jméno od hodnoty. Pokud jsou tyto znaky daty, musí být správně zakódovány.

URL a query API zvládnou Unicode, prázdné hodnoty a opakování lépe než konkatenace. Server má navíc určit, zda duplicitní jméno tvoří seznam, nebo chybu.

Fragment obvykle zůstává v klientu

Část po # označuje místo v dokumentu nebo stav frontendu. Prohlížeč ji v běžném HTTP requestu neposílá serveru. Backend ji proto nemůže použít pro authorization ani ji nenajde v access logu.

Fragmenty jsou užitečné pro navigaci a accessibility. Z pohledu HTTP ale nevytvářejí jiný serverový zdroj.

Percent-encoding odděluje data od syntaxe

Rezervovaný znak lze přenést jako data zápisem jeho bajtů v procentové podobě. Unicode se nejprve převede na UTF-8 a potom se vybrané bajty zapíší například jako %20.

Pravidla se liší podle komponenty. Formulářová mezera může být plus, zatímco segment používá %20. Jediná globální escape funkce kontext nezná.

Relativní URL potřebuje důvěryhodný základ

../account nemá bez base jednoznačný cíl. Prohlížeč jej řeší vůči aktuálnímu dokumentu nebo elementu base. E-mailový klient takový kontext nemusí znát.

Při validaci redirectu se reference nejprve vyřeší vůči známému základu a potom se kontroluje výsledná absolutní URL. Samotný relativní text může skrývat jiný cíl.

Normalizace je politika, ne kosmetika

Host nerozlišuje velikost písmen, cesta může. Default port lze odstranit, ale trailing slash může znamenat jiný zdroj. Procentové sekvence mají více zápisů. Neexistuje univerzální bezpečné „vyčištění“.

Nejprve se parsuje a validuje, potom se podle smlouvy vytvoří kanonická forma. Cache, podpis a SEO musí používat stejné rozhodnutí.

URL není vhodné místo pro tajemství

Adresy se ukládají do historie, proxy logů, analytiky, screenshotů a někdy Referer hlavičky. Token v query se šíří i přes HTTPS. Credentials patří do chráněné hlavičky nebo těla.

Reset link je vědomá výjimka. Token potřebuje vysokou entropii, krátkou platnost, úzký účel a odstranění z adresy po použití.

Absolutní odkazy potřebují bezpečnou konfiguraci proxy

Aplikace za load balancerem může číst schéma a host z forwarded hlaviček. Pokud není seznam trusted proxies správně nastaven, klient ovlivní odkaz v e-mailu nebo redirect.

Base URL lze vzít z konfigurace produktu. Test má zahrnout skutečné TLS termination, aby interní HTTP nevytvářelo veřejné nebezpečné odkazy.

URL je dlouhodobá smlouva

Schéma a authority určují partnera, path zdroj, query variantu pohledu a fragment lokální pozici. Parser a builder tyto hranice zachovávají lépe než string operations.

Stabilní adresa se dá sdílet, jasný host buduje důvěru a kanonická forma omezuje duplicity. URL je veřejná architektura produktu, ne pouhý transportní detail.

Tato architektura se projeví také při řešení incidentů. Čitelná cesta v analytice, logu proxy nebo chybovém hlášení často prozradí typ zdroje ještě před otevřením aplikace. Vývojář, podpora i produktový tým pak mluví o stejném objektu stejným jazykem. Dobře navržené URL tak nesnižuje jen počet technických chyb, ale i čas potřebný k jejich nalezení a vysvětlení.

Proto se vyplatí návrh adres kontrolovat stejně pečlivě jako jiné veřejné rozhraní a zaznamenat jeho pravidla do sdílené dokumentace celého systému.