テイント (taint)
使用方法
taint
オプションを有効にすると、オブジェクトや値にテイントを付与する実験的な React API が使用可能になります。この機能は、機密データが誤ってクライアントに渡されるのを防ぐのに役立ちます。有効にすると、以下の API が使用できます:
experimental_taintObjectReference
- オブジェクト参照にテイントを付与experimental_taintUniqueValue
- ユニークな値にテイントを付与
補足: このフラグを有効にすると、
app
ディレクトリに対して React のexperimental
チャンネルも有効になります。
警告: 機密データがクライアントに露出するのを防ぐ唯一の手段としてテイント API に依存しないでください。セキュリティに関する推奨事項を参照してください。
テイント API を使用すると、宣言的かつ明示的にサーバー-クライアント境界を越えて渡すことが許可されていないデータをマークすることで、防御的なプログラミングが可能になります。オブジェクトや値がサーバー-クライアント境界を越えて渡されようとすると、React はエラーをスローします。
この機能は以下のようなケースで役立ちます:
- データを読み取る方法を制御できない場合
- 自分で定義していない機密データ構造を扱わなければならない場合
- サーバーコンポーネントのレンダリング中に機密データにアクセスする場合
データや API を設計する際は、機密データが必要とされないコンテキストに返されないようにすることを推奨します。
注意点
- テイントは参照によってのみオブジェクトを追跡できます。オブジェクトをコピーするとテイントが解除され、API が提供するすべての保証が失われます。コピーにもテイントを付与する必要があります。
- テイントはテイントされた値から派生したデータを追跡できません。派生した値にもテイントを付与する必要があります。
- 値は、その参照のライフタイムがスコープ内にある間のみテイントが維持されます。詳細は
experimental_taintUniqueValue
のパラメータリファレンスを参照してください。
例
オブジェクト参照にテイントを付与
この例では、getUserDetails
関数が指定されたユーザーのデータを返します。ユーザーオブジェクト参照にテイントを付与することで、サーバー-クライアント境界を越えて渡せないようにします。例えば、UserCard
がクライアントコンポーネントであると仮定します。
テイントされた userDetails
オブジェクトから個々のフィールドにアクセスすることは可能です。
しかし、オブジェクト全体をクライアントコンポーネントに渡すとエラーがスローされます。
ユニークな値にテイントを付与
この例では、config.getConfigDetails
を呼び出すことでサーバー設定にアクセスできます。しかし、システム設定にはクライアントに公開したくない SERVICE_API_KEY
が含まれています。
config.SERVICE_API_KEY
の値にテイントを付与できます。
systemConfig
オブジェクトの他のプロパティには引き続きアクセスできます。
しかし、SERVICE_API_KEY
を ClientDashboard
に渡すとエラーがスローされます。
systemConfig.SERVICE_API_KEY
が新しい変数に再代入されていても、クライアントコンポーネントに渡すとエラーがスローされることに注意してください。
一方、テイントされたユニークな値から派生した値はクライアントに公開されます。
より良いアプローチは、getSystemConfig
が返すデータから SERVICE_API_KEY
を削除することです。