URI, URL, URN??? Идентификация ресурсов в Интернете

Изображение на обложке Shannon Potter на Unsplash

Если вы занимаетесь веб-разработкой, то в какой-то момент вы столкнетесь с тремя конкретными терминами: URI, URL и URN (это не так знакомо, но вы могли сталкиваться с ARN в AWS).
Возможно, вы также видели, что URI и URL используются как взаимозаменяемые, но важно отметить, что это не одно и то же, даже если они используются для очень похожих целей: поиск вещей и поиск вещей в Интернете.

Давайте разберемся, что означают эти аббревиатуры:

  • URI означает Uniform Resource Indicator (унифицированный указатель ресурса).
  • URL означает унифицированный указатель ресурса
  • URN означает унифицированное имя ресурса

URL и URN являются специфическими классификациями URI.

Бывает, что URI сильно отличаются друг от друга (из rfc3986#section-1.1.2):

ftp://ftp.is.co.za/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc2396.txt
ldap://[2001:db8::7]/c=GB?objectClass?one
mailto:John.Doe@example.com
news:comp.infosystems.www.servers.unix
tel:+1-816-555-1212
telnet://192.0.2.16:80/
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
Войти в полноэкранный режим Выход из полноэкранного режима

Следуйте за мной в глубоком погружении в URI, URL и URN, а также в старом добром копании в RFC. Наденьте защитные 🥽, возьмите свои ⛏ и поехали!!!

Что такое URI

Унифицированный идентификатор ресурса — это общий способ уникальной идентификации любого ресурса.

Полное определение содержится в RFC 3986, где вы можете найти все подробности.

Он принимает форму строки с таким синтаксисом:

URI = scheme ":" ["//" authority] path ["?" query] ["#" fragment]
Войти в полноэкранный режим Выйти из полноэкранного режима

Есть 5 компонентов:

  • authority (необязательный), для информации о пользователе и пространстве имен верхнего уровня (обычно домен или IP-адрес) с синтаксисом

  • path (обязательно, но может быть пустым — ну, вы знаете, парсеры 🤷), иерархическая структура, разделенная /

  • query (необязательный), начинается с ? и может содержать ? и / (например, path)

  • fragment (необязательный), он начинается с # до конца URI

Это довольно запутанно, и RFC невероятно подробен. Страница URI в Википедии поможет!

Важно понимать URI, поскольку это основа, на которой базируются URL и URN.

Что такое URL

Унифицированный локатор ресурса — это строковое представление для ресурса, доступного через Интернет.

У него есть свой RFC, RFC 1738, где мы находим все знакомые имена и строки, которые мы видим как веб-разработчики.

Он определяет некоторые специфические схемы, которые мы все знаем и любим:

   ftp                     File Transfer protocol
   http                    Hypertext Transfer Protocol
   gopher                  The Gopher protocol
   mailto                  Electronic mail address
   news                    USENET news
   nntp                    USENET news using NNTP access
   telnet                  Reference to interactive sessions
   wais                    Wide Area Information Servers
   file                    Host-specific file names
   prospero                Prospero Directory Service
Вход в полноэкранный режим Выход из полноэкранного режима

(подождите, что такое wais??? Думаю, я слишком молод для этого!)

и определяет обычный синтаксис схемы «Интернет» для всех схем URL, в которых используется протокол на основе IP:

//<user>:<password>@<host>:<port>/<url-path>
Войти в полноэкранный режим Выйти из полноэкранного режима

Я достаточно молод, чтобы в основном использовать только ftp, http и mailto! (И еще… просмотр Star Wars через telnet 😆) А вы использовали некоторые из них? Дайте мне знать в комментариях, я хочу прочитать вашу историю!!!

Что такое URN

Довольно просто, это URI со схемой urn. URN являются независимыми от местоположения и постоянными идентификаторами.

Это означает, что существует только один уникальный URN для данного ресурса в данном пространстве имен навсегда (или до тех пор, пока этот ресурс не перестанет существовать).

Определение URN дано в RFC 8141.

Их свойства быть независимыми от местоположения и постоянными делают их полезными для некоторых очень интересных случаев использования, в частности.

Их синтаксическое определение (rfc8141#section-2) довольно сложное, здесь приведена упрощенная версия:

URN = "urn" ":" NID ":" NSS [ "?+" r-component ] [ "?=" q-component ] [ "#" f-component ]
Войти в полноэкранный режим Выйти из полноэкранного режима

Это легче сравнить с URI с несколькими компонентами:

Следует отметить, что публичный реестр пространств имен URNs существует и поддерживается в IANA.

Означает ли это, что вам нужно зарегистрировать пространство имен, прежде чем использовать его? Нет, если вы планируете использовать его внутри компании, да, если вы хотите, чтобы оно было глобальным в Интернете (как xmpp или uuid).

Так круто, но где их использовать?

AWS

Если у вас есть опыт работы с Amazon Web Services, вы наверняка сталкивались с ARN: Имена ресурсов Amazon. По их определению:

Имена ресурсов Amazon (ARN) однозначно идентифицируют ресурсы AWS. Мы требуем ARN, когда вам нужно однозначно указать ресурс во всем AWS, например, в политиках IAM, метках Amazon Relational Database Service (Amazon RDS) и вызовах API.

Звучит знакомо? Формат тоже очень похож на URN (есть разные форматы, посмотрите документацию!):

arn:partition:service:region:account-id:resource-type/resource-id
Вход в полноэкранный режим Выход из полноэкранного режима

Судя по всему, это не RFC-совместимый URN, но очень похоже.

GCP

Google Cloud Platform полагается на URI для идентификации ресурсов на платформе.

(Имена ресурсов](https://cloud.google.com/apis/design/resource_names) — это URI без схемы, похожие на:

logging.googleapis.com/projects/myproject123/locations/global/buckets/my-bucket
Войти в полноэкранный режим Выход из полноэкранного режима

logging.googleapis.com является авторитетом, path — ресурсом. Поскольку path иерархичен, можно представить структуру ресурсов GCP таким образом (проект -> коллекция -> ресурс).

LinkedIn

Другим примером в масштабах страны является LinkedIn:

URN используются для представления иностранных ассоциаций к сущности (лица, организации и так далее) в API. URN — это идентификатор на основе строки, имеющий формат:

Express foreign keys

Простые реляционные базы данных обычно используют (автоинкрементные) int для идентификаторов строк в таблицах. Эта система эффективна и работает в сценарии с одной базой данных.

При масштабировании на несколько БД или распределенных приложений (es microservices) использования целых чисел уже недостаточно. К числу распространенных проблем относятся:

  • конфликтующие автоинкрементные числа: будучи автоинкрементными, они подвержены возможным условиям гонки при создании записей
  • слишком общий характер: система (или ее операторы) не в состоянии узнать, только взглянув на идентификатор, к какому виду ресурса относится этот идентификатор. Если вы думаете, что это не так важно, то недавно Atlassian взорвала 883 веб-сайта клиентов из-за аналогичной путаницы: скрипт включал идентификаторы для веб-сайтов, а не приложений в экосистеме бэкенда Atlassian. Эти идентификаторы затем использовались для удаления, но удалялся, как и ожидалось, не экземпляр приложения клиента, а весь его сайт.

Есть ли у вас другие примеры использования URN в системах? Мне интересно узнать о них, поэтому, пожалуйста, дайте мне знать в комментариях!

Оцените статью
devanswers.ru
Добавить комментарий