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

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

1.3 Junior🔥 181 комментариев
#Безопасность

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

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

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

Разница между аутентификацией и авторизацией

Это два разных, но связанных между собой процесса, которые часто путают:

Аутентификация (Authentication) — это процесс идентификации личности. "Кто ты?" Подтверждение, что ты — действительно тот, за кого себя выдаёшь.

Авторизация (Authorization) — это процесс проверки прав. "Что ты можешь делать?" Определение, какие ресурсы и действия доступны аутентифицированному пользователю.

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

┌─────────────────────────────────────────┐
│ Аутентификация:                         │
│ Проверка паспорта на пограничном        │
│ контроле — подтверждение личности      │
│                                         │
│ Результат: ✓ Ты — действительно Иван  │
└─────────────────────────────────────────┘
         ↓
┌─────────────────────────────────────────┐
│ Авторизация:                            │
│ Проверка визы в паспорте — права на     │
│ вход в страну и доступ к её ресурсам  │
│                                         │
│ Результат: ✓ Иван может находиться в  │
│ стране 30 дней, но не может работать   │
└─────────────────────────────────────────┘

Пример в веб-приложении

Аутентификация: Пользователь вводит email и пароль в форму логина. Приложение:

  • Проверяет, что пользователь с таким email существует в БД
  • Хеширует введённый пароль и сравнивает с сохранённым хешем
  • Если совпадает — пользователь подтвердил свою личность
  • Выдаёт JWT токен или session cookie
from fastapi import FastAPI, HTTPException, Depends
from fastapi.security import HTTPBearer, HTTPAuthCredentials
import jwt
from datetime import datetime, timedelta
import bcrypt

app = FastAPI()
security = HTTPBearer()

# Функция для аутентификации (проверка логина/пароля)
async def authenticate_user(email: str, password: str):
    # Поиск пользователя в БД
    user = await db.users.find_one({"email": email})
    
    if not user:
        raise HTTPException(status_code=401, detail="Invalid credentials")
    
    # Проверка пароля (аутентификация)
    if not bcrypt.checkpw(password.encode(), user["password"]):
        raise HTTPException(status_code=401, detail="Invalid credentials")
    
    # Пользователь аутентифицирован ✓
    return user

@app.post("/login")
async def login(email: str, password: str):
    user = await authenticate_user(email, password)
    
    # Генерируем JWT токен
    token = jwt.encode(
        {"user_id": str(user["_id"]), "exp": datetime.utcnow() + timedelta(hours=24)},
        secret_key="your-secret"
    )
    
    return {"token": token}

Авторизация: Теперь у пользователя есть токен, но он может делать не всё. Авторизация определяет, какие именно действия разрешены.

# Функция для авторизации (проверка прав)
async def get_current_user(credentials: HTTPAuthCredentials = Depends(security)):
    try:
        payload = jwt.decode(
            credentials.credentials,
            secret_key="your-secret",
            algorithms=["HS256"]
        )
        user_id = payload.get("user_id")
    except jwt.ExpiredSignatureError:
        raise HTTPException(status_code=401, detail="Token expired")
    except jwt.InvalidTokenError:
        raise HTTPException(status_code=401, detail="Invalid token")
    
    user = await db.users.find_one({"_id": ObjectId(user_id)})
    if not user:
        raise HTTPException(status_code=401, detail="User not found")
    
    # Пользователь аутентифицирован ✓
    return user

# Авторизация — проверка ролей
async def require_admin(user = Depends(get_current_user)):
    if user.get("role") != "admin":
        raise HTTPException(status_code=403, detail="Admin access required")
    return user

# Обычный пользователь может читать свой профиль
@app.get("/profile")
async def get_profile(user = Depends(get_current_user)):
    return user

# Только админ может удалять пользователей
@app.delete("/users/{user_id}")
async def delete_user(user_id: str, admin = Depends(require_admin)):
    await db.users.delete_one({"_id": ObjectId(user_id)})
    return {"status": "deleted"}

Таблица сравнения

АспектАутентификацияАвторизация
ВопросКто ты?Что ты можешь?
ПроцессПроверка учётных данныхПроверка прав доступа
ПримерыПароль, биометрия, 2FAРоли, permissions, ACL
РезультатТокен, sessionДоступ к ресурсам
Без этогоНевозможна авторизацияЧему-то может доступ получить кто-угодно

Последовательность событий

Запрос от клиента:
┌──────────────────────────┐
│ POST /api/resource       │
│ Authorization: Bearer X  │
└──────────────────────────┘
           ↓
   [Аутентификация]
   ✓ Токен валидный?
   ✓ Пользователь существует?
           ↓
   [Авторизация]
   ✓ Пользователь имеет доступ к этому ресурсу?
   ✓ Роль позволяет POST операцию?
           ↓
┌──────────────────────────┐
│ 200 OK / 403 Forbidden   │
└──────────────────────────┘

Типичные ошибки

# ❌ Неправильно: путают при реализации
@app.delete("/users/{id}")
async def delete_user(id: str):
    # Нет проверки аутентификации вообще!
    await db.users.delete_one({"_id": ObjectId(id)})
    return {"deleted": True}

# ✅ Правильно: сначала аутентификация, потом авторизация
@app.delete("/users/{id}")
async def delete_user(id: str, admin = Depends(require_admin)):
    # 1. Проверена аутентификация (в require_admin)
    # 2. Проверена авторизация (админ ли?)
    await db.users.delete_one({"_id": ObjectId(id)})
    return {"deleted": True}

Итог

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