JWT Authentication چیست؟
روشی Stateless برای احراز هویت در Web API با یک Token خوداتکا شامل سه بخش Header، Payload و Signature.
چرا مهم است؟
JWT پایه احراز هویت Stateless در بیشتر Web APIهای مدرن است؛ درک ساختار و اعتبارسنجی آن پیشنیاز کار با AddJwtBearer، OAuth2 و OpenID Connect در ASP.NET Core است.
ساختار یک JWT
یک JWT از سه بخش جدا شده با نقطه تشکیل میشود: Header.Payload.Signature
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoiQWxpIn0.4f8c...
Header: { "alg": "HS256", "typ": "JWT" }
Payload: { "sub": "123", "name": "Ali", "exp": 1735689600 }
Signature: HMACSHA256(base64(Header) + "." + base64(Payload), secretKey)
نکته: JWT رمزنگاریشده نیست، فقط امضا شده است؛ هرکسی میتواند Payload آن را Base64Url-Decode و بخواند، اما بدون کلید امضا نمیتواند تغییرش بدهد.
صدور Token در ASP.NET Core
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id),
new Claim(JwtRegisteredClaimNames.Email, user.Email),
new Claim(ClaimTypes.Role, "Admin")
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: "codeshot.ir",
audience: "codeshot-api",
claims: claims,
expires: DateTime.UtcNow.AddMinutes(15),
signingCredentials: credentials);
var jwt = new JwtSecurityTokenHandler().WriteToken(token);
اعتبارسنجی خودکار در Pipeline
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidIssuer = "codeshot.ir",
ValidAudience = "codeshot-api",
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(secretKey))
};
});
app.UseAuthentication();
app.UseAuthorization();
Access Token کوتاهعمر + Refresh Token
چون یک JWT صادرشده تا لحظه انقضا معتبر است و نمیتوان آن را زودتر باطل کرد، معمولاً Access Token عمر کوتاهی (مثلاً ۱۵ دقیقه) دارد و همراه آن یک Refresh Token با عمر طولانیتر (که در دیتابیس ذخیره و قابل ابطال است) صادر میشود. با منقضیشدن Access Token، کلاینت با Refresh Token یک Access Token تازه میگیرد، بدون اینکه کاربر دوباره وارد شود.
اشتباهات رایج
❌ ذخیره JWT در localStorage (در معرض حملات XSS) بهجای یک Cookie با HttpOnly و Secure.
❌ عدم بررسی صحیح exp/iss/aud هنگام اعتبارسنجی دستی.
❌ استفاده از یک Secret Key کوتاه یا هاردکدشده داخل کد بهجای یک مقدار قوی در پیکربندی امن.
❌ تصور اینکه JWT رمزنگاریشده است؛ اطلاعات حساس هرگز نباید داخل Payload گذاشته شود.
نکته کلیدی: JWT = Token خوداتکای Header.Payload.Signature برای احراز هویت Stateless؛ امضا شده است نه رمزنگاریشده، پس هیچ داده حساسی داخل Payload قرار نگیرد و همیشه با یک Refresh Token کوتاهعمر ترکیب شود.
خلاصه
- JWT از سه بخش Header.Payload.Signature تشکیل شده و امضا شده است، نه رمزنگاریشده.
- در ASP.NET Core با AddJwtBearer بهصورت خودکار در Pipeline اعتبارسنجی میشود.
- برای امنیت بهتر، Access Token کوتاهعمر را همراه یک Refresh Token قابلابطال استفاده کنید.
