Skip to content

Authentication и Authorization

JuniorMiddleSeniorОбзор ~25 мин

Основная модель

Authentication (AuthN) отвечает на вопрос «кто ты?». Authorization (AuthZ) — «что тебе можно?».

Их нельзя смешивать: знание личности не означает право на действие.

AuthN → AuthZ

Сравнение моделей

ПодходГде состояниеПлюсыМинусы
Session cookieСервер / storeПростой отзывНужен общий storage
JWT access tokenКлиентУдобно для APIОтзыв сложнее
Opaque tokenСерверКонтролируемый отзывЛишний lookup

Пример проверки

ts
// authz.ts
export function assertCanReadOrder(user: { id: string; roles: string[] }, orderOwnerId: string) {
  if (user.roles.includes("admin")) return;
  if (user.id !== orderOwnerId) {
    throw new Error("forbidden");
  }
}
go
// authz.go
func assertCanReadOrder(user User, orderOwnerID string) error {
  for _, role := range user.Roles {
    if role == "admin" {
      return nil
    }
  }
  if user.ID != orderOwnerID {
    return errors.New("forbidden")
  }
  return nil
}
php
<?php
// authz.php
function assertCanReadOrder(User $user, string $orderOwnerId): void
{
    if (in_array('admin', $user->roles, true)) {
        return;
    }
    if ($user->id !== $orderOwnerId) {
        throw new ForbiddenException();
    }
}

Best practices

  • Разделяйте AuthN и AuthZ на сервере.
  • Не доверяйте userId / role из тела запроса.
  • Проверяйте владение ресурсом (IDOR/BOLA).
  • Для cookie: HttpOnly, Secure, подходящий SameSite.

Проверка знаний

ИНТЕРАКТИВНАЯ ПРОВЕРКА

Identity и решения доступа

0 / 3
01Пользователь не предоставил действительные credentials. Какой результат уместен?
02Какие проверки должны выполняться на доверенной server-side границе?
03Успешная authentication автоматически разрешает любые действия.
Проверено: 0 из 3

Самопроверка

  1. Когда уместен 401, а когда 403?
  2. Чем RBAC отличается от ABAC?
  3. Почему client-side hide кнопки — не авторизация?

Связанные статьи