Lightning Web セキュリティと Lightning Locker の比較

Lightning Web セキュリティは、Lightning Locker と同様に安全ではない API の動作をブロックしたり、修正したりします。さらに、新しいアーキテクチャでは、Lightning Locker にはない機能がサポートされています。

Lightning Web セキュリティでサポートする追加機能の概要は次のとおりです。

クロス名前空間コンポーネントの使用

Lightning Web コンポーネントでは、他の名前空間からコンポーネントまたはモジュールをインポートし、composition または extension を介して使用できます。コンポーネントは各自の名前空間の JavaScript Sandbox で分離されますが、セキュリティアーキテクチャによって仮想通信がバックグラウンドで実行されるため、分離は透過的に行われます。

グローバルオブジェクトとのインタラクション

各名前空間には独立した JavaScript Sandbox があるため、windowdocumentelement グローバルオブジェクトを直接公開できます。ラッパーを使用してコンポーネントを保護する必要はありません。Lightning Web セキュリティは、これらのオブジェクトの動作を変更して、コンポーネントが、別の名前空間のコンポーネントで使用されるグローバルオブジェクトにアクセスしないようにします。

iframe のコンテンツと ID へのアクセス

Web ブラウザでは異なるオリジンのコンテンツにアクセスすることが許可されませんが、Lightning Web コンポーネントは iframe 要素のコンテンツにアクセスできます。iframe の ID は Sandbox の境界を越えても維持されるため、postMessage イベントのオリジンの ID チェックは正常に機能します。Lightning Locker は、iframe 内のコンテンツへのアクセスをブロックします。

パフォーマンスの向上

Lightning Web セキュリティでは、パフォーマンスを低下させるセキュアなラッパーが使用されないため、JavaScript Sandbox では、Lightning Locker よりも迅速にコードを実行できます。

サードパーティの JavaScript のサポートの改善

ライブラリは JavaScript Sandbox で実行され、グローバルな変更が他の名前空間のコンポーネントに影響しません。このため、ライブラリではグローバルオブジェクトを操作するなどの手法を使用できます。Lightning Locker は、windowdocumentelement オブジェクトに対してセキュアなバージョンのラッパーを提供し、それらのグローバルオブジェクトの一部の API へのアクセスを防止します。ラッパーは、保護されたそれらの API にアクセスするいくつかのサードパーティライブラリを使用できないようにします。

進化に合わせた標準 JavaScript との互換性の確保

Lightning Web セキュリティは、ブラウザのプラットフォームに合わせて進化する最新の TC39 標準を手本にしています。

次の表は、Lightning Locker の機能と Lightning Web セキュリティの機能を比較しています。

機能Lightning LockerLightning Web セキュリティ
JavaScript の厳格モード適用適用
DOM のアクセスコンテインメントコンポーネントがアクセスできるのは、作成した要素のみです。「DOM のアクセスコンテインメント」を参照してください。Lightning Locker では、Lightning Web コンポーネント間の Shadow DOM カプセル化を壊すことは防止されています。shadowRoot プロパティを変更することはできません。DOM へのコンポーネントのアクセスは、Web ブラウザに実装される Web 標準の Shadow DOM を通じてブラウザで制御されます。Lightning Web セキュリティは、modeclosed であることを要求してカプセル化の追加の制限を提供することで、クローズされた shadowRoot を強制します。「MDN Web Docs: ShadowRoot.mode」を参照してください。
セキュアなラッパーLightning Locker は、JavaScript オブジェクトをより安全なバージョンでラップして、安全ではない動作から守ります。オブジェクトとのやりとりはすべて、オブジェクトのセキュアなバージョンを介して行われます。「セキュアなラッパー」を参照してください。Lightning Web セキュリティではラッパーを使用しません。ディストーションを使用して、安全でない動作を可能にする API を個々に選択して変更します。
カスタム要素の使用可否Lightning Locker は customElements をブロックします。「サードパーティ Web コンポーネントと Lightning Locker」を参照してください。Lightning Web セキュリティは、customElementRegistry API を仮想化して、コンポーネント名前空間内でカスタム要素を使用できるようにしています。
eval() 関数の制限eval() は、Lightning Locker によってグローバル範囲に制限されます。「Lightning Locker による eval() 関数の制限」を参照してください。eval() はブロックされませんが、Sandbox でのディストーションによって、安全でない動作が阻止されます。
Blob オブジェクトで使用できる MIME タイプLightning Locker では、「許可される MIME タイプ」にリストされているものが使用できます。同じ MIME タイプが許可されます。ただし、Blob オブジェクトの作成時に MIME タイプを指定する必要があります。
子コンポーネントに渡される配列コンポーネント間で渡される配列をフィルタリングすると、Lightning Locker でパフォーマンスの問題が発生します。「子コンポーネントに渡されるときにプロキシ化される配列」を参照してください。Lightning Web セキュリティでは、DOM リクエストをフィルタリングせず、Shadow DOM を利用しているため、この問題は解決されています。
Locker の以前のバージョンに戻すLightning Locker では、以前のバージョンの Locker ルールを使用するように組織を設定できます。「組織の Locker API バージョンの選択」を参照してください。Locker API バージョンの設定は、Lightning Web セキュリティには影響しません。Lightning Web セキュリティを使用する設定は、どの API バージョンにも関連付けられていません。Lightning Web セキュリティを有効にすると、組織内のすべての Lightning Web コンポーネントは、設定を無効にするまで影響を受け続けます。