Безопасность в IT: идентификация, аутентификация и авторизация — в чем разница и как они работают?

Идентификация, аутентификация и авторизация в чем разница

Слова «идентификация», «аутентификация» и «авторизация» часто звучат вместе, когда речь заходит о безопасности приложений. Новички нередко путают эти термины или используют их как синонимы, что в корне неверно. Понимание разницы между ними — это фундамент, на котором строится надежная защита любой информационной системы.

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

Что такое Идентификация и для чего она нужна?

Идентификация - это процесс, при котором пользователь заявляет системе о том, кто он такой. Система в этот момент просто принимает заявленный идентификатор (логин) и проверяет, существует ли он в базе данных.

Представьте, что вы приходите на проходную бизнес-центра и говорите охраннику: «Я — Иван Иванов». В этот момент вы прошли идентификацию. Охранник посмотрел в список и увидел, что Иван Иванов действительно работает в одной из компаний. Но он еще не знает, что вы — это именно тот самый Иван.

В цифровом мире идентификатором может быть:

  • Логин или никнейм,
  • Адрес электронной почты,
  • Номер телефона.

Идентификация это первая ступень трехэтапного процесса в безопасности для работы с самой системой. Запомните, идентификация отвечает на вопрос “Кто вы?”.

Пример реализации

Вот как выглядит процесс идентификации на Python с использованием библиотеки Pydantic для валидации данных:

from pydantic import BaseModel, EmailStr

class UserIdentify(BaseModel):
    email: EmailStr

def identify_user(user_data: UserIdentify) -> bool:
    # Имитация базы данных
    database = ["admin@example.com", "user@example.com"]
    if user_data.email in database:
        print(f"Пользователь с email {user_data.email} найден.")
        return True
    print("Пользователь не найден.")
    return False

# Идентификация
identify_user(UserIdentify(email="user@example.com"))

Аутентификация: ваши доказательства?

Аутентификация — это процесс проверки подлинности заявленного идентификатора. Система требует доказательств того, что вы действительно тот, за кого себя выдаете.

Возвращаясь к нашему примеру с бизнес-центром: после того как вы назвали имя, охранник просит вас показать паспорт. Он сверяет фотографию в документе с вашим лицом. Если всё совпадает — вы успешно прошли аутентификацию.

Доказательствами (факторами) аутентификации выступают уникальные данные или предметы, которыми владеет пользователь. Их принято делить на три основные категории:

  • То, что вы знаете: пароль, пин-код, кодовое слово.
  • То, что вы имеете: физический токен, телефон (для SMS-кода), смарт-карта.
  • То, чем вы являетесь: биометрия (отпечаток пальца, скан лица, сетчатка глаза).

Для надежной защиты часто используют двухфакторную аутентификацию (2FA), комбинируя два разных типа доказательств. Например, пароль (то, что вы знаете) и код из SMS (то, что вы имеете).

Аутентификация отвечает на вопрос “Действительно ли вы тот, за кого себя выдаете?” или “Докажи, что ты — это ты?”.

Как выглядит аутентификация в коде?

В современных приложениях после успешной аутентификации сервер часто выдает пользователю специальный токен (например, JWT), который подтверждает его личность при последующих запросах.

Рассмотрим простой пример аутентификации с пользованием пароля на Python.

import hashlib

# Хэшированный пароль в базе (в реальности используется bcrypt или Argon2).
USER_DB = {
    "user@example.com": hashlib.sha256(b"secret_password").hexdigest()
}

def authenticate_user(email: str, password: str) -> bool:
    if email not in USER_DB:
         return False

    password_hash = hashlib.sha256(password.encode()).hexdigest()
    if USER_DB[email] == password_hash:
        print("Аутентификация успешна. Добро пожаловать!")
        return True

    print("Неверный пароль.")
    return False

success = authenticate_user("user@example.com", "secret_password")

if not success:
    raise Exception("Дальше путь закрыт")

Авторизация: сэр, вам запрещено это делать

Авторизация — это процесс наделения пользователю, группе или системе прав на выполнение определенных действий или доступ к определенным ресурсам.

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

Авторизация всегда происходит после аутентификации. Если система не знает, кто вы, она не может решить, какие у вас права. Авторизация отвечает на вопрос: «Имеет ли этот пользователь право делать это?».

Пример контроля доступа

Авторизацию часто реализуют через роли (Role-Based Access Control, RBAC) или через права доступа.

from enum import Enum
from typing import List

class Role(Enum):
    ADMIN = "admin"
    USER = "user"

class User:
    def __init__(self, email: str, roles: List[Role]):
        self.email = email
        self.roles = roles

# Действие с проверкой, кто может совершить это злодияние.
def delete_database(user: User):
    if Role.ADMIN in user.roles:
        print("База данных успешно удалена. Надеюсь, что у вас имеются бекапы.")
    else:
        print("Ошибка доступа — требуются права администратора (Авторизация отклонена).")

# Пользователи, которые прошли Аутентификацию.
admin_user = User(email="admin@example.com", roles=[Role.ADMIN])
regular_user = User(email="user@example.com", roles=[Role.USER])

# Пользователи, которые хотят выполнить действие
delete_database(admin_user)    # Пройдет успешно
delete_database(regular_user)  # Ошибка доступа

Почему важны все три этапа

Пропуск хотя бы одного из этих этапов ведет к критическим уязвимостям.

  • Без идентификации система вообще не знает, с кем работает.
  • Без аутентификации любой злоумышленник может назваться администратором.
  • Без надежной авторизации даже аутентифицированный пользователь сможет получить доступ к чужим личным данным или системным настройкам.

Грамотное разделение этих понятий при проектировании архитектуры помогает создавать безопасные приложения, в которых данные надежно защищены от несанкционированного доступа. Всегда проверяйте права на уровне сервера (авторизация), используйте надежные алгоритмы хэширования (аутентификация) и не доверяйте данным, приходящим от клиента.

Если вы хотите узнать, как современные приложения «запоминают» аутентифицированных пользователей без использования тяжелых сессий, рекомендуем прочитать нашу следующую статью: Что такое JWT токен — Как работает авторизация без сессий.