0Pricing
C# Academy · レッスン

JWTの構造とクレーム

ヘッダー、ペイロード、署名について理解します。

「JWTの構造とクレーム」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

JWT とは何か

JSON Web Token (JWT) は、2 者間でクレームを安全に送信するために使用される、コンパクトで URL セーフなトークン形式です。ASP.NET Core では、ステートレス API の認証に最も一般的に使われる方法です。

JWT は、ドットで結合された 3 つの Base64Url エンコード済み部分から成る文字列にすぎません。header.payload.signature

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0Iiwicm9sZSI6ImFkbWluIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

ヘッダー

ヘッダーは、トークンへの署名方法を示します。小さな JSON オブジェクトであり、Base64Url でエンコードされて最初のセグメントになります。

alg は署名アルゴリズム(例: HS256、RS256)を示し、typ はほとんどの場合 JWT です。

{
  "alg": "HS256",
  "typ": "JWT"
}

ペイロード

ペイロードには、ユーザーに関する記述やトークンのメタデータであるクレームが含まれます。これは 2 番目のセグメントです。

重要: ペイロードはエンコードされているだけで、暗号化されていません。誰でもデコードできるため、ここに秘密情報を入れてはいけません。

{
  "sub": "1234",
  "name": "Alice",
  "role": "admin",
  "exp": 1735689600
}

署名

署名は、トークンが改ざんされていないことを保証します。サーバーは、エンコード済みのヘッダー、エンコード済みのペイロード、秘密鍵から署名を計算します。

誰かがペイロードの 1 文字でも変更すると、署名が一致しなくなり、検証に失敗します。

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secretKey
)

登録済みクレーム

一部のクレーム名は、JWT 仕様(RFC 7519)によって標準化されています。3 文字の短いキーを使用します。

  • iss - 発行者
  • sub - 主体(ユーザー ID)
  • aud - 対象者
  • exp - 有効期限(Unix 秒)
  • nbf - この時刻より前は無効
  • iat - 発行時刻
{
  "iss": "https://api.myapp.com",
  "aud": "myapp-clients",
  "sub": "42",
  "exp": 1735689600,
  "iat": 1735686000
}

カスタムクレーム

登録済みのクレーム以外にも、アプリケーションに必要なカスタムクレームを追加できます。ロール、アクセス許可、テナント ID、メールアドレスなどです。

すべてのクレームはすべてのリクエストで送信されるため、ペイロードは小さく保ってください。

{
  "sub": "42",
  "email": "alice@myapp.com",
  "role": "admin",
  "tenant_id": "acme",
  "permissions": ["orders:read", "orders:write"]
}

ASP.NET Core のクレーム

.NET では、クレームは System.Security.Claims.Claim 型でモデル化されます。各クレームは種類 / 値のペアです。

JWT の検証時に、ASP.NET Core はペイロードの各エントリをユーザーの ClaimsPrincipal に含まれる Claim に変換します。

var claims = new List<Claim>
{
    new Claim(ClaimTypes.NameIdentifier, "42"),
    new Claim(ClaimTypes.Name, "Alice"),
    new Claim(ClaimTypes.Role, "admin"),
    new Claim("tenant_id", "acme")
};

ClaimsPrincipal と ClaimsIdentity

認証されたユーザーは ClaimsPrincipal で表されます。これは、クレームのセットをそれぞれ保持する1つ以上の ClaimsIdentity オブジェクトをラップします。

コントローラーでは、User を介してアクセスします。

// Inside a controller action
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
bool isAdmin = User.IsInRole("admin");
string? tenant = User.FindFirst("tenant_id")?.Value;

クレーム種別のマッピング

既定では、JWT ハンドラーは短い JWT キーを URI 形式の長いクレーム種別にマッピングします(たとえば、sub は ClaimTypes.NameIdentifier になります)。

元の短い名前を維持するには、起動時にインバウンドマッピングを一度無効にします。

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
// Now User.FindFirst("sub") returns the raw 'sub' claim

セッション Cookie ではいけない理由

JWT は自己完結型です。サーバーは、データベースへの照会やサーバー側のセッションストアを使わず、署名キーだけで JWT を検証できます。

そのため、どのノードでも同じトークンを検証できる、水平スケールされた API やマイクロサービスに適しています。

// Client sends the token on every request:
// Authorization: Bearer eyJhbGciOiJIUzI1Ni...

トレードオフ: 失効

JWT は自己完結型で、有効期限が切れるまで信頼されるため、exp の時刻より前に簡単に失効させることはできません。

一般的な対策は、アクセストークンの有効期間を短くし、リフレッシュトークンと組み合わせることです(このコースの後半で扱います)。

// Short-lived access token
exp = iat + 15 * 60;  // 15 minutes

確認問題

JWT の構造についての理解度を確認します。

まとめ

JWT の構造と、ASP.NET Core でのクレームの仕組みについて学びました。

  • JWT は header.payload.signature で構成され、それぞれが Base64Url エンコードされています。
  • ペイロードには登録済みクレームとカスタムクレームが含まれます。エンコードされていますが、暗号化はされていません。
  • 署名は、シークレットまたはキーペアを使って完全性を保証します。
  • .NET はクレームを ClaimsPrincipal に変換し、User を介して読み取れるようにします。

次は、これらのトークンを検証するよう ASP.NET Core を構成します。

よくある質問

「JWTの構造とクレーム」レッスンは無料ですか?

はい。「JWTの構造とクレーム」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「JWTの構造とクレーム」で何を学びますか?

ヘッダー、ペイロード、署名について理解します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「JWTの構造とクレーム」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JWTの構造とクレーム
  2. JWT Bearer認証の設定
  3. トークンの発行
  4. リフレッシュトークンと有効期限
← C# Academyに戻る