Аутентификация сессии против JWT-как они работают, ключевые различия и примеры реального мира

Аутентификация сессии против JWT-как они работают, ключевые различия и примеры реального мира

15 августа 2025 г.

Аутентификация лежит в основе почти каждого современного веб -приложения. Два популярных подходаАутентификация на основе сеансовиАутентификация на основе JWTПолем Хотя оба достигают цели проверки идентичности пользователя, они работают по-разному, каждый со своими сильными сторонами и компромиссами.

Session VS JWT


Аутентификация на основе сеансов

Аутентификация на основе сеанса хранит данные аутентификации пользователя (обычно идентификатор сеанса) на сервере после входа в систему. Клиент получает файл cookie, содержащий этот идентификатор сеанса. Каждый последующий запрос включает в себя этот файл cookie, что позволяет серверу идентифицировать пользователя.

Как это работает (шаг за шагом):

  • Пользователь входит в систему→ Отправляет учетные данные (имя пользователя/пароль) на сервер.

  • Сервер проверяет учетные данные→ Создает объект сеанса в памяти или базе данных.

  • Сервер генерирует идентификатор сеанса→ хранит его в магазине сеанса и отправляет обратно клиенту в cookie.

  • Клиент хранит cookie→ Автоматически отправляет его с каждым HTTP -запросом.

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

    session based

Примеры с использованием .NET Core (на основе сеанса)

Конфигурация startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromMinutes(30);
        options.Cookie.HttpOnly = true;
        options.Cookie.IsEssential = true;
    });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
        app.UseDeveloperExceptionPage();

    app.UseRouting();
    app.UseSession();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

Вход в систему контроллера

[HttpPost]
public IActionResult Login(string username, string password)
{
    if (username == "admin" && password == "secret")
    {
        HttpContext.Session.SetString("Username", username);
        return RedirectToAction("Dashboard");
    }
    ViewBag.Error = "Invalid credentials";
    return View();
}

Защищенная панель

public IActionResult Dashboard()
{
    var user = HttpContext.Session.GetString("Username");
    if (string.IsNullOrEmpty(user))
        return RedirectToAction("Login");

    return View(model: $"Hello {user}");
}

Плюс

  • Простое в реализации в приложениях MVC.
  • Контролируемая сервером сеанс. Англизация.
  • Отлично подходит для традиционных веб -приложений.

Минусы

  • Требуется память сервера или распределенное хранилище сеанса.

  • Труднее масштабироваться без центрального сессии.


Аутентификация на основе JWT

Jwt (JSON Web Token) является компактным, автономным токеном, содержащим идентичность пользователя и претензии. Он подписан сервером и отправляется клиенту после успешной аутентификации. Клиенты отправляют токен вAuthorizationЗаголовок для каждого запроса.

Как это работает (шаг за шагом):

  • Пользователи входят в систему → Отправляет учетные данные на сервер.
  • Сервер проверяет учетные данные → генерирует подписанный JWT.
  • JWT возвращается клиенту (обычно хранится в хранилище браузера или в памяти мобильного приложения).
  • Клиент отправляет JWT вAuthorization: Bearer <token>Заголовок для каждого запроса.
  • Сервер проверяет подпись токена по каждому запросу - хранилище сеанса не требуется.

jwt Authentication

Пример ядра .NET (на основе JWT)

Установите пакеты Nuget

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.IdentityModel.Tokens.Jwt

Конфигурация startup.cs

public void ConfigureServices(IServiceCollection services)
{
    var key = Encoding.ASCII.GetBytes("ThisIsASecretKeyForJWT");

    services.AddAuthentication(x =>
    {
        x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(x =>
    {
        x.RequireHttpsMetadata = false;
        x.SaveToken = true;
        x.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(key),
            ValidateIssuer = false,
            ValidateAudience = false
        };
    });

    services.AddControllers();
}

Контроллер входа в систему (генерируя JWT)

[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel login)
{
    if (login.Username == "admin" && login.Password == "secret")
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes("ThisIsASecretKeyForJWT");

        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, login.Username) }),
            Expires = DateTime.UtcNow.AddHours(1),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };

        var token = tokenHandler.CreateToken(tokenDescriptor);
        return Ok(new { Token = tokenHandler.WriteToken(token) });
    }

    return Unauthorized();
}
wt

Защищенная конечная точка

[Authorize]
[HttpGet("dashboard")]
public IActionResult Dashboard()
{
    return Ok($"Hello {User.Identity.Name}");
}

Плюс

  • Без сохранения, нет хранилища сеанса на стороне сервера.
  • Идеально подходит для API и микросервисов.
  • Хорошо работает по платформам и доменам.

Минусы

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


Ключевые различия b/w session и jwt

Особенность

На основе сеанса

На основе JWT

Место хранения

Серверная сторона

Клиентская сторона

Масштабируемость

Нуждается в общем магазине

Без гражданства, легко масштабировать

Отмена

Легко (удалить сеанс)

Жестко (нужен черный список)

Лучше всего для

Серверные приложения

API, мобильные приложения


Когда использовать что?

  1. Используйте аутентификацию на основе сеансакогда:
    • У вас есть традиционное приложение с трансляцией сервера.
    • Вам нужна быстрое и простая аутентификация пользователя.
    • Вы контролируете среду сервера (можете хранить сеансы централизованно).
  2. Используйте аутентификацию на основе JWTкогда:
    • Вы строите API или микросервисы без сохранения состояния.

    • Вам нужна масштабируемость и нет центрального сессионного магазина.

    • Вы обслуживаете несколько типов клиентов (Web, Mobile, IoT).


Пример сценария

Пример сессии: компании Intranet Web App хранят сеансы пользователей в Redis, чтобы сотрудники могли войти из разных офисов, не теряя сессию.

Пример JWT: приложение мобильного банкинга отправляет JWT пользователям после входа в систему. Бэкэнд API проверяет JWT для каждого запроса без хранения какого-либо сеанса, что делает его масштабируемым на нескольких сбалансированных серверах.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE