webhookの正当性検証

お世話になっております。


webhookの購読において、受信したwebhookが正しくスマレジより送信されたものかを、受信毎に検証したいと考えています。

x-sdsch- をプリフィックスに持つカスタムヘッダが設定可能のようですので、こちらに何らかの暗号学的ハッシュ値を設定しておき、webhookを受信するサーバで検証することを考えております。

(蛇足ながら、おそらくhmacアルゴリズムを使うことにすると思います)


アプリ管理画面の「Webhook送信先エンドポイント」については、設定したカスタムヘッダが受信されることを確認出来たのですが、「利用者契約通知先URL」に設定したエンドポイントについては、カスタムヘッダが付与されていないように見受けられました。


これは意図した挙動でしょうか?

また、意図した挙動である場合、利用者契約通知の正当性はどのように検証される想定でしょうか?

ベストアンサー

  • @kogai

    アプリ管理画面の「Webhook送信先エンドポイント」については、設定したカスタムヘッダが受信されることを確認出来たのですが、「利用者契約通知先URL」に設定したエンドポイントについては、カスタムヘッダが付与されていないように見受けられました。


    これは意図した挙動でしょうか?

    これは意図した挙動となります。

    理由としてはWebhookがOFFのアプリケーションでもサーバーへ必ずPOSTするWebhookとは違う機能と定義づけているからです。


    また、意図した挙動である場合、利用者契約通知の正当性はどのように検証される想定でしょうか?

    申し訳ありませんが、ハッシュ値などを利用して正当性を担保するという点では、この要望に応えることができないです。

    ヘッダーにスマレジのイベント

    "smaregi-event": "AppSubscription",
    

    でスマレジからの通信であることを検証できるくらいと感じております。


    上記のような回答でよろしいでしょうか?

  • @kogai

    ご提案ありがとうございます!


    @kogai さんのおっしゃるとおりだと考えます。

    今すぐでなくても結構ですが、偽装が困難な仕組みを提供頂けるとうれしいです。

    Webhookと同じような仕組みか、秘匿性のあるキーを設定できるような改修を検討させていただきます。

    後手後手になってしまい申し訳ありませんが、今しばらくお待ちいただければと思います。

答え

  • March 2021 編集されました

    回答ありがとうございます。

    状況について、承知致しました。


    ただ、利用者契約通知の正当性が担保出来ないと、契約idと利用者契約通知のエンドポイントさえ分かってしまえば、偽装が可能ということになってしまいそうですね。

    例えば高額なプランを提供しているアプリに対して、管理画面での操作としては低額なプランに設定しておき、裏で自アカウントの契約idを載せて高額プランを模したリクエストを送信する、といったことが出来てしまい、且つ正当なものとそうでないものの区別がアプリ提供者からは付けられないように思いました。

    考えすぎかも知れませんが。。。

    (契約idと利用者契約通知のエンドポイントは、共に秘匿情報とは言い難いものと思われますので、「悪意ある第三者に知られていない」前提を取るのはやや難しいだろうと思います)


    今すぐでなくても結構ですが、偽装が困難な仕組みを提供頂けるとうれしいです。

    例えばアプリのクライアントシークレットと送信するリクエストボディを暗号学的ハッシュ関数に食わせて、値をヘッダに載せるようにして頂ければ、正当性の検証が出来るので偽装は困難となりそうです。

    (他のプラットフォームを引き合いに出して恐縮ですが、例えばLINEさんはそのような検証方法を提供されています https://developers.line.biz/ja/docs/messaging-api/receiving-messages/#verifying-signatures

    ご検討のほどよろしくお願い致します。