CodeShot
JWT6 دقیقه مطالعه

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 قابل‌ابطال استفاده کنید.

حالا امتحان کن

🧩آزمون JWT Authentication6 سؤال · نمره قبولی 60٪
این مطلب مفید بود؟
نشان کردن
مشاهده در Concept Hub ←