HTTP / WebSpec

コールバックとは:「終わったら、ここに知らせて」と連絡先を渡しておく仕組み

「コールバック」という言葉は、ログインの設定、決済サービスの連携、Webhook、プログラムの非同期処理など、いろいろな場面で出てきます。なんとなく分かったつもりでいても、いざ説明しようとすると言葉にしにくいものです。検索すると、たいていは「関数の引数に渡す関数」というプログラミングの説明が出てきますが、それだけでは、ログインの「コールバック URL」や Webhook とのつながりが見えません。この記事では、それらに共通する考え方を整理します。

ひとことで言うと

コールバックは、「終わったら、ここに知らせて(ここへ戻して)」と、先に連絡先を渡しておく仕組みです。電話の「折り返しお電話ください」と同じ考え方です。

なぜ要るのか(ポーリングとの比較)

自分ではいつ終わるかわからない処理や、途中で自分の手を離れる処理があります。その結果を受け取る方法は、大きく 2 つです。

やり方たとえ弱いところ
こちらから何度も聞きに行く(ポーリング)「まだですか?」と何度も電話する無駄が多い。終わってから気づくまでに遅れが出る
終わったら相手から知らせてもらう(コールバック)「終わったらこの番号に折り返してください」連絡先を先に渡しておく必要がある。知らせてきた相手が本物かを確かめる必要がある

使われる場面(3 種類)

1. ブラウザを戻してもらうコールバック

利用者が、いったん別のサイトへ行くときに使います。

  • ログイン(OAuth・SSO):Web アプリ → Microsoft や Google のログイン画面でログイン → Web アプリの /callback に戻る
  • ネットの支払い:お店 → 決済会社の画面で支払い → お店の「完了」ページに戻る
  • 「Google でログイン」「GitHub でログイン」のボタン全般

ほかのサイトに一度渡した利用者を、結果と一緒に、こちらへ戻してもらいます。

2. サーバーどうしのコールバック(Webhook)

何かが起きたら、相手のサーバーがこちらの URL を呼ぶものです。

  • GitHub:push されたら、CI のサーバーへ知らせる
  • 決済会社:支払いが確定したら、お店のサーバーへ知らせる
  • チャットツール(Slack・Teams など)の Webhook:ほかのシステムからチャットに書き込む
  • Microsoft Graph の変更通知:「OneDrive のファイルが変わったら知らせて」
3. プログラムの中のコールバック

関数を渡しておき、あとで呼んでもらうものです。

  • 「ボタンが押されたら、この関数を動かして」
  • 「ダウンロードが終わったら、この関数を動かして」

検索でよく出てくるのはこれです。上の 2 つも、考え方の元は同じです。

どれにも共通する、大事な 2 点

  1. 連絡先は前もって登録しておく。 たとえば、Microsoft(Entra ID)や Google のログインを使うアプリは、戻り先の URL(リダイレクト URI)を前もって登録します。登録したところ以外には戻さないためです。ここを自由にすると、攻撃者の URL へ結果を送らせることができてしまいます。
  2. 知らせてきた相手を確かめる。 コールバックの URL は、誰でも呼べます。だから、本物かを確かめる印が要ります。ログインでは state や PKCE、Webhook では署名や共有の秘密がその役です。

例:OAuth のログインでのコールバック

Web アプリが、Microsoft のログインを使って、利用者の権限でデータを読む場合の流れです。

  1. 利用者が、Web アプリで「Microsoft でログイン」を押す
  2. Web アプリは、利用者のブラウザを Microsoft のログイン画面へ転送する。このとき、URL に「ログインが済んだら https://app.example.com/oauth/callback に戻してください」と書いておく
  3. 利用者が、Microsoft の画面でログイン・同意する。この間、Web アプリは何もできず、利用者がいつ戻ってくるかもわからない
  4. Microsoft は、ブラウザを https://app.example.com/oauth/callback?code=…&state=… に戻す。これが折り返しの電話
  5. Web アプリは、受け取ったコード(トークンの引換券)を、サーバーどうしの直接のやりとりで、本物のトークンに替える

2 で渡した戻り先の URL が、2 番目に書いた「前もって登録しておく連絡先」です。4 の state が、「知らせてきた相手を確かめる印」です。4 でブラウザが運ぶのは引換券だけで、トークンそのものではありません。ブラウザを通るものは、履歴やログに残ったり、見られたりする危険があるからです。

まとめ

  • コールバックは「終わったら、ここに知らせて」と、先に連絡先を渡しておく仕組み
  • ポーリング(何度も聞きに行く)の無駄と遅れをなくせる
  • ブラウザを戻すもの(ログイン・決済)、サーバーどうし(Webhook)、プログラムの中(関数)の 3 種類がある
  • どれも「連絡先を前もって登録する」「知らせてきた相手を確かめる」の 2 点が大事
スポンサーリンク
タイトルとURLをコピーしました