CIP-2: Auth
0. Abstract
本ドキュメントでは、Concrnt サーバーの API に対するリクエストにおいて、リクエスタが特定の Entity (CIP-0) 本人であることを証明するための認証トークン (auth token) の形式・作成方法・検証方法を定義する。
1. Status of This Memo
このドキュメントは Concrnt の認証トークンの仕様を定義する。 Concrnt プロジェクトにより公開されるバージョン付き仕様であり、実装者およびプロトコル設計者を対象とする。
本 CIP はオプショナルな拡張であり、CIP-0 および CIP-1 を前提とする。 サブキーによる署名の検証には CIP-13 を必要とする。
本仕様はドラフトであり、後方互換性のない変更が行われる可能性がある。
2. 表記規則
このドキュメントにおける以下の語は、必ず大文字で記述される場合、 BCP 14 [RFC2119] [RFC8174] にしたがって解釈される。
MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, NOT RECOMMENDED, MAY, OPTIONAL
3. Introduction
Concrnt Signed Document (CIP-1) の署名は、Document そのものの真正性を証明する。 一方、リソースの読み取り (CIP-5) やアクセス制御 (CIP-12)、通報 (CIP-15) など、 Document の提出を伴わない API 呼び出しにおいては、「誰がリクエストしているか」を HTTP リクエストのレベルで示す必要がある。auth token はこのための手段である。
認証は任意である。auth token を持たないリクエストは、ゲスト (未認証のリクエスタ) として扱われる。
4. トークンの形式
auth token は JWT [RFC7519] の構造 (base64url(header).base64url(payload).base64url(signature)) を持つが、
署名アルゴリズムとして Concrnt 独自の CONCRNT を使用する。
header・payload・signature の base64url は、いずれもパディングなしでなければならない (MUST)。
4.1 ヘッダー
{ "alg": "CONCRNT", "typ": "JWT", "kid": "cckv://<CCID>/subkeys/<any-name>"}alg— 常に"CONCRNT"(MUST)。§4.3 の署名方式を示す。typ— 常に"JWT"(MUST)。kid(OPTIONAL) — 署名に使用する鍵を指す cckv URI。 省略された場合、issのエンティティ本体の鍵 (master key) で署名されたものとして扱われる。 詳細は §5.2。
4.2 クレーム
{ "iss": "con1<bech32-encoded-address>", "sub": "concrnt", "aud": "example.com", "iat": "1763901296", "exp": "1763904896", "jti": "<unique id>"}iss(required) — リクエスタの Entity の CCID。sub(required) — 常に"concrnt"。aud(required) — トークンの宛先サーバー。サーバーの FQDN または CSID (CIP-0)。iat(OPTIONAL) — 発行時刻。UNIX タイムスタンプ (秒) の 10 進文字列。exp(OPTIONAL) — 失効時刻。UNIX タイムスタンプ (秒) の 10 進文字列。設定するべきである (SHOULD)。jti(OPTIONAL) — トークンの一意識別子。
iat / exp は JWT の慣例 (数値) と異なり文字列である点に注意。
4.3 署名
署名対象は base64url(header) + "." + base64url(payload) の ASCII 文字列である。
これを Keccak256 でハッシュ化し、secp256k1 の ECDSA 署名を行う。
署名は (r, s, v) の順で連結した 65 バイト (CIP-0 §8.2 と同一形式) を base64url エンコードしたものである。
署名に用いる鍵は、エンティティ本体の秘密鍵、または有効化済みのサブキー (CIP-13) の秘密鍵である。
5. リクエストへの付与と検証
5.1 リクエストへの付与
クライアントは、auth token を Authorization ヘッダーで送信する。
Authorization: Bearer <token>5.2 サーバーによる検証
サーバーは、auth token を次の手順で検証しなければならない (MUST)。
typが"JWT"、algが"CONCRNT"であることを確認する。- サービスアカウントの判別:
issが自身の CSID と一致する場合、このトークンは サービスアカウントトークン (§6) であり、以降の手順ではなく §6 の手順で検証する。 サービスアカウントトークンのsubは"concrnt"ではないため、 この判別はsubの検証より先に行わなければならない (MUST)。 audが自身の FQDN または CSID と一致することを確認する。subが"concrnt"であることを確認する。issの Entity を解決できることを確認する。- 鍵の特定:
kidが省略されている場合、iss(裸の CCID) をcckv://<iss>(key 部が空の cckv URI、 すなわち master key) として扱う。kid(または上記のように解釈したiss) を cckv URI としてパースし、その owner 部がissの CCID と 一致することを確認する (MUST)。このバインディングがない場合、ある鍵の正当な署名で任意のissを 名乗ることができてしまう。- key 部が空の場合 (master key): 署名から ECRECOVER で公開鍵を復元し、
導出したアドレスが
issの CCID と一致することを確認する。 - key 部がある場合 (subkey): その URI の指す Enact Document を CIP-13 §6 の手順で解決・検証し、
サブキーが現在有効であること、および
value.ckidに対して署名が有効であることを確認する。kidに付与されたリゾルバヒントを解決先の決定に用いてはならない (MUST NOT。CIP-13 §6 手順1)。 CIP-13 を実装しないサーバーは、kidに key 部を持つトークンの検証を失敗として扱う。
- key 部が空の場合 (master key): 署名から ECRECOVER で公開鍵を復元し、
導出したアドレスが
expが設定されている場合、現在時刻がexpを過ぎていないことを確認する。
検証に成功した場合、サーバーはこのリクエストのリクエスタを iss の Entity として扱う。
検証に失敗した場合 (トークンの形式不正・署名不一致・exp 超過等を含む)、サーバーはリクエストを
直ちに拒否するのではなく、未認証 (ゲスト) のリクエストとして処理を続行するべきである (SHOULD)。
すなわち、認証の結果は「特定の Entity として識別された」か「ゲスト」かの 2 値であり、
不正な資格情報の提示それ自体はエラーを構成しない。
認証済みのリクエスタを必要とするエンドポイント (CIP-15 等) は、ゲストに対して
HTTP 403 Forbidden を返さなければならない (MUST)。
ただし、検証に成功したトークンの iss の Entity またはその所属サーバーをブロックしている場合は、
ゲストへの降格ではなく HTTP 403 Forbidden で拒否するべきである (SHOULD)。
6. サーバー発行トークン (サービスアカウント)
サーバー運用者は、自身のサーバーに対する管理操作のために、サーバー自身の鍵で署名したトークンを使用できる。
issおよびaudにはサーバー自身の CSID を指定する。subにはサービスアカウントの種別を表す文字列 (例:"system") を指定する。
サーバーは、iss が自身の CSID と一致するトークンを受理した場合、自身の公開鍵 (CSID) で署名を検証し、
sub の値をサービスアカウント種別としてリクエストに関連付ける。
このとき、aud が自身の CSID と一致すること、および exp が設定されている場合は失効していないことを
確認しなければならない (MUST)。
サービスアカウントに与えられる権限は実装定義であるが、コミット時の検証バイパス等の 極めて強い権限を伴いうるため、このトークンは運用者の管理経路以外に発行してはならない (MUST NOT)。
7. Security Considerations
- auth token の漏洩は、
expまでの間その Entity へのなりすましを許す。トークンは秘密情報として扱い、 TLS で保護された経路でのみ送信しなければならない (MUST)。 expを持たないトークンは無期限に有効となる。クライアントは短い有効期限を設定し、 必要に応じて再発行するべきである (SHOULD)。audのバインディングにより、あるサーバー向けに発行されたトークンを他のサーバーへ 転用することはできない。サーバーはaudの検証を省略してはならない (MUST NOT)。- subkey で署名されたトークンの有効性は、Enact Document が現在有効であること (Revoked Subkey Document で上書きされていないこと) に依存する (CIP-13)。解決結果をキャッシュする場合、失効の反映が 遅延するリスクを考慮し、キャッシュ期間を適切に制限するべきである (SHOULD)。
8. References
- RFC 2119 – Key words for use in RFCs to Indicate Requirement Levels
- RFC 8174 – Clarifications to RFC 2119
- RFC 7519 – JSON Web Token (JWT) (構造の参考。署名アルゴリズムは独自)
- CIP-0 – Concrnt Core (CCID, CSID)
- CIP-13 – Subkey (Enact Document の解決と検証)
この文書は concrnt/CIPs-translated の ja/2-auth.md から生成されています。原文(英語)は concrnt/CIPs を参照してください。