Авторизация, аутентификация и идентификация
Ох, благодатный пост. Как же у меня горит от тех людей, которые не понимают разницу. А ведь всё очень просто! Давайте разберёмся.
На самом деле чтобы разобраться, достаточно быть хорошо знакомым с этими словами в Английском языке. Но, раз я пишу для русскоязычной аудитории, то поясню в подробностях.
Идентификация
По-английски будет “identification”. Это процесс определения идентичности или индивидуальности.
Что это значит для нас, простых студентов филфака МГУ программистов?
Идентичность и индивидуальность объекта позволяют нам отличить этот объект от любых других.
Например, есть десять экзаменационных листов. Сами по себе листы одинаковые, распечатаны на одном принтере в одно и то же время. Что может их отличать? Например, номер (если такой на листе есть). Или, если по номеру идентифицировать лист мы не можем, то имя и фамилия экзаменующегося (написанные на этом листе) могут служить идентификационными данными.
Другой пример. Группа анонимных фронтендеров алкоголиков. На встрече такой группы каждый называет какое-то имя (не обязательно при этом совпадающее с паспортным). В этой группе все будут друг друга различать по этим именам. Ну, там, Вася, Петя, Крис, Дэвид.
Живой пример из мира IT: идентификатор сессии google analytics. При попадании любого браузера в поле действия google analytics этому браузеру назначается идентификатор, по которому этот браузер будет на стороне GA отличаться от миллиардов других.
Аутентификация
По-английски будет “authentication”. Это процесс определения аутентичности или подлинности.
С объяснением аутентичности уже посложнее, чем с идентичностью. Определение подлинности позволяет нам определить (ух, какой у меня красивый слог-то, а), что какой-то объект является тем, за кого он себя выдаёт.
Всё тот же пример с экзаменационными листами. Как нам подтвердить, что лист, на коротом написано “Крис Маккорд” действительно заполнен Крисом? Мне известен только один способ: экспертиза почерка. Если почерк на этом листе полностью соответствует почерку Криса, то этот лист действительно заполнил он, а не кто-то другой.
Другой пример. Группа (не)анонимных алкоголиков фронтендеров. Как мы можем утверждать, что пришедший на встречу человек является Дэном Абрамовым (а вот этот весёлый парень в кепке представился именно им)? Например, проверить его паспорт. И если там написано “Дэн Абрамов” (ну и совпадают серия, номер, что там ещё), то этот человек в кепке — точно Дэн Абрамов.
Живой пример из мира IT: пароль и логин на форме входа в google account. Если логин является открытой информацией, то пароль — закрытой. И только тот, кто создавал аккаунт, знает этот самый пароль. С помощью пароля он подтверждает свою аутентичность как владельца аккаунта.
Разница между идентификацией и аутентификацией
Если непонятно, чем отличается идентификация от аутентификации, то я попробую в этом пункте разъяснить.
Идентификационные данные доступны всем, и зачастую не принадлежат ни каким образом объекту идентификации. Например, все знают, что меня зовут Валентин. Все могут меня различать по моей внешности и/или имени.
Аутентификационные данные же доступны только объекту аутентификации. Например, только у меня есть мой паспорт. Только у меня есть мой рисунок сетчатки глаза и отпечатки пальцев. Никто, кроме меня, не может предоставить эти данные аутентифицирующему субъекту. Именно по причине доступности только мне по этим данным меня и аутентифицируют.
Являются ли аутентификационные данные идентификационными? Да. Если мы можем проверить аутентичность (оригинальность), то мы можем проверить и идентичность (индивидуальность). Но у вас в базе всё равно же есть user_id , так что зачем светить везде пароль =)
Авторизация
Вот если с разницей идентификации и аутентификации вопрос достаточно тонкий, то не различать аутентификацию и авторизацию — моветон. Я бы даже сказал, что это — грех для тех, кто работает в области IT.
Что же такое авторизация?
Обратимся к английскому варианту — “authorization”, однокоренным словом которого является “authority” — “власть” или “полномочие”.
То есть “авторизация” — процесс определения полномочий объекта.
“Могу ли я узнать состояние счёта в банке Валентина — могу”, — вот типичный процесс авторизации. А вот на вопрос “а действительно ли я тот самый Валентин” будет отвечать уже аутентфикация.
Пример с экзаменационными листами. Кто имеет право проверять экзаменационные листы? Только учитель (ну или проверяющий в случае ЕГЭ).
Другой пример. Кто имеет право отправлять коммиты в репозиторий группы (не)анонимных алкоголиков фронтендеров? Только владелец соответствующего аккаунта на гитхабе.
Живой пример из мира IT: может ли пользователь с ролью “редактор” удалить запись другого пользователя с ролью “редактор”? Нет. Это может сделать только пользователь с ролью “администратор”.
Заключение
Я считаю, что всё это нужно хорошо понимать как говнокодерам инженерам, так и фронтендерам людям, не пишущим код. Чтобы при возникновении проблем в идентификации, аутентификации и авторизации общение происходило на одном языке, понятном всем.
Идентификация, Аутентификация, Авторизация. В чем же разница?
Думаю, что каждый тестировщик сталкивался с ситуацией, когда после тестирования одной из таких «форм» с логином и паролем приходилось заводить баг-репорт c использованием слова «Авторизация».
Но ведь задача тестировщика постараться максимально точно и грамотно обозначить проблему!
Возможно ли это? Конечно!
Именно поэтому в данной статье мы разберем такой процесс как «Авторизация», а также поговорим о таких очень близких понятиях как «Идентификация» и «Аутентификация». Разберем, как всё это взаимосвязано и постараемся сделать это максимально просто и доступно для того, чтобы у вас не осталось никаких вопросов после прочтения данной статьи!
Итак, для наглядности и лучшего понимания были подготовлены три экрана мобильного телефона c типичной формой логина в приложениях:
· первый экран (Screen 1) как наглядный пример процесса «Идентификации»;
· второй экран (Screen 2) как наглядный пример процесса «Аутентификации»;
· третий экран (Screen 3) как наглядный пример процесса «Авторизации».
Итак, Screen 1 — на первом экране идет распознавание пользователя по его уникальному идентификатору.
Цель идентификации – понять, кто “стучится в нашу систему”. Чаще всего для идентификации используются: имейл, имя пользователя, телефон…
Бывает возможность выбора. К примеру, залогиниться по имени пользователя или по номеру телефона. Важно то, что этот идентификатор будет являться уникальным значением. В Базе Данных это, вероятнее всего, будет столбец в таблице с уникальными данными (primary key). То есть в системе не может быть зарегистрировано два одинаковых идентификатора, два одинаковых номера телефона, два одинаковых имейла и так далее.
Например, при попытке зарегистрировать новый адрес электронной почты пользователь вводит свой идентификатор (логин), например: «Вася92», а система подсвечивает поле красным и сообщает, что такой пользователь уже зарегистрирован в системе, предлагая на выбор несколько других вариантов – именно это и будет пример идентификации.
Screen2 — процесс аутентификации, а именно проверки пользователя на его подлинность, что юзер у нас действительно является тем, кем он представляется системе, пытаясь в нее попасть.
Существует 3 фактора, которые напрямую задействуются в процессе аутентификации:
1. Знание
Например пароль, ПИН-код, секретное слово и так далее.
Главное, что эта информация известна конкретному пользователю.
2. Владение
Второй фактор – это владение, является ли пользователь (который “стучится в систему”) обладателем чего-то, к примеру – уникальных биометрических данных, присущих только ему.
Это очень хорошо распространено в телефонах, к примеру, когда девайс распознает владельца по отпечатку пальца.
3. Свойство
Пользователь имеет какой-то уникальный признак, и система его может аутентифицировать и пропустить дальше. К примеру: в случае использования мобильного банкинга или налогового приложения после его запуска система попросит у пользователя набор ключей. Пользователь использует флешку с электронными ключами, система распознает эти ключи, а затем выдает пользователю доступ к использованию системы.
Обратите внимание! Если доступ к системе предоставляется после введения логина и пароля, то это будет однофакторная аутентификация — самая простая.
Но если система говорит пользователю: «Окей, тебе известен пароль, но возможно ты его украл. Какими-то биометрическими данными ты еще обладаешь? Давай-ка ты, дружочек-пирожочек, покажи свое лицо и докажи системе повторно — что ты есть ты!”, в таком случае система проведет повторную аутентификацию и вот это уже будет наша многофакторная, а конкретнее двухфакторная аутентификация (ДФА, 2FA).
Screen 3 — это завершающий этап, когда:
· система проверила наш идентификатор;
· успешно прошел процесс аутентификации.
После чего следует наделение пользователя определенными правами. Возможно, система авторизовала нас как юзера с уже определенным набором возможностей и показывает нам информацию, который должен видеть обычный пользователь системы.
На 3-м экране мы видим определенные секции в нашем приложении. Представим, что мы можем кликнуть по ним и увидеть информацию, к примеру: кликнуть по иконкам и просмотреть, что там внутри, прокрутить страницу и так далее…
В данном случае мы зашли в систему как обычный пользователь, но ведь система могла авторизовать нас как администратора. Во втором случае система предоставила право, к примеру, на редактирование или удаление информации. С точки зрения тестирования у пользователя появляется просто огромное поле возможностей для проведения тестирования.
Это крайне важно с точки зрения безопасности – на сколько система правильно ведет себя на этапе идентификации, затем на этапе аутентификации и в итоге авторизации.
Тестировщик проверяет, все ли происходит в соответствии с требованиями, нет ли каких-то ошибок, потому что баги на этапах идентификации/аутентификации/авторизации могут быть критичны.
Таким образом, мы разобрали понятия идентификации, аутентификации и авторизации. Надеемся, если раньше у вас возникали какие-то трудности с этим, то теперь все стало более понятно.
Авторизация и аутентификация: в чём разница
Авторизацию и аутентификацию легко спутать, но это разные вещи. Их нужно различать и понимать, как использовать, чтобы обезопасить свои данные или данные пользователей.
Аутентификация — это проверка, что вы действительно тот человек, за которого себя выдаёте.
Вот простой пример из жизни: представьте, что вам написал друг и попросил занять денег до понедельника. Чтобы убедиться, что это не мошенник, вы проводите аутентификацию — звоните приятелю. И если ваш друг подтвердит, что это ему нужны деньги, он пройдёт проверку.
Авторизация — это получение права доступа к чему-то. Например, ваш друг получит доступ к деньгам и потратит их.
Идентификация, аутентификация и авторизация в IT
На самом деле в цепочке проверки есть ещё один пункт — идентификация, то есть распознавание пользователя по его идентификатору. Она помогает понять, для какого субъекта будет выполняться проверка.
Допустим, вы хотите открыть свою страницу в соцсетях. Сначала вводите логин — система опознаёт, что вы пытаетесь войти под именем BossKeks. Это идентификация. Затем вам нужно доказать, что вы тот, за кого себя выдаёте. Для этого вы вводите пароль и нажимаете кнопку «Отправить». Выполняется аутентификация: ваши данные сверяются с паролем, который хранится на сервере. Если всё совпадёт, выполнится авторизация. Вы получите доступ к своему аккаунту и сможете отправлять сообщения, загружать фото или писать комментарии к постам.
Научитесь писать безопасный код и защищать сайт от атак на курсе «Протоколы и сети».
Дополнительные проверки при аутентификации
От способа аутентификации зависит, насколько защищены данные пользователей. Самый простой способ защиты — традиционная или однофакторная аутентификация, когда вы проходите одну проверку. Например, вы можете ввести пароль, чтобы попасть в личный кабинет в интернет-магазине. По биометрии, отпечатку пальца или Face ID вы разблокируете смартфон. Используя аппаратный ключ безопасности (ключ U2F), зайдёте в менеджер паролей или на другой сервис. А по разовому коду сможете войти в Телеграм, если не включите дополнительную защиту аккаунта.
У однофакторной аутентификации есть недостаток: злоумышленники могут взломать или украсть пароли, поэтому лучше использовать двухфакторную. Например, вы можете на Госуслугах после ввода пароля запрашивать код из смс. Двухфакторная аутентификация безопаснее — используйте её и в разработке, и при личном использовании веб-сайтов или приложений.
Итоги
Авторизация и аутентификация — два разных процесса. Аутентификация нужна, чтобы проверить право доступа к данным, авторизация — это когда вы получаете доступ.
Проверка всегда начинается с идентификации, за ней идёт аутентификация и в конце авторизация. Все эти этапы защищают ваши персональные данные и деньги. Поэтому подходите к проверке ответственно, чтобы данные не оказались в руках злоумышленников.
Материалы по теме
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
Читать дальше
Случайное число из диапазона
Допустим, вам зачем-то нужно целое случайное число от min до max . Вот сниппет, который поможет:
- Math.random () генерирует случайное число между 0 и 1. Например, нам выпало число 0.54 .
- (max — min + 1): определяет количество возможных значений в заданном диапазоне. 10 — 0 + 1 = 11 . Это значит, что у нас есть 11 возможных значений (0, 1, 2, . 10).
- Math.random () * (max — min + 1): умножает случайное число на количество возможных значений: 0.54 * 11 = 5.94 .
- Math.floor (): округляет число вниз до ближайшего целого. Так, Math.floor(5.94) = 5 .
- . + min: смещает диапазон так, чтобы минимальное значение соответствовало min . Но в нашем примере, так как min = 0 , это не изменит результат. Пример: 5 + 0 = 5 .
- Итак, в нашем примере получилось случайное число 5 из диапазона от 0 до 10.
Чтобы протестировать, запустите:
- 7 сентября 2023
В чём разница между var и let
Если вы недавно пишете на JavaScript, то наверняка задавались вопросом, чем отличаются var и let , и что выбрать в каждом случае. Объясняем.
var и let — это просто два способа объявить переменную. Вот так:
Переменная, объявленная через var , доступна только внутри «своей» функции, или глобально, если она была объявлена вне функции.
Это может создавать неожиданные ситуации. Допустим, вы создаёте цикл в функции и хотите, чтобы переменная i осталась в этой функции. Если вы используете var , эта переменная «утечёт» за пределы цикла и будет доступна во всей функции.
Переменные, объявленные с помощью let доступны только в пределах блока кода, в котором они были объявлены.
В JavaScript блок кода — это участок кода, заключённый в фигурные скобки <> . Это может быть цикл, код в условном операторе или что-нибудь ещё.
Если переменная j объявлена в цикле с let , она останется только в этом цикле, и попытка обратиться к ней за его пределами вызовет ошибку.
- 30 августа 2023
Быстрый гайд по if, else, else if в JavaScript
Допустим, вы собираетесь идти на прогулку. Если на улице солнечно, вы возьмёте с собой солнечные очки.
Это можно описать с помощью оператора if .
А если погода не солнечная, а, скажем, дождливая, вы возьмете зонт.
Этот сценарий можно описать с помощью if-else .
Условный оператор if-else if-else
Теперь представим, что у вас есть несколько вариантов транспорта для дороги на работу: машина, велосипед, общественный транспорт. Выбор будет зависеть от различных условий, например, погоды и времени суток. Логично, что в дождь безопаснее ехать на автобусе, а в хорошую погоду можно прокатиться на машине или велосипеде, если утро и пробки. То есть схема такая:
И всё это очень легко описывается кодом:
Ветвление только может показаться сложным, но вообще оно очень логичное, если понять, какие действия после каких условий выполняются. Разберитесь один раз и поймёте на всю жизнь, 100%.
- 30 августа 2023
Как исправить ошибки SyntaxError в JavaScript
Ошибки SyntaxError появляются, если разработчик нарушил правила синтаксиса JavaScript, например, пропустил закрывающую скобку или точку с запятой. Давайте посмотрим, что означает каждая ошибка и в чём может быть проблема.
- 14 июля 2023
Ошибка TypeError: что это и как её исправить
Ошибки TypeError появляются, когда разработчики пытаются выполнить операцию с неправильным типом данных. Давайте разберём несколько примеров: почему появилась ошибка и как её исправить.
- 7 июля 2023
3 способа объявить функцию в JavaScript
Функции в JavaScript можно объявить тремя способами: через декларативное объявление, функциональное выражение или с помощью стрелок. Звучит сложно, но на самом деле всё совсем не так.
- 30 июня 2023
Как сделать простой слайдер на HTML и JavaScript
Вы сверстали сайт и сделали его красивым с помощью CSS. Осталось добавить интерактива, и можно добавлять проект в портфолио.
«Оживить» на сайте можно что угодно: меню, модальные окна, корзину, пагинацию… В этой статье мы разберём слайдер — посмотрим, как его сделать на чистом JavaScript. Слайдер пригодится для раздела с отзывами, фотографиями сотрудников, изображениями товаров или чего-нибудь ещё — всё зависит только от вашей фантазии и проекта.
☝ Мы покажем лишь один из возможных вариантов. Это не эталонное решение, да в разработке и не бывает единственно верного способа решить задачу. Но код точно работает, поэтому можете скопировать его в свой проект.
- 20 июня 2023
Полезные команды для работы с Node.js
Перед тем как рассматривать полезные команды при работе с Node.js, её необходимо установить.
Команды помогают узнать версию Node.js,
node -h — показывает список всех доступных команд Node.js.
node -v , node —version — показывает установленную версию Node.js.
npm -h — показывает список всех доступных команд пакетного менеджера npm .
npm -v , npm —version — показывает установленную версию npm .
Команда npm update npm -g позволяет обновить версию npm .
npm list —depth=0 показывает список установленных пакетов.
Команда npm outdated —depth=0 покажет список установленных пакетов, которые требуют обновления. Если все пакеты обновлены, список будет пустым.
npm install package — позволяет установить любой пакет по его имени. Если при этом к команде добавить префикс -g пакет будет установлен глобально на весь компьютер.
Команда npm i package является укороченной альтернативой предыдущей команды.
Если вы хотите установить конкретную версию пакета, воспользуйтесь префиксом @ с номером версии. Например, npm install package@1.0.1 .
npm uninstall package — удаляет установленный пакет по имени.
Команда npm list package — покажет версию установленного пакета, а команда npm view package version — последнюю версию пакета, которая существует.
Для работы с пакетным менеджером также пригодится файл package.json , который должен лежать в директории, с которой происходит работа в консоли.
Он содержит различные мета-данные, например, имя проекта, версия, описания и автор. Также он содержит список зависимостей, которые будут установлены, если вызвать из этой папки команду npm install .
Кроме этого он ещё имеет скрипты, которые вызывают другие команды консоли. Например, для этого файла вызов команды npm start вызовет запуск задачи Grunt с именем dev . А команда npm run build вызовет скрипт build , который запустит задачу в Grunt с именем build .
Во время работы часто возникает необходимость установить некоторые пакеты. Если установить пакет с префиксом —save , то он автоматически запишется в package.json в раздел dependencies . Такая же команда с префиксом —save-dev запишет пакет в раздел devDependencies .
nvm (илиNode Version Manager) — утилита, которая позволяет быстро менять версии Node.js.
Чтобы её установить, достаточно запустить скрипт
Теперь можно установить последнюю версию Node.js, например, 5.0 с помощью команды nvm install 5.0 . Чтобы начать использовать её, введите команду nvm use 5.0 . Таким образом, можно быстро переключаться между версиями, например, для тестирования.
- 8 июня 2023
Как составлять регулярные выражения
Регулярное выражение — это последовательность символов (селекторов). Оно используется для поиска и обработки строк, слов, чисел и других текстовых данных.
Регулярные выражения выручают при решении разных задач. Например, с их помощью легко искать и менять строки в коде. Но чаще всего регулярные выражения используют для валидации форм. Давайте посмотрим, как это делать.
- 5 июня 2023
Проверка типа интерфейса в TypeScript
Проверка типов интерфейса — одна из ключевых возможностей TypeScript. Она помогает убедиться, что объект или класс содержат необходимый набор свойств и методов, указанных в интерфейсе. Благодаря проверке типов вы можете писать более надёжный код, ведь часть ошибок будет найдена ещё на этапе компиляции.
Идентификация, аутентификация и авторизация — в чем разница?
Объясняем на енотах, в чем разница между идентификацией и авторизацией, а также зачем нужна аутентификация, тем более двухфакторная.
21 сентября 2020
Это происходит с каждым из нас, причем ежедневно: мы постоянно идентифицируемся, аутентифицируемся и авторизуемся в разнообразных системах. И все же многие путают значение этих слов и часто употребляют термин «идентификация» или «авторизация», когда на самом деле речь идет об аутентификации.
Ничего такого уж страшного в этом нет — пока идет бытовое общение и обе стороны диалога по контексту понимают, что в действительности имеется в виду. Но всегда лучше знать и понимать слова, которые употребляешь, а то рано или поздно нарвешься на зануду-специалиста, который вынет всю душу за «авторизацию» вместо «аутентификации», кофе среднего рода и такое душевное, но неуместное в серьезной беседе слово «ихний».
Идентификация, аутентификация и авторизация: серьезные определения
Итак, что же значат термины «идентификация», «аутентификация» и «авторизация» — и чем соответствующие процессы отличаются друг от друга? Для начала проконсультируемся с «Википедией»:
- Идентификация — процедура, в результате выполнения которой для субъекта идентификации выявляется его идентификатор, однозначно определяющий этого субъекта в информационной системе.
- Аутентификация — процедура проверки подлинности, например проверка подлинности пользователя путем сравнения введенного им пароля с паролем, сохраненным в базе данных.
- Авторизация — предоставление определенному лицу или группе лиц прав на выполнение определенных действий.
Объясняем идентификацию, аутентификацию и авторизацию на енотах
Выше было очень много умных слов, теперь давайте упростим до конкретных примеров. Скажем, пользователь хочет войти в свой аккаунт Google. Google подходит лучше всего, потому что там процедура входа явным образом разбита на несколько простейших этапов. Вот что при этом происходит:
- Для начала система запрашивает логин, пользователь его указывает, система распознает его как существующий — это идентификация.
- После этого Google просит ввести пароль, пользователь его вводит, и система соглашается, что пользователь, похоже, действительно настоящий, раз пароль совпал, — это аутентификация.
- Скорее всего, Google дополнительно спросит еще и одноразовый код из SMS или приложения. Если пользователь и его правильно введет, то система окончательно согласится с тем, что он настоящий владелец аккаунта, — это двухфакторная аутентификация.
- После этого система предоставит пользователю право читать письма в его почтовом ящике и все в таком духе — это авторизация.
Аутентификация без предварительной идентификации лишена смысла — пока система не поймет, подлинность чего же надо проверять, совершенно бессмысленно начинать проверку. Для начала надо представиться.
Идентификация без аутентификации — это просто глупо. Потому что мало ли кто ввел существующий в системе логин! Системе обязательно надо удостовериться, что этот кто-то знает еще и пароль. Но пароль могли подсмотреть или подобрать, поэтому лучше подстраховаться и спросить что-то дополнительное, что может быть известно только данному пользователю: например, одноразовый код для подтверждения входа.
А вот авторизация без идентификации и тем более аутентификации очень даже возможна. Например, в Google Документах можно публиковать документы так, чтобы они были доступны вообще кому угодно. В этом случае вы как владелец файла увидите сверху надпись, гласящую, что его читает неопознанный енот. Несмотря на то, что енот совершенно неопознанный, система его все же авторизовала — то есть выдала право прочитать этот документ.
А вот если бы вы открыли этот документ для чтения только определенным пользователям, то еноту в таком случае сперва пришлось бы идентифицироваться (ввести свой логин), потом аутентифицироваться (ввести пароль и одноразовый код) и только потом получить право на чтение документа — авторизоваться.
А уж если речь идет о содержимом вашего почтового ящика, то Google никогда и ни за что не авторизует неопознанного енота на чтение вашей переписки — если, конечно, он не идентифицируется с вашим логином и не аутентифицируется с вашим паролем. Но тогда это уже не будет неопознанный енот, поскольку Google однозначно определит этого енота как вас.
Теперь вы знаете, чем идентификация отличается от аутентификации и авторизации. Что еще важно понимать: аутентификация — пожалуй, самый важный из этих процессов с точки зрения безопасности вашего аккаунта. Если вы ленитесь и используете для аутентификации только слабенький пароль, то какой-нибудь енот может ваш аккаунт угнать. Поэтому: