arkor dev を実行したときに起動するローカル Web UI です。ローカルで動き、同じ CLI プロセスとループバック越しに通信し、dev サーバーを止めれば消えます。サインアップも公開 URL もありません。
http://localhost:4000(arkor dev --port で変更可)で開いてください。
レイアウト
ヘッダーには現在の ID が<mode> · <org>[ / <project>][ · <baseUrl-host>] の形で表示されます。mode は anonymous か oauth。クラウド API ホスト suffix は CLI が本番エンドポイントを指しているときは隠され、それ以外で表示されます。
4 ページ、アプリ内ナビ(Overview / Jobs / Playground / Endpoints)で切り替えます:
Jobs ページは
#/jobs/:id でジョブ単位の詳細(ライブステータス、Loss チャート、イベントログ)も開けます。ナビタブではなく Jobs のサブルートとして提供しています。
アーキテクチャ
/api/* リクエストごとに 3 つのチェックが走ります:
- Host ヘッダーのガード。
127.0.0.1とlocalhostのみ受理。127.0.0.1に DNS リバインディングされる悪意あるサイトに誘導された被害者でも、送信されるのはHost: evil.comで、ミドルウェアは HTTP 403 で拒否します。 - 起動ごとの CSRF トークン。
arkor devは起動ごとに 32 バイトのトークン(base64url)を生成し、<meta name="arkor-studio-token">としてindex.htmlにインジェクトし、すべての/api/*呼び出しに必須化します(ヘッダーX-Arkor-Studio-Token、またはEventSourceリクエスト用に?studioToken=)。クロスオリジンタブは meta を読めないので、preflight をスキップする「simple」なクロスオリジン POST も拒否されます。比較にはtimingSafeEqualを使用しているため、タイミング攻撃に対して安全です。 - CORS なし。 SPA は同一オリジンなので CORS には意味がありません。
*を反射すると「simple」なクロスオリジン POST(text/plain、urlencoded)を素通りさせてしまうので、トークンチェックがそれを拒否します。
arkor dev 起動のたびにローテートされるので、前回起動時の古いタブはリロードするまで HTTP 403 で失敗します。
現在できること
まだないもの
これらは SDK や HTTP API レベルでは存在しますが、Studio UI としては今のところありません:Studio を使うべきでない場面
Studio は開発ツールです。ループバックでのみ、arkor dev が立ち上がっている間だけリッスンし、起動ごとに CSRF トークンをローテートします。プロダクション利用では Studio にユーザーを向けるのではなく、自前のアプリケーションコード(あるいはデプロイ済みの推論層)から infer を呼んでください。