DAT (Distributed Access Token)


DAT の導入背景

今日、多くのシステムが JWT を採用していますが、実際の運用環境では次のような構造的な限界が存在します。
これらを解決するために、新しいトークン仕様である DAT を設計しました。

🧩 セキュリティ仕様の断片化と強制力の欠如

JWT は JWE のような暗号化標準を提供していますが、その使用は強制されていません。
そのため多くの開発現場では暗号化が省略されたり、非標準の方法でデータが送信されたりして、セキュリティ上の脆弱性を招いています。

🔑 固定キー (Static Key) の使用によるセキュリティリスク

署名キーのローテーション (Key Rolling) が義務付けられていないため、単一のキーが長期間使い続けられることが頻繁にあります。これはキーが漏洩した場合にシステム全体のセキュリティ崩壊につながる可能性があり、実際に大規模なコマースサイトでこれによる侵害事故が発生しています。

📉 オーバーヘッドによるパフォーマンス低下

JWT はリクエストごとに JSON パース処理を行い、相当量の CPU リソースを消費します。高い性能が求められる環境では、このパースコストがシステム全体のボトルネックになり得ます。


DAT の核心哲学

DAT は、セキュリティは選択ではなく強制であるべきであり、パフォーマンスは妥協できないという原則のもとに設計されています。

⚡ 軽量かつ高速

expire
uint64 (10進)
.
cid
uint64 (16進)
.
plain
Base64Url
.
secure
Base64Url
.
signature
Base64Url
各フィールドにマウスを乗せると説明が表示されます。

DAT は上記のように、ピリオド (.) で区切られた 5 つの固定フィールドだけを持ちます。フィールドの位置が仕様で定められているため、JSON パースなしに区切り文字を探すだけで各値を切り出せます。

🔐 強制されるセキュリティ

DAT はデータ送信時に平文 (Plain) と暗号化 (Secure) の領域を物理的に分離します。
機密情報は必ず暗号化されるよう強制され、すべての処理は証明書に宣言された標準アルゴリズム (ECDSA、AES-GCM など) で保護されます。

暗号化アルゴリズムはトークンではなく証明書が決定します。トークンにはアルゴリズム情報が含まれないため、JWT の alg ヘッダーに起因するアルゴリズム混同攻撃の攻撃面が存在しません。

🔄 強制されるキーローリング

DAT 証明書は、トークンの発行と失効だけでなくキーのライフサイクルを直接管理します。
証明書には「いつからいつまで発行できるか」が仕様のレベルで埋め込まれているため、その期間を過ぎるとその証明書では新しいトークンを作れません。管理者の不注意によって 1 つのキーを何年も使い続けるという状況が、構造的に発生しません。

⏱️ 発行期間と有効期間の分離

「証明書がトークンを発行できる期間」と「発行されたトークンが生きている期間」は互いに異なる値です。
そのおかげで、証明書が発行を停止した後でも、すでに発行済みのトークンは自らの寿命を全うでき、その間にクラスタは次の証明書へ自然に移行します。


認証メカニズムの比較

分類DATJWTセッション
認証方式分散検証分散検証中央集中型
データ構造Raw Bytes
(固定オフセットベース)
JSON
(キー・バリューのテキストベース)
Serialized Object
(オブジェクトのシリアライズ)
パース機構バイトデータの即時マッピングJSON パースと型キャストが必要オブジェクトのデシリアライズと I/O が発生
処理性能最高 (パースオーバーヘッドを最小化)普通 (JSON 処理性能に依存)低い (ネットワーク/ディスク I/O)
暗号化標準で提供JWE を別途実装する必要あり (複雑)該当なし
キー管理システムによる強制ローリング (セキュリティ強制)自前で実装 (管理不注意のリスク)該当なし
キー有効期間キー仕様内で強制的に明示任意 (未管理の場合は永久)中央サーバーが管理
アルゴリズム選択証明書が決定 (トークンには含まれない)トークンヘッダーの alg該当なし
有効期限仕様上の必須フィールド任意クレーム (exp)サーバーが管理

性能

DAT 発行 10,000回 (マルチスレッド)
Rust HMAC-512
6 ms
Go HMAC-512
9 ms
C / C++ HMAC-512
9 ms
Java / Kotlin HMAC-512
13 ms
C# HMAC-512
19 ms
Rust P256
24 ms
C / C++ P256
32 ms
Go P256
58 ms
Python HMAC-512
93 ms
Ruby HMAC-512
130 ms
JavaScript HMAC-512
134 ms
Ruby P256
155 ms
Java / Kotlin P256
158 ms
JavaScript P256
179 ms
Python P256
192 ms
C# P256
235 ms
DAT 解析 10,000回 (マルチスレッド)
Rust HMAC-512
4 ms
Go HMAC-512
5 ms
Java / Kotlin HMAC-512
7 ms
C / C++ HMAC-512
8 ms
C# HMAC-512
11 ms
Rust P256
52 ms
C / C++ P256
69 ms
Go P256
72 ms
Python HMAC-512
89 ms
Java / Kotlin P256
118 ms
JavaScript HMAC-512
143 ms
Ruby HMAC-512
150 ms
JavaScript P256
167 ms
Python P256
182 ms
C# P256
185 ms
Ruby P256
194 ms
mac mini m4 2024 basic (10 core) 実測 · グラフは IV-AES256-GCM のみ表示
生データ(10,000回あたり ms)
Multi-Thread
Signature · CryptoRustGoJava / KotlinJavaScriptC#PythonRubyC / C++
IssueParseIssueParseIssueParseIssueParseIssueParseIssueParseIssueParseIssueParse
HMAC-SHA256-MFS · IV-AES128-GCM65115121301741822215888315015299
HMAC-SHA256-MFS · IV-AES256-GCM7595221315214819151068213816288
HMAC-SHA384-MFS · IV-AES128-GCM6495503115214218151008013014588
HMAC-SHA384-MFS · IV-AES256-GCM641052271411411911928013216588
HMAC-SHA512-MFS · IV-AES128-GCM641053571391481611947913014998
HMAC-SHA512-MFS · IV-AES256-GCM64951371341431911938913015098
ECDSA-P256 · IV-AES128-GCM265753712532401841702082031911811701893275
ECDSA-P256 · IV-AES256-GCM245258721581181791672351851921821551943269
ECDSA-P384 · IV-AES128-GCM954532145935075139968585605478672,036339441196424
ECDSA-P384 · IV-AES256-GCM1452572205662482771,0418775365048691,972320490186379
ECDSA-P521 · IV-AES128-GCM2324704681,4665926812,5412,1041,5231,4627281,446352554250449
ECDSA-P521 · IV-AES256-GCM1523064671,5074735802,6811,9991,4501,4657041,395374529260454
Single-Thread
Signature · CryptoRustGoJava / KotlinJavaScriptC#PythonRubyC / C++
IssueParseIssueParseIssueParseIssueParseIssueParseIssueParseIssueParseIssueParse
HMAC-SHA256-MFS · IV-AES128-GCM1258430302702623534353764601615
HMAC-SHA256-MFS · IV-AES256-GCM1257432302782613535343658661514
HMAC-SHA384-MFS · IV-AES128-GCM1379628272662645544353762611718
HMAC-SHA384-MFS · IV-AES256-GCM1369630292692714034363866731717
HMAC-SHA512-MFS · IV-AES128-GCM1369628272622373836363858631717
HMAC-SHA512-MFS · IV-AES256-GCM1369630292642473735353760671716
ECDSA-P256 · IV-AES128-GCM128287165358521492447681870785210431177392156373
ECDSA-P256 · IV-AES256-GCM123274156345473503446700845782202434172394147361
ECDSA-P384 · IV-AES128-GCM4721,0901,0953,1291,2841,4234,0113,5582,1762,1134,76011,2791,0552,1551,0392,147
ECDSA-P384 · IV-AES256-GCM4741,0741,0733,1511,2841,6764,0643,4562,1552,1264,74511,2781,0392,1601,0412,151
ECDSA-P521 · IV-AES128-GCM8331,6572,6538,6652,6973,2789,8697,6036,0395,9583,4997,1151,3582,3901,3592,394
ECDSA-P521 · IV-AES256-GCM8441,6772,6528,6832,6393,2839,7997,4095,9445,8563,4887,1161,3812,3981,3602,402

次のドキュメント

  • DAT — トークンのワイヤーフォーマットと正規ルール
  • 証明書 — 証明書の構造、アルゴリズム、ライフサイクル
  • CMS 同期 — 証明書の配布と運用時に知っておくべき挙動