Изображение на обложке 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:
URN используются для представления иностранных ассоциаций к сущности (лица, организации и так далее) в API. URN — это идентификатор на основе строки, имеющий формат:
Express foreign keys
Простые реляционные базы данных обычно используют (автоинкрементные) int
для идентификаторов строк в таблицах. Эта система эффективна и работает в сценарии с одной базой данных.
При масштабировании на несколько БД или распределенных приложений (es microservices) использования целых чисел уже недостаточно. К числу распространенных проблем относятся:
- конфликтующие автоинкрементные числа: будучи автоинкрементными, они подвержены возможным условиям гонки при создании записей
- слишком общий характер: система (или ее операторы) не в состоянии узнать, только взглянув на идентификатор, к какому виду ресурса относится этот идентификатор. Если вы думаете, что это не так важно, то недавно Atlassian взорвала 883 веб-сайта клиентов из-за аналогичной путаницы: скрипт включал идентификаторы для веб-сайтов, а не приложений в экосистеме бэкенда Atlassian. Эти идентификаторы затем использовались для удаления, но удалялся, как и ожидалось, не экземпляр приложения клиента, а весь его сайт.
Есть ли у вас другие примеры использования URN в системах? Мне интересно узнать о них, поэтому, пожалуйста, дайте мне знать в комментариях!