TL;DR
Trusted Document を実現する方式の 1 つ。Persisted Query のようにクエリをサーバに事前登録するのではなく、共通鍵で計算した HMAC によってクエリが信頼できるかを検証する。スタディサプリの開発チームによる実装パターンである。
なぜ必要か
Persisted Query では、クライアントが使うクエリを事前に GraphQL サーバへ登録する必要がある。Signed Query では、共通鍵を共有できる状態を一度作れば、この登録の手間がなくなる。クエリの信頼性を保ったまま、クライアントアプリをいつでもリリースできる。
仕組み
- クライアントのビルド時に、GraphQL Code Generator などのツールでアプリが使うクエリを集め、それぞれの HMAC を計算してアプリに埋め込む
- クライアントはクエリと対応する HMAC をサーバに送る
- サーバは事前に共有した共通鍵で HMAC を検証し、信頼されたクエリなら実行する。信頼されていないクエリにはエラーを返す
{
"query": "query Home { ...}",
"operationName": "Home",
"variables": {},
"extensions": {
"signedQuery": {
"signature": "xxxxxxxxxx"
}
}
}注意点
共通鍵の管理には十分注意する。たとえば、鍵を AWS Secrets Manager に保存し、ビルド時にだけ参照するようにする。