← Назад к вопросам

В чем разница между идентификацией, аутентификацией и авторизацией?

1.8 Middle🔥 181 комментариев
#REST API и HTTP#Безопасность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

Эти три термина часто путают, но это различные этапы в цепочке контроля доступа. Давайте разберёмся на примере входа в офис или веб-приложение.

1. Идентификация (Identification)

Определение: Процесс, при котором система узнает, кто вы.

Это просто указание вашего ID/учетной записи, без проверки правильности.

Пример в офисе: Вы говорите охраннику "Я Иван Сидоров"

Пример в приложении: Вы вводите email ivan@example.com

# Идентификация - просто получили, кто это
email = request.json['email']  # ivan@example.com
print(f"Пользователь: {email}")
# На этом этапе мы НЕ знаем, действительно ли это Иван

Важно: Идентификация еще не подтверждает, что вы действительно тот, кем себя выдаёте.

2. Аутентификация (Authentication)

Определение: Процесс проверки вашей личности (подтверждение, что вы действительно тот, за кого себя выдаёте).

Это проверка доказательства (пароль, отпечаток пальца, токен).

Пример в офисе: Охранник просит показать пропуск или подтверждает вас по базе данных

Пример в приложении: Вы вводите пароль и система проверяет его правильность

from werkzeug.security import check_password_hash

# Аутентификация - проверяем, что это действительно Иван
email = request.json['email']
password = request.json['password']

# Ищем пользователя по email
user = db.query(User).filter_by(email=email).first()

if not user or not check_password_hash(user.password_hash, password):
    return {'error': 'Invalid credentials'}, 401

# ✅ Аутентифицирован! Мы подтвердили личность
print(f"Пользователь {email} успешно аутентифицирован")

Методы аутентификации:

  • Пароль (что вы знаете)
  • Биометрия (кто вы есть)
  • Аппаратные ключи (что вы имеете)
  • SMS-код (что вы получили)
  • Токены/JWT (что вам выдали)

3. Авторизация (Authorization)

Определение: Процесс определения, что вам разрешено делать после подтверждения личности.

Это проверка прав доступа и разрешений.

Пример в офисе: После проверки пропуска охранник говорит "Вы можете входить в офис, но не можете входить в серверную"

Пример в приложении: После входа система проверяет, может ли пользователь редактировать статью

from functools import wraps
from flask import abort

def require_admin(f):
    """Авторизация - проверяем права доступа"""
    @wraps(f)
    def decorated_function(*args, **kwargs):
        # Сначала проверяем, аутентифицирован ли пользователь
        user = get_current_user()
        if not user:
            return {'error': 'Unauthorized'}, 401
        
        # Затем проверяем авторизацию (права)
        if user.role != 'admin':
            return {'error': 'Forbidden'}, 403  # Авторизован, но нет прав
        
        return f(*args, **kwargs)
    return decorated_function

@app.route('/admin/users', methods=['DELETE'])
@require_admin
def delete_user():
    # Эта функция вызовется только если пользователь admin
    user_id = request.json['user_id']
    db.query(User).filter_by(id=user_id).delete()
    return {'ok': True}

Сравнение в таблице

ПонятиеЧто этоОтвет на вопросПример
ИдентификацияУказание вашего IDКто вы?email: ivan@example.com
АутентификацияПроверка пароля/подтверждение личностиВы действительно Иван?password check ✓
АвторизацияПроверка прав доступаЧто вам разрешено делать?role: admin ✓

Полный пример: вход в приложение

@app.route('/login', methods=['POST'])
def login():
    # ШАГИ:
    # 1️⃣ ИДЕНТИФИКАЦИЯ - указал email
    email = request.json['email']
    password = request.json['password']
    
    # 2️⃣ АУТЕНТИФИКАЦИЯ - проверяем пароль
    user = db.query(User).filter_by(email=email).first()
    if not user or not check_password_hash(user.password_hash, password):
        return {'error': 'Invalid email or password'}, 401
    
    # ✅ Аутентификация успешна
    session_token = generate_token(user.id)
    response = jsonify({'ok': True, 'user_id': user.id})
    response.set_cookie('session_token', session_token)
    return response

@app.route('/profile')
def get_profile():
    # Для доступа к этому маршруту нужно быть аутентифицирован
    token = request.cookies.get('session_token')
    if not token:
        return {'error': 'Unauthorized'}, 401  # Не аутентифицирован
    
    user_id = verify_token(token)
    user = db.query(User).get(user_id)
    
    # 3️⃣ АВТОРИЗАЦИЯ - проверяем права доступа
    # Каждый пользователь может видеть только свой профиль
    if user.id != get_current_user_id():
        return {'error': 'Forbidden'}, 403  # Авторизация не пройдена
    
    return {'user_id': user.id, 'email': user.email, 'role': user.role}

@app.route('/admin/dashboard')
def admin_dashboard():
    # Для этого маршрута нужно быть admin
    token = request.cookies.get('session_token')
    user_id = verify_token(token)
    if not user_id:
        return {'error': 'Unauthorized'}, 401  # Не аутентифицирован
    
    user = db.query(User).get(user_id)
    
    # АВТОРИЗАЦИЯ - проверяем, что пользователь admin
    if user.role != 'admin':
        return {'error': 'Forbidden - only admin can access'}, 403
    
    return {'dashboard': 'Admin data'}

HTTP коды ошибок

# 401 Unauthorized - проблема с АУТЕНТИФИКАЦИЕЙ
return {'error': 'Authentication failed'}, 401
# Случаи: нет токена, токен истек, неверный пароль

# 403 Forbidden - проблема с АВТОРИЗАЦИЕЙ
return {'error': 'You do not have permission'}, 403
# Случаи: вы авторизованы, но у вас нет прав на это действие

# 404 Not Found - ресурс не найден (иногда скрывают 403)
return {'error': 'Resource not found'}, 404
# Безопасность: не раскрываем информацию о существовании ресурса

Уровни авторизации (RBAC - Role Based Access Control)

class Permission:
    READ = 'read'
    CREATE = 'create'
    UPDATE = 'update'
    DELETE = 'delete'

class Role:
    ADMIN = {
        Permission.READ,
        Permission.CREATE,
        Permission.UPDATE,
        Permission.DELETE
    }
    EDITOR = {
        Permission.READ,
        Permission.CREATE,
        Permission.UPDATE
    }
    VIEWER = {
        Permission.READ
    }

def check_permission(user, required_permission):
    """Авторизация на уровне разрешений"""
    if required_permission not in Role[user.role]:
        raise ForbiddenError()

# Использование
@app.route('/articles/<id>', methods=['DELETE'])
def delete_article(id):
    user = get_current_user()
    check_permission(user, Permission.DELETE)
    # Удаляем статью

Ключевые различия

  1. Идентификация = "Я говорю, кто я" → БЕЗ проверки
  2. Аутентификация = "Я доказываю, кто я" → С проверкой (пароль, биометрия)
  3. Авторизация = "Мне разрешено делать X" → Проверка прав

Аналогия с аэропортом:

  • Идентификация: Вы показываете паспорт (вот кто я)
  • Аутентификация: Таможенник проверяет паспорт (вы действительно тот, кто в паспорте)
  • Авторизация: Вас пропускают только если у вас есть действительный билет (разрешение на полет)

Без правильного понимания этих различий легко создать уязвимое приложение.

В чем разница между идентификацией, аутентификацией и авторизацией? | PrepBro