コンテンツにスキップ

可視性とセキュリティモデル

セキュリティモデル

Workers RPCシステムは、お互いを信頼しないWorkers間で安全な通信を可能にすることを目的としています。このシステムでは、RPCセッションのいずれの側も、相手側の任意のオブジェクトにアクセスすることはできず、ましてや任意のコードを呼び出すことはできません。代わりに、各側は以前の呼び出しを通じて明示的に受け取ったスタブに対してのみオブジェクトや関数を呼び出すことができます。

このセキュリティモデルは一般にオブジェクト能力(Object Capabilities)または能力ベースのセキュリティ(Capability-Based Security)として知られています。Workers RPCはCap’n Proto RPCの上に構築されており、これはさらに分散プログラミング言語Eで使用されるオブジェクトトランスポートプロトコルCapTPに基づいています。

メソッドとプロパティの可視性

プライベートプロパティ

クラスのプライベートプロパティは、RPCを介して直接公開されることはありません。

クラスインスタンスプロパティ

アプリケーション定義のクラスのインスタンスを送信すると、受信者はクラスで宣言されたメソッドとプロパティにのみアクセスでき、インスタンスのプロパティにはアクセスできません。例えば:

class Foo extends RpcTarget {
constructor() {
super();
// iはRPCを介してアクセスできません
this.i = 0;
// funcPropはRPCを介して呼び出せません
this.funcProp = () => {}
}
// valueはRPCを介してアクセスできます
get value() {
return this.i;
}
// methodはRPCを介して呼び出せます
method() {}
}

この動作は意図的です — プライベートなクラス内部を誤って公開することから保護するために設計されています。一般的に、インスタンスプロパティはプライベートとして宣言されるべきであり、#でプレフィックスを付けることが推奨されます。しかし、プライベートプロパティはJavaScriptの比較的新しい機能であり、エコシステム内で広く使用されているわけではありません。

RPCインターフェースが2つのWorker間のセキュリティ境界である可能性があるため、特に注意が必要です。そのため、RPCを使用してWorkers間で通信する際には、インスタンスプロパティは常にプライベートです。#プレフィックスが付いているかどうかにかかわらず、常にプライベートです。プロパティを公開したい場合は、上記のようにクラスレベルで明示的なゲッターを宣言することができます。

これらの可視性ルールは、RpcTargetWorkerEntrypoint、またはDurableObjectを拡張するオブジェクトにのみ適用され、プレーンオブジェクトには適用されません。プレーンオブジェクトは「値渡し」で渡され、その「独自の」プロパティがすべて送信されます。

関数の「独自の」プロパティ

RPCを介して関数を渡すと、呼び出し元は関数オブジェクト自体の「独自の」プロパティにアクセスできます。

someRpcMethod() {
let func = () => {};
func.prop = 123; // `prop`はRPCを介して可視です
return func;
}

関数のそのようなプロパティは、RpcTargetのクラスプロパティのように非同期でアクセスされます。しかし、上記のRpcTargetの例とは異なり、呼び出し元がアクセスできる関数のインスタンスプロパティです。実際には、関数にプロパティが追加されることはまれです。