Lightning Web セキュリティと Lightning Locker の比較
Lightning Web セキュリティは、Lightning Locker と同様に安全ではない API の動作をブロックしたり、修正したりします。さらに、新しいアーキテクチャでは、Lightning Locker にはない機能がサポートされています。
Lightning Web セキュリティでサポートする追加機能の概要は次のとおりです。
- クロス名前空間コンポーネントの使用
Lightning Web コンポーネントでは、他の名前空間からコンポーネントまたはモジュールをインポートし、composition または extension を介して使用できます。コンポーネントは各自の名前空間の JavaScript Sandbox で分離されますが、セキュリティアーキテクチャによって仮想通信がバックグラウンドで実行されるため、分離は透過的に行われます。
- グローバルオブジェクトとのインタラクション
各名前空間には独立した JavaScript Sandbox があるため、
window
、document
、element
グローバルオブジェクトを直接公開できます。ラッパーを使用してコンポーネントを保護する必要はありません。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 は、
window
、document
、element
オブジェクトに対してセキュアなバージョンのラッパーを提供し、それらのグローバルオブジェクトの一部の API へのアクセスを防止します。ラッパーは、保護されたそれらの API にアクセスするいくつかのサードパーティライブラリを使用できないようにします。- 進化に合わせた標準 JavaScript との互換性の確保
Lightning Web セキュリティは、ブラウザのプラットフォームに合わせて進化する最新の TC39 標準を手本にしています。
次の表は、Lightning Locker の機能と Lightning Web セキュリティの機能を比較しています。
機能 | Lightning Locker | Lightning Web セキュリティ |
---|---|---|
JavaScript の厳格モード | 適用 | 適用 |
DOM のアクセスコンテインメント | コンポーネントがアクセスできるのは、作成した要素のみです。「DOM のアクセスコンテインメント」を参照してください。Lightning Locker では、Lightning Web コンポーネント間の Shadow DOM カプセル化を壊すことは防止されています。shadowRoot プロパティを変更することはできません。 | DOM へのコンポーネントのアクセスは、Web ブラウザに実装される Web 標準の Shadow DOM を通じてブラウザで制御されます。Lightning Web セキュリティは、mode が closed であることを要求してカプセル化の追加の制限を提供することで、クローズされた 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 コンポーネントは、設定を無効にするまで影響を受け続けます。 |