Авторизация, аутентификация и идентификация
Предисловие
Ох, благодатный пост. Как же у меня горит от тех людей, которые не понимают разницу. А ведь всё очень просто! Давайте разберёмся.
На самом деле чтобы разобраться, достаточно быть хорошо знакомым с этими словами в Английском языке. Но, раз я пишу для русскоязычной аудитории, то поясню в подробностях.
Идентификация
По-английски будет “identification”. Это процесс определения идентичности или индивидуальности.
Что это значит для нас, простых студентов филфака МГУ программистов?
Идентичность и индивидуальность объекта позволяют нам отличить этот объект от любых других.
Например, есть десять экзаменационных листов. Сами по себе листы одинаковые, распечатаны на одном принтере в одно и то же время. Что может их отличать? Например, номер (если такой на листе есть). Или, если по номеру идентифицировать лист мы не можем, то имя и фамилия экзаменующегося (написанные на этом листе) могут служить идентификационными данными.
Другой пример. Группа анонимных фронтендеров алкоголиков. На встрече такой группы каждый называет какое-то имя (не обязательно при этом совпадающее с паспортным). В этой группе все будут друг друга различать по этим именам. Ну, там, Вася, Петя, Крис, Дэвид.
Живой пример из мира IT: идентификатор сессии google analytics. При попадании любого браузера в поле действия google analytics этому браузеру назначается идентификатор, по которому этот браузер будет на стороне GA отличаться от миллиардов других.
Аутентификация
По-английски будет “authentication”. Это процесс определения аутентичности или подлинности.
С объяснением аутентичности уже посложнее, чем с идентичностью. Определение подлинности позволяет нам определить (ух, какой у меня красивый слог-то, а), что какой-то объект является тем, за кого он себя выдаёт.
Всё тот же пример с экзаменационными листами. Как нам подтвердить, что лист, на коротом написано “Крис Маккорд” действительно заполнен Крисом? Мне известен только один способ: экспертиза почерка. Если почерк на этом листе полностью соответствует почерку Криса, то этот лист действительно заполнил он, а не кто-то другой.
Другой пример. Группа (не)анонимных алкоголиков фронтендеров. Как мы можем утверждать, что пришедший на встречу человек является Дэном Абрамовым (а вот этот весёлый парень в кепке представился именно им)? Например, проверить его паспорт. И если там написано “Дэн Абрамов” (ну и совпадают серия, номер, что там ещё), то этот человек в кепке — точно Дэн Абрамов.
Живой пример из мира IT: пароль и логин на форме входа в google account. Если логин является открытой информацией, то пароль — закрытой. И только тот, кто создавал аккаунт, знает этот самый пароль. С помощью пароля он подтверждает свою аутентичность как владельца аккаунта.
Куда более интересная для изучения аутентификация, например.
Разница между идентификацией и аутентификацией
Если непонятно, чем отличается идентификация от аутентификации, то я попробую в этом пункте разъяснить.
Идентификационные данные доступны всем, и зачастую не принадлежат ни каким образом объекту идентификации. Например, все знают, что меня зовут Валентин. Все могут меня различать по моей внешности и/или имени.
Аутентификационные данные же доступны только объекту аутентификации. Например, только у меня есть мой паспорт. Только у меня есть мой рисунок сетчатки глаза и отпечатки пальцев. Никто, кроме меня, не может предоставить эти данные аутентифицирующему субъекту. Именно по причине доступности только мне по этим данным меня и аутентифицируют.
Являются ли аутентификационные данные идентификационными? Да. Если мы можем проверить аутентичность (оригинальность), то мы можем проверить и идентичность (индивидуальность). Но у вас в базе всё равно же есть user_id
, так что зачем светить везде пароль =)
Авторизация
Вот если с разницей идентификации и аутентификации вопрос достаточно тонкий, то не различать аутентификацию и авторизацию — моветон. Я бы даже сказал, что это — грех для тех, кто работает в области IT.
Что же такое авторизация?
Обратимся к английскому варианту — “authorization”, однокоренным словом которого является “authority” — “власть” или “полномочие”.
То есть “авторизация” — процесс определения полномочий объекта.
“Могу ли я узнать состояние счёта в банке Валентина — могу”, — вот типичный процесс авторизации. А вот на вопрос “а действительно ли я тот самый Валентин” будет отвечать уже аутентфикация.
Пример с экзаменационными листами. Кто имеет право проверять экзаменационные листы? Только учитель (ну или проверяющий в случае ЕГЭ).
Другой пример. Кто имеет право отправлять коммиты в репозиторий группы (не)анонимных алкоголиков фронтендеров? Только владелец соответствующего аккаунта на гитхабе.
Живой пример из мира IT: может ли пользователь с ролью “редактор” удалить запись другого пользователя с ролью “редактор”? Нет. Это может сделать только пользователь с ролью “администратор”.
Заключение
Я считаю, что всё это нужно хорошо понимать как говнокодерам инженерам, так и фронтендерам людям, не пишущим код. Чтобы при возникновении проблем в идентификации, аутентификации и авторизации общение происходило на одном языке, понятном всем.
Поэтому пройдусь по списку ещё раз:
- Идентификация отвечает на вопрос “кто это такой?”
- Аутентификация отвечает на вопрос “он точно тот, за кого себя выдаёт?”
- Авторизация отвечает на вопрос “что ему позволено делать?”