よろずやIT
プログラミング

冪等キー(Idempotency-Key)とは?二重決済・二重登録を防ぐAPI設計と実装のポイント

執筆・監修:よろずやIT編集部|編集方針を見る

結論:まずここだけ読めばOK

詳しい手順・原因は、この下で解説しています。

プログラミングのイラスト

起きる問題:「結果が分からない」から、再送した

オンラインで、決済のリクエストを送ったとします。通信が不安定で、応答が返ってこない。実際には、サーバーは処理を終えていたのかもしれませんし、届いていなかったのかもしれません。

利用者やプログラムは、結果が分からないので、もう一度、同じリクエストを送ります。すると、すでに処理されていた場合、二重に決済されてしまいます。

この問題を防ぐ考え方が、冪等性です(冪等性とは)。そして、決済や登録のように、本来は、繰り返すと結果が変わってしまう操作を、安全に再送できるようにする仕組みが、冪等キーです。

冪等キーの考え方

冪等キーは、「この操作は、これです」という、一意の印です。

順番 動き
① クライアントが、操作ごとに、一意のキーを作る
② キーを付けて、リクエストを送る
③ サーバーは、そのキーを、初めて受け取ったなら、処理を行い、キーと結果を保存する
④ 再送で、同じキーを受け取ったら、処理せず、保存した結果を返す

この仕組みで、何度送っても、処理は1回だけになります。

具体的な流れ(例)

HTTPでは、キーをヘッダーに付けて送る設計が、決済などのAPIで、よく使われます。

POST /payments Idempotency-Key: 3f2a9c1e-...(操作ごとに作った、一意の値)

  1. 1回目のリクエスト:サーバーが、決済を処理し、キーと結果(成功)を保存する。応答は、通信エラーで届かなかった
  2. 再送(同じキー):サーバーは、キーが保存されていることを確認し、決済は行わず、保存してあった結果を返す

サーバー側で決めること

決めること 考え方
キーの保存先 データベースや、キャッシュなど。処理の結果と、一緒に、確実に保存する
同じキーで、同じ内容 保存した結果を、そのまま返す
同じキーで、内容が違う エラーにする(キーの誤用か、不正の可能性があるため)
処理中に、同じキーが来た 二重に処理しないよう、待たせるか、処理中であることを返す
保存の期限 再送が起こり得る期間より、長くする
失敗した場合の扱い 失敗の結果も保存するか、再試行を許すか、事前に決める

サンプルコード(考え方の例)

考え方を示す、簡単な例です。実際の運用では、データベースの制約や、同時実行への対応を、きちんと設計してください。

# 保存先の例:キーごとに「リクエストの内容」と「結果」を持つ
saved = {}

def create_payment(idempotency_key, request):
    if idempotency_key in saved:
        record = saved[idempotency_key]
        if record["request"] != request:
            # 同じキーで、内容が違う → エラー
            raise ValueError("同じキーで、異なる内容のリクエストです")
        return record["response"]      # 前の結果を、そのまま返す

    response = do_payment(request)     # 初回のみ、実際の処理を行う
    saved[idempotency_key] = {"request": request, "response": response}
    return response

実際のシステムでは、「保存」と「処理」が、確実にセットで行われるようにする必要があります。たとえば、キーをデータベースの一意制約で、二重に登録できないようにし、処理と保存を、**1つの取引(トランザクション)**にまとめる設計が、考えられます。

クライアント側の使い方

よくある落とし穴

落とし穴 何が起きるか
再送のたびに、キーを作り直す 毎回、新しい操作と見なされ、二重処理になる
キーの保存期限が、短すぎる 期限後の再送が、新しい操作になる
結果を保存せず、キーだけを覚える 再送した時に、前の結果を返せない
処理中の同時リクエストを、考えていない 同時に届いた2つが、どちらも処理される
内容が違うのに、同じキーを受け付ける 意図しない処理や、不正を見逃す
キーが、推測しやすい 他の人のキーと、衝突したり、悪用されたりする

冪等キー以外の方法

冪等キーを使わなくても、操作が、もともと冪等になる設計ができる場合もあります。

どの方法が合うかは、扱う操作の性質によって異なります。

まとめ

API連携の他の確認事項は、API連携が「両方正常なのに繋がらない」時の確認5項目や、APIをループで呼ぶ時の3つの約束をご覧ください。

PRWeb API設計実践入門──API仕様ファーストによるテスト駆動開発 [ 柴田 芳樹 ]

Web API設計実践入門──API仕様ファーストによるテスト駆動開発 [ 柴田 芳樹 ]

¥2,860

楽天で見る
SHAREXLINEはてブ

よくある質問

Q.冪等性と、冪等キーは、何が違いますか?

A.冪等性は、「同じ操作を何度行っても、結果が同じ」という性質のことです。冪等キーは、その性質を、本来は冪等でない操作(決済や登録など)で実現するための、仕組みの1つです。冪等性そのものの意味は、当サイトの「冪等性とは」で解説しています。

Q.キーは、どのように作ればよいですか?

A.重複しにくい、ランダムな値(UUIDなど)を、クライアント側で、操作ごとに作るのが一般的です。大切なのは、「同じ操作の再送には、同じキーを使い、新しい操作には、新しいキーを使う」ことです。

Q.キーは、いつまで保存すればよいですか?

A.再送が起こり得る期間よりも、長く保存する必要があります。保存期間が短すぎると、期限後の再送が、新しい操作として扱われてしまいます。長すぎると、保存の負担が増えます。業務の性質や、クライアントの再試行の設計に合わせて決めてください。

関連記事

プログラミング用語解説

Webhookとは|APIとの違いと、通知が届く仕組み・安全に受け取る注意点

Webhookは、何かが起きた時に、サービス側から、指定したURLへ自動で通知を送る仕組みです。APIやポーリングとの違い、通知が届く流れ、受け取る側の注意点(署名の検証・再送・冪等性)をまとめます。

プログラミング用語解説

PHPとは?何ができる?仕組みとWordPressとの関係を図解で解説

PHPは、Webサイトの裏側(サーバー)で動くプログラミング言語で、WordPressもPHPで動いています。何ができるか、動く仕組み、簡単なコード例、メリット・注意点、始め方を、図解つきで初心者向けに解説します。

プログラミング用語解説

辞書(dict)型とは?キーと値で管理する書き方をPythonで解説

辞書(dict)型とは、キーと値のペアでデータを管理する入れ物です。リストとの違い、取り出し方、get()でKeyErrorを防ぐ方法、追加・更新・削除、for文での繰り返しを、Pythonの短いコードと図解で解説します。

プログラミング用語解説

JSONとは?書き方の基本ルールと、よくあるエラーの直し方をやさしく解説

APIや設定ファイルでよく見かけるJSONとは何か。書き方の基本ルール、使えるデータの種類、「カンマ」「引用符」などよくあるエラーの原因まで、初心者向けに解説します。

最新のIT関連書籍 トップ10

PR / 楽天市場の売れ筋ランキングを定期的に取得しています。価格は変動する場合があるため、購入前に各ストアでご確認ください。