
前言#
在讀《Beyond XSS:探索網頁前端資安宇宙》這本書時,作者 Huli 在提到 origin 和 site 時用了 URL 組成要素的名稱(e.g. scheme、host、port 等)來說明,而自己對這部分不太熟悉,所以在這篇簡單筆記一下 URL 和 domain 的組成,主要是用來讓自己看懂書中的敘述~
什麼是URL#
URL 的全名是 Uniform Resource Locator,平常我們都稱為網址,它是一種用來指定網路資源位置的方法,並說明如何存取該資源的技術。當我們在瀏覽器輸入網址時,就是在告訴瀏覽器說你想要前往哪個網站、瀏覽哪些資源。
URL 的組成#
一般 URL 的組成結構大概是這樣:
scheme://username:password@host:port/path?query#fragment- scheme:指定瀏覽器要用哪種 protocol 請求資源,protocol 如:
http、https、ftp、mailto。
舉例來說,https://表示使用 HTTPS 協議。 - username
:屬於使用者資訊用來提供身份驗證資訊,包含使用者名稱和密碼,目前較少使用,因為不推薦在 URL 中傳遞敏感資訊。
舉例來說,user:pass表示使用者名稱為user,密碼為pass。 - host:資源的主要地址,通常是 domain 或 IP 地址。
- domain:host 的一種常見形式,是便於人類記憶的標識符,最終會解析為 IP 地址,舉例來說,
www.example.com就是 domain。 - IP 地址(Internet Protocol Address): 代表伺服器的實際位置,會直接指向伺服器,跳過域名系統(DNS)的解析過程。IP 地址有分 IPv4 和 IPv6 兩種類型,IPv4 是最常見的類型,使用 32 位元的地址格式,而 IPv6 使用 128 位元的地址格式。IPv4 地址例如
192.168.1.1。
- domain:host 的一種常見形式,是便於人類記憶的標識符,最終會解析為 IP 地址,舉例來說,
- port:指定伺服器上接受請求的埠號,如果沒顯示,則默認使用協議的標準埠號,HTTP 默認用 port
80,HTTPS 默認用 port443。
舉例來說,https://www.example.com:8080指定使用 port8080;而http://www.example.com則使用默認 port80。 - path:指定伺服器上資源的位置,通常對應伺服器上的實際檔案位置,但現在只是一種由 Web 伺服器處理的抽象概念,不一定對應於實際物理位置。
舉例來說,/docs/index.html可能代表資源位於 docs 目錄下的index.html文件;而/dashboard/settings在 SPA 中可能是由前端框架路由系統來決定顯示什麼內容。 - query:向伺服器傳遞附加參數或數據,是以
?開頭的多對 key value pair,每對以&隔開。
舉例來說,?search=javascript&lang=zh表示兩個參數。 - fragment:以
#開頭,用於指向資源中的特定部分(通常是網頁的錨點),fragment 不會傳到伺服器,是由瀏覽器處理。
舉例來說,#section1表示指向頁面中的 section1。
以上元素不是每個 URL 都會有,有些是可選的,可以參考 wikipedia 的示意圖:
另外也附上 MDN 舉例的示意圖,可對應 URL 各部分屬於哪個元素:

如果不知道一段 URL 中的各組成是什麼,可用 url-parts.glitch.me 來查詢,輸入 URL 後就會標示出對應組成:

host 與 domain 差異#
host 是 URL 中必需的部分,代表資源的主機名,它可以是 domain(如 example.com)或 IP 地址(如 127.0.0.1)。
domain 嚴格來說算是一種特殊形式的 host(基於 DNS),指代由 domain 系統管理的名稱,若 URL 中的 host 是 IP 地址,那 domain 通常被認為是 null 或不存在。
什麼情況下 domain 為 null?
- Host 是 IP 地址時: 如果 Host 是 IP 地址(如
192.168.1.1),則沒有對應的 domain 值
http://192.168.1.1:8080/Host: 192.168.1.1Domain: null- 本地測試環境: 如果使用 localhost 作為 Host,它不是一個 domain 名稱,而是一個特殊的 host
http://localhost:3000/Host: localhostDomain: null- URL 沒有 Scheme(相對 URL): 當 URL 是相對形式(如
/path/to/resource),沒有 Scheme、也沒 Host,此時 Host 和 Domain 都會是 null
/path/to/resourceHost: nullDomain: nullDomain(域名)的組成#
簡單介紹 domain 的組成元素,以下是一個以英文維基百科的域名為例的各層次的域名圖表:

domain 結構由右至左來看,可分為:
-
根域(Root Domain):位於 domain 最右端,隱式表示為
.,所有網域名稱的尾部實際上都有一個根網域名稱,但平常通常省略。
舉例來說,www.example.com.真正 domain 全稱是www.example.com.root。 -
頂級域 (Top-Level Domain, TLD):最高層級的網域,位於根域左側,但通常根域隱藏,所以通常 TLD 是網址的最後一個部分。
頂級網域可分兩類:
(1) 一般性頂級網域(general TLD, gTLD):表示特定用途或類型如:.com、.net、.org等,是由 ICANN (Internet Corporation for Assigned Names and Numbers)管理的,每個人都可申請自己的網域
(2) 國別頂級網域(country-code TLD, ccTLD):表示特定國家或地區的域名,如:.tw、.jp -
二級域名/次級域名(Second-Level Domain, SLD):位於 TLD 左側,代表網站核心標識。舉例來說
example.com中的example是次級域名。 -
子域(Subdomain):位於次級域左側,由域名所有者自定義,用來劃分不同功能或服務。例如
www.example.com中的www是subdomain。
以上是簡單版介紹 domain,還有 eTLD、eTLD+1、Public suffix、Registrable domain 這些名詞,會在 [Security] 細究 Same-origin policy 與 same site 這篇文章中介紹。
Reference:#
- https://yhtechnote.com/what-is-url/
- https://web.dev/articles/url-parts
- https://developer.mozilla.org/en-US/docs/Learn_web_development/Howto/Web_mechanics/What_is_a_URL
- https://en.wikipedia.org/wiki/URL
- https://pjchender.dev/internet/internet-domain-dns/
- https://url.spec.whatwg.org/
- https://blog.kalan.dev/2021-11-09-url-and-samesite
- https://www.michalspacek.com/origin-site-etld-etld-plus-one-public-suffix-psl-what-are-they
- https://en.wikipedia.org/wiki/Domain_name
如有任何問題歡迎聯絡、不吝指教✍