
Аутентификация сессии против JWT-как они работают, ключевые различия и примеры реального мира
15 августа 2025 г.Аутентификация лежит в основе почти каждого современного веб -приложения. Два популярных подходаАутентификация на основе сеансовиАутентификация на основе JWTПолем Хотя оба достигают цели проверки идентичности пользователя, они работают по-разному, каждый со своими сильными сторонами и компромиссами.
Аутентификация на основе сеансов
Аутентификация на основе сеанса хранит данные аутентификации пользователя (обычно идентификатор сеанса) на сервере после входа в систему. Клиент получает файл cookie, содержащий этот идентификатор сеанса. Каждый последующий запрос включает в себя этот файл cookie, что позволяет серверу идентифицировать пользователя.
Как это работает (шаг за шагом):
Пользователь входит в систему→ Отправляет учетные данные (имя пользователя/пароль) на сервер.
Сервер проверяет учетные данные→ Создает объект сеанса в памяти или базе данных.
Сервер генерирует идентификатор сеанса→ хранит его в магазине сеанса и отправляет обратно клиенту в cookie.
Клиент хранит cookie→ Автоматически отправляет его с каждым HTTP -запросом.
Сервер соответствует идентификатору сеансаот файла cookie до хранимого сеанса, чтобы идентифицировать пользователя.
Примеры с использованием .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>
Заголовок для каждого запроса. - Сервер проверяет подпись токена по каждому запросу - хранилище сеанса не требуется.
Пример ядра .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, мобильные приложения |
Когда использовать что?
- Используйте аутентификацию на основе сеансакогда:
- У вас есть традиционное приложение с трансляцией сервера.
- Вам нужна быстрое и простая аутентификация пользователя.
- Вы контролируете среду сервера (можете хранить сеансы централизованно).
- Используйте аутентификацию на основе JWTкогда:
Вы строите API или микросервисы без сохранения состояния.
Вам нужна масштабируемость и нет центрального сессионного магазина.
Вы обслуживаете несколько типов клиентов (Web, Mobile, IoT).
Пример сценария
Пример сессии: компании Intranet Web App хранят сеансы пользователей в Redis, чтобы сотрудники могли войти из разных офисов, не теряя сессию.
Пример JWT: приложение мобильного банкинга отправляет JWT пользователям после входа в систему. Бэкэнд API проверяет JWT для каждого запроса без хранения какого-либо сеанса, что делает его масштабируемым на нескольких сбалансированных серверах.
Оригинал