パブリックおよびプライベートエンドポイントの公開
GraphQLは伝統的に、通常はhttps://mysite.com/graphqlの下に単一のエンドポイントを公開することを目的としています。
Gato GraphQLはこの概念を拡張し、特定のニーズに合わせた複数のカスタムエンドポイントを公開できるようにします。たとえば、次のようなエンドポイントを公開できます:
/internalと/public/apps/mobileと/apps/website/clientsと/visitors/development、/staging、/production/teams/development、/teams/testing、/teams/marketing/clients/A、/clients/B、clients/Z- これらの任意の組み合わせ
Gato GraphQLはパーシステッドクエリもサポートしており、これはGraphQLクエリがあらかじめ定義されてサーバーに保存されたエンドポイントです。
このガイドでは、各エンドポイントをどのように、いつ使用するかについての提案を紹介します。
Gato GraphQL APIエンドポイントのセキュリティを確保することに加えて、WP Security Ninjaのような専用のセキュリティプラグインを使用して、WordPressサイトのセキュリティを常に強化することをお勧めします。
エンドポイントはスキーマ設定を通じて設定され、そこで以下を定義します:
- スキーマをパブリックまたはプライベートに設定する
- 「センシティブ」なデータ要素を有効にする
- スキーマの名前空間を設定する
- ネストされたミューテーションを使用する
- レスポンスヘッダーを定義する
- アクセスコントロールリストを通じてスキーマ要素へのアクセスを許可する
- HTTPキャッシングを設定する
- その他多数
すべてまたはほとんどのエンドポイントに適用したい設定がある場合は、デフォルトのスキーマ設定を定義できます。
シングルエンドポイントを使うタイミング
シングルエンドポイントは常にパブリックであり、デフォルトで/graphqlの下に公開されます。
Gato GraphQLは「モジュール」によって管理されており、それぞれがGraphQLスキーマの機能や拡張を提供し、必要に応じて有効・無効にできます。
APIのセキュリティを強化するために、必要でない場合はGraphQLスキーマを拡張するモジュール(「Posts」、「Users」、「Comments」、「Blocks」などのモジュール)を無効にすることが推奨されます。これにより、そのデータが最初から決して公開されないことが保証されます。
特に、APIがデータをミューテートすること(つまりリソースの作成や更新)を目的としていない場合は、「Mutations」モジュールを無効にすることが推奨されます。そうすることで、ミューテーションを提供するすべての拡張(「Post Mutations」、「Comment Mutations」などのモジュール)も無効になり、これらのミューテーションがGraphQLスキーマで公開されることはなくなります。
シングルエンドポイントは以下の場合に推奨されます:
- 単一の機能を動かすためにデータを取得する必要があり、
- WordPressウェブサイトがオープンインターネットからアクセスできない場合(つまり、開発用ラップトップで動作しているか、ファイアウォールの背後にある場合)
これは、たとえばヘッドレスサイトを構築する場合(Next.js、Gatsbyなどを使用)に該当します。
パブリックカスタムエンドポイントを使うタイミング
カスタムエンドポイントはシングルエンドポイントに似ていますが、複数持つことができ、それぞれが独自のURLgraphql/{custom-endpoint-slug}/の下に公開され、それぞれが異なる設定を持つことができます。
カスタムエンドポイントは「隠蔽によるセキュリティ」を提供します。カスタムエンドポイントの存在とそのURLを知っているのは、意図されたターゲットだけであるべきだからです。
APIのセキュリティをより強固にするために、**Access Control**拡張機能を使用して、以下の場合にのみエンドポイントへのアクセスを許可できます:
- ユーザーがログインしている(またはしていない)場合
- ユーザーが特定のロールを持っている場合
- ユーザーが特定の権限を持っている場合
- 訪問者が許可されたIPから来ている場合(**Access Control: Visitor IP**拡張機能を使用)
各カスタムエンドポイントは独自のアクセスコントロールリストを持つことができ、特定の意図されたユーザーのみがアクセスできるようになります。
カスタムエンドポイントは、異なるアプリケーション、チーム、クライアント、またはその他のユーザーによるAPIへのアクセスを管理・カスタマイズする必要がある場合に推奨されます。
プライベートカスタムエンドポイントを使うタイミング
Gato GraphQLはカスタムエンドポイントをカスタム投稿タイプ(CPT)として実装しています。これにより、カスタムエンドポイントをプライベートとして公開(またパスワード保護としても)できます。そうすることで、カスタムエンドポイントはそのカスタム投稿にアクセスする権限を持つログイン済みユーザーのみがアクセスでき、他の誰もアクセスできなくなります。
この方法は、GraphQLエンドポイントがサイトの管理者のみが使用することを目的としている場合(GraphQLを使用して管理タスクを実行する場合など)に推奨されます。外部の訪問者がエンドポイントにアクセスするのを完全にブロックすることで、サイトのセキュリティを強化できます。
パブリックパーシステッドクエリを使うタイミング
パーシステッドクエリはエンドポイントであり、それぞれが独自のURLを持ちますが、GraphQLクエリはすでにサーバー側で定義されているため、レスポンスも事前に定義されています(URLパラメータで満たされる変数を定義することで動的にすることができます)。
パーシステッドクエリはRESTエンドポイントに似ていますが、GraphQL言語を使用してクエリを作成し、wp-adminから直接公開できます。パーシステッドクエリを公開するためにPHPコードをデプロイする必要はありません。
パーシステッドクエリはリクエストのボディにGraphQLクエリを渡す必要がないため、POSTではなくGETでアクセスするのに自然に適しています。
(シングルエンドポイントとカスタムエンドポイントも、エンドポイントにパラメータ?query={ GraphQL query }を追加することでGETでアクセスできます。)
これを活用して、標準的なHTTPキャッシングによりAPIを高速化し、クライアント側またはクライアントとサーバー間の中間ステージ(CDNなど)でGraphQLレスポンスをキャッシュできます。
これは**Cache Control**拡張機能によって実現され、クエリ内のフィールドとディレクティブに基づいてレスポンスのmax-age値を自動的に計算して出力します。
パーシステッドクエリは可能な限り使用することが推奨されます。サイトのセキュリティを大幅に向上させるからです。
これは、アプリケーションで利用可能にする必要があるすべてのデータをパーシステッドクエリを通じてすでに公開できるためです。そうすれば、GraphQLシングルエンドポイント(またはカスタムエンドポイント)の公開をスキップでき、ユーザーが(誤って、またはその他の理由で)公開したままにしたプライベートデータにアクセスできる可能性を排除できます。
プライベートパーシステッドクエリを使うタイミング
カスタムエンドポイントと同様に、パーシステッドクエリはCPTであるため、プライベート(またはパスワード保護)として公開でき、それにアクセスする権限を持つログイン済みユーザーのみがアクセスでき、他の誰もアクセスできなくなります。
WordPressデータを自分自身の用途で検索する場合など、クエリが内部使用のみを目的としている場合は常にこれらを使用することが推奨されます。