URI、URL、および URN の明らかに
このガイドでは URI、URL、および URN の概要を説明し、それらの違いと使用例を解説します。
ウェブアプリの開発時には、さまざまなウェブサービスを呼び出す必要があることがよくあります。異なるウェブサービス間の通信および接続を構成する際に、URI、URL、および URN という概念に頻繁に遭遇します。これらを区別するのが難しく、多くの場合、誤用や混同が発生します。この記事では、例を挙げてそれらの違いを説明し、技術ブログやドキュメントを読むとき、または他のエンジニアとコミュニケーションを取るときに、これらの概念をより理解し、正しく解釈して使用する方法を説明します。
URL とは?
URL (Uniform Resource Locator) は、インターネット上のリソースのウェブアドレスまたは場所を提供します。通常、ウェブページ、ファイル、またはサービスの場所を指定するために使用されます。URL は、ウェブ上のリソースにアクセスするための標準化された形式を提供します。これは、ウェブブラウジング、リンク、およびインターネット通信の重要な要素です。
URL は、リソースのアドレスとそれにアクセスするために使用するプロトコルを定義するいくつかのパーツで構成されています。以下の例を解析し、それぞれのパーツの機能を順に説明します。
-
スキーム: これは、リソースにアクセスするために使用されるプロトコルやスキームを指定します。た とえば、HTTP(Hypertext Transfer Protocol)、HTTPS(HTTP Secure)、FTP(File Transfer Protocol)などがあります。
URL のスキームは
https
です。 -
ホスト: ホストは、リソースをホストしているサーバーのドメイン名または IP アドレスを指定します。
URL のホストは
example.logto.io
です。 -
ポート:(オプション)ポートは、リソースにアクセスするためにホスト上の特定のポート番号を表します。ポートが指定されていない場合、指定されたスキームの標準ポートがデフォルトになります。
HTTP のデフォルトポートは 80 、HTTPS のデフォルトポートは 443 です。
URL のポートは
8080
です。 -
パス:(オプション)パスは、リソースが存在するサーバ上の特定の場所やディレクトリを示し、ディレクトリやファイル名を含むことができます。
URL のパスは
/blogs/index.html
であるべきです。 -
クエリパラメーター:(オプション)クエリパラメーターは、動的なウェブアプリケーションでよく使用される、リソースに渡される追加のパラメーターです。クエリパラメーターはパスの後に表示され、
?
記号で区切られます。URL のクエリパラメータは
params1=value1¶m2=value2
であり、通常、キーと値のペアで表され、ペアは&
記号で区切られます。実際の使用シナリオでは、スペースなどの文字を避けるためにエンコードが必要になることがよくあります。 -
フラグメント識別子:(オプション)アンカーとも呼ばれ、リソース内 の特定の位置を示すために使用されます。
URL のアンカーは
#introduction
です。
たとえば、ファイルサービスを使用する場合や多くのウェブページの「お問い合わせ」ボタンが URL にリンクしている例として、以下のようなものがあります。
ftp://documents.logto.io/files/legal/soc_ii.pdf
mailto:[email protected]?subject=Enterprise%20quota%20request
URI とは?
URI は「Uniform Resource Identifier」の略です。これは、ウェブページ、ファイル、またはサービスなどの特定のリソースを識別する文字列です。URI は、標準化された形式を使用して、リソースを一意に識別およびロケートする方法を提供します。
URI は主に 2 つのコンポーネントで構成されます:
- スキーム: リソースにアクセスするために使用されるプロトコルやスキームを示します。
- リソース識別子: アクセスまたは参照された特定のリソースを識別します。リソース識別子の形式は、使用されているスキームによって異なります。
文法的には、URI は URL とほぼ同じ形式に従っており、その詳細は RFC 3986 に記載されています。
この URI 形式は、URL に似ていますが、Web 上のリソースへのアクセスを保証するものではありません。この形式を使用することで、名前空間の名前競合を減らすことができます。
前述のセクションでは、URL がリソースを識別するだけでなく、そのリソースの場所を特定することにも役立つと紹介しました。したがって、実際には URL は URI の適切な部分集合です。
URN とは?
URN は、URL や URI ほど一般的ではないかもしれません。これは「Uniform Resource Name」の略で、その目的はリソースが存在しなくなった場合でも永続的にリソースを識別することです。
URL とは異なり、URN はリソースを探し出すための情報を提供するものではなく、単に識別するだけであり、純粋な URI のようなものです。具体的には、URN は「urn」スキームを持つ URI の一種であり、その構造は RFC 2141 で説明されています:
<URN>:<NID>:<NSS>
- URN: 通常は
urn
。 - 名前空間識別子 (NID): URN を定義および管理する固有の名前空間または識別子システムを表します。これにより、識別子の一意性が確保されます。名前空間の例としては ISBN(国際標準図書番号)などがあります。
- 名前空間特異的文字列 (NSS): 指定された名前空間内でリソースを一意に識別する文字列です。識別子自体は、リソースの場所やアクセス方法に関する情報を伝えるものではありません。
たとえば、コンピュータシステムを紹介する非常に有名な本 CSAPP は、その ISBN 番号を URN として urn:isbn:9780134092669
で表しています。
URN は、SAML プロトコルのアサーションに対応する URN urn:oasis:names:tc:SAML:2.0:assertion
など、さまざまな標準規格で頻繁に使用されます。
ソフトウェアエンジニアリングでは、URN の命名規則に従って、特定の目的のために独自のシステムで URN を定義することもできます。たとえば、Logto では、Organization を有効にするために、SDK 使用時に構成で urn:logto:scope:organizations
スコープを追加する必要があります。また、各 Organization にも専用の URN urn:logto:organization:{orgId}
があります。
結論
URI、URL、および URN の関係は、次のベン図を使って説明できます:
URI、URL、および URN はすべて異なるリソースを識別するために使用されますが、リソースの位置を正確に特定できるのは URL だけです。
URI と URL は、HTTP、HTTPS、FTP などのさまざまなスキームをサポートできますが、URN は urn
スキームのみをサポートするものと考えられます。
すべての URL または URN は URI ですが、すべての URI が URL または URN であるとは限りません。