Google Pay をサンドボックス化した iframe で動作させて PCI DSS v4 に準拠する

2025年6月10日
Dominik Mengelt Developer Relations Engineer Payments

ご購入手続きに使うページの開発や保守を行っている方なら、PCI DSS v4 をご存知かもしれません。この 6.4.3 項で、次の要件が規定されています。


消費者のブラウザに読み込まれ、実行されるすべての決済ページ スクリプトは、次のように管理される。

  • 各スクリプトが認可されていることを確認する方法が実装されている。

  • 各スクリプトの整合性を保証するための方法が実装されている。

  • すべてのスクリプトのインベントリが、それぞれのスクリプトが必要となるビジネス的または技術的に正当な理由を説明した文書とともに管理されている。


この要件に準拠する方法の 1 つは、サブリソース完全性(SRI)のような手法を使うことです。ただし、SRI などの手法には長期にわたって安定したハッシュが必要ですが、Google Pay JavaScript(pay.js)のビルドとリリースのプロセスではそれを利用することはできません。


サンドボックス化した iframe を利用する

サンドボックス化した iframeを使うと、あらゆるコンプライアンス上の懸念を払拭できます。iframe 内のスクリプトは、親 DOM にアクセスできないからです。次の図の例をご覧ください。

sandboxed iframe
<iframe
  src="https://cdn.somewhereelse.com"
  allow="payment"
  sandbox="allow-scripts allow-popups allow-same-origin allow-forms">
</iframe>
JavaScript

この場合、ドメイン「cdn.somewhereelse.com」は Google Pay の pay.js JavaScript ファイルを読み込みます。トランザクションが成功すると、内部の iframe は必要に応じて親ページと通信できます。その際には、window.postMessage() などのメカニズムが使われます。

Google Pay をすべてのブラウザで動作させるには、allow=”payment” に加えて、次の 4 つのサンドボックス属性値が必要です。

  • allow-scripts

iframe でスクリプトを実行できるようにする(pay.js など)。

  • allow-popups

埋め込みページが「子ブラウジング コンテキスト」を作成できるようにする。実際には、このフラグは、埋め込まれた iframe でユーザーがリンクをクリックしたときに、新しいタブとウィンドウを開けるようにする。

  • allow-same-origin

これが設定されていないと、ブラウザでさまざまな問題が発生する。設定されている場合、iframe が親のストレージや Cookie にアクセスできる。

  • allow-forms

Google Pay ログインなどのフォームでデータを送信できるようにする。


さまざまな iframe サンドボックス値の動作を確認するには、こちらのテストページをご覧ください。


Shopify が PCI DSS v4 の認証を取得

Google Pay は、Shopify と連携して上記のソリューションを実装しました。Shopify は、サンドボックス化した iframe を使って Google Pay ボタンを表示することで、PCI DSS v4 の監査に合格しました。Shopify からのコメントを紹介します。

Shopify Checkout は、Google Pay のコードが安全なサンドボックス環境で実行されるように作られているので、ご購入手続きの整合性が維持され、PCI DSS v4 要件に準拠できます。

Shopify 特別エンジニア、Ilya Grigorik 氏


Shopify がサンドボックス化した iframe でご購入手続きソリューションを開発した詳しい方法については、Shopify のブログ投稿「PCI DSS v4 に準拠した Shopify の高パフォーマンスなご購入手続きを支えるサンドボックス化」をご覧ください。


まとめ

サンドボックス化した iframe で Google Pay 連携機能をラップすることで、PCI DSS v4 要件に準拠できます。実装についてさらにサポートが必要な場合は、Google Pay & ウォレット コンソールにログインしてサポート チケットを作成してください。また、Discord の #payments チャンネルからデベロッパー コミュニティに参加することもできます。

X で@GooglePayDevs をフォローすると、今後の最新情報を受け取ることができます。ご不明な点がある場合は、@GooglePayDevs にタグ付けし、ツイートに #AskGooglePayDevs を含めてください。