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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JWTの構造とクレーム
- JWT Bearer認証の設定
- トークンの発行
- リフレッシュトークンと有効期限