Skip to content

コア概念

このページは CyberGo JWT のコア抽象概念と設計モデルを説明し、全体像を理解するのに役立ちます。すぐにコードを書き始めるには クイックスタートへ移動してください。

Processor — 中央型

Processor はライブラリの中央型で、jwt.New(cfg) で生成されます。トークンの発行、検証、更新、取り消しの全ロジックをカプセル化し、すべてのメソッドは ゴルーチンセーフ で、複数のゴルーチン間で同じインスタンスを共有できます。

使い終わったら Close() を呼び出して秘密鍵を安全に消去し、リソースを解放します:

go
<!-- check-code: skip -->
cfg := jwt.DefaultConfig()
cfg.SecretKey = "your-32-byte-secret-key-here-minimum"

processor, err := jwt.New(cfg)
if err != nil {
    log.Fatal(err)
}
defer processor.Close()

Processor は TokenManager インターフェースを実装しており、依存性の注入とテスト置換が可能です。

トークンライフサイクル

トークンは発行から無効化まで以下の段階を経ます:

text
発行    Create(claims)           → アクセストークン(短期)
        CreateRefresh(claims)     → リフレッシュトークン(長期)

検証    Validate(token)          → Claims(署名、有効期限、発行者、ブラックリストを確認)

更新    Refresh(refreshToken)    → 新しいアクセストークン

取り消し Revoke(token)            → ブラックリストに追加
照会    IsRevoked(token)         → bool

各段階は ErrTokenExpiredErrTokenRevoked などの センチネルエラー を返し、errors.Is() で正確にマッチングできます。詳しくは エラー処理を参照してください。

二層トークンモデル

CyberGo JWT はアクセストークン + リフレッシュトークンの二層設計を採用しています:

アクセストークンリフレッシュトークン
用途API 認証新しいアクセストークンの取得
デフォルト TTL15 分7 日
発行メソッドCreateCreateRefresh
更新メソッドRefresh

なぜ二層なのか? アクセストークンは有効期間が短く、漏洩時のリスク窗口も小さくなります。リフレッシュトークンは有効期間が長いですが、新しいアクセストークンを取得するためだけに使用され、API 認証には直接使用されません。この設計はセキュリティとユーザー体験のバランスを取ります — ユーザーは頻繁にログインする必要がなく、アクセストークンの有効期限切れ後にサイレントに更新できます。

ローテーションセマンティクス

Refresh はリフレッシュトークンを 自動的に取り消しません。元のリフレッシュトークンは有効期限切れまたは明示的な Revoke まで有効です。一回限りの使用セマンティクス(リフレッシュトークンローテーション)が必要な場合は、Refresh 成功後に古いリフレッシュトークンを手動で Revoke してください。詳しくは トークン更新とローテーションを参照してください。

Claims 構造

Claims はトークン内のユーザー身元データを運びます。CyberGo JWT は二層構造を提供します:

RegisteredClaims(RFC 7519 標準クレーム、自動入力と検証):

フィールドclaim説明
Issueriss発行者識別子
Subjectsub主体識別子(レート制限キーとしても使用)
Audienceaud対象受信者
ExpiresAtexp有効期限
NotBeforenbf開始時刻
IssuedAtiat発行時刻
IDjti一意識別子(ブラックリストキー)
TokenTypetoken_typeaccess または refresh

Claims(組み込みビジネスクレーム、RegisteredClaims を埋め込み):

go
<!-- check-code: skip -->
type Claims struct {
    UserID      string         // ユーザー ID
    Username    string         // ユーザー名
    Role        string         // ロール
    Permissions []string       // 権限リスト
    Scopes      []string       // OAuth スコープ
    SessionID   string         // セッション ID
    ClientID    string         // クライアント ID
    Extra       map[string]any // 追加フィールド
    RegisteredClaims           // 標準クレーム(埋め込み)
}

すべてのフィールドは入力検証を経ます: 文字列長の上限 256、配列の上限 100、インジェクションパターン検出(XSS/SQLi シグネチャ)。

CustomClaims インターフェース

組み込みの Claims でビジネス要件を満たせない場合、CustomClaims インターフェースを実装して独自のクレーム構造を定義します:

go
<!-- check-code: skip -->
type AppClaims struct {
    UserID string   `json:"user_id"`
    TeamID string   `json:"team_id"`
    Roles  []string `json:"roles,omitempty"`
    jwt.RegisteredClaims
}

func (c *AppClaims) GetRegisteredClaims() *jwt.RegisteredClaims {
    return &c.RegisteredClaims
}

func (c *AppClaims) Validate() error {
    if c.UserID == "" {
        return errors.New("user_id is required")
    }
    return nil
}

カスタム型は ValidateInto で検証、RefreshInto で更新します — Processor がトークンをパースして構造体にデータを入力します。詳しくは カスタム Claimsを参照してください。

Config 概要

Config は Processor の統合設定エントリポイントです。DefaultConfig() で適切なデフォルト値を取得後、署名キーを設定するだけです:

グループフィールド説明
署名SecretKey / SigningKey / VerificationKey / SigningMethodHMAC は SecretKey、RSA/ECDSA は SigningKey
トークンAccessTokenTTL / RefreshTokenTTLアクセスおよびリフレッシュトークンの有効期間
検証Issuer / ExpectedAudience / RequireExpiration / ClockSkew発行者、対象、必須有効期限、クロック許容誤差
セキュリティBlacklist / EnableRateLimit取り消しストレージとレート制限
拡張Clockクロック注入(テスト用)

アルゴリズムの選択は 署名アルゴリズムを、完全なフィールドドキュメントは 設定を参照してください。

拡張インターフェース

CyberGo JWT はインターフェースによる拡張性を提供します:

インターフェース用途
TokenManagerProcessor が実装するコアインターフェース。依存性の注入と疎結合のためにより小さなサブセットインターフェースを定義できます
BlacklistStoreカスタムブラックリストバックエンド(例: Redis)。Add / Contains / Close を実装して外部ストレージに接続
RateLimitProviderカスタムレートリミッター。Allow / Reset / Close を実装して組み込みトークンバケットを置き換え
ClockProviderクロック注入。FixedClock は固定時刻を返し、テストで有効期限と更新ロジックを決定論的に制御

次のステップ