← eli5

OAUTH

クロークの
引換札

札に棚の番号を書いておくと、その札は誰にでも書ける。

07
01

まず、預ける話から

あなたの店には棚がある。そこに「外の店のデータを見にいく鍵」を置いておくと、店が代わりにデータを取ってきてくれる。

鍵を置くには、いったん外の店へ行って「この人にどうぞ」と許してもらう必要がある。行って、許してもらって、帰ってくる。帰ってきたときに どの棚に置くのか を思い出さないといけない。

そのために 引換札 を持って出かける。

じぶんの店 外の店 札をもって出かける 札をもって帰る
札は「帰ってきたときに、どの棚か思い出すためのもの」
02

札に棚の番号が書いてあった

もんだい

むかしの札は、棚の番号がそのまま書いてあるだけだった。しかも読める字で。

札を見れば「7 番の棚」と分かる。帰ってきた店の人は、札の 7 を読んで 7 番の棚に鍵を置く。

札には印もハンコもない。読めるということは、書けるということでもある。

たな 7 ほんもの まねる たな 7 じぶんで書いた
紙とペンがあれば、誰でも同じ札を作れてしまう
03

よその棚に、自分の鍵を置ける

もんだい

悪い人は、よその人の棚の番号を書いた札を自分で作る。その札を持って外の店へ行き、自分の鍵を許してもらう。

帰ってくると、店の人は札に書かれた番号を読んで、よその人の棚に 悪い人の鍵 を置いてしまう。

棚の持ち主から見ると、自分の棚に知らない鍵が入っている。以後その棚が持ってくるのは 悪い人のデータで、自分のデータはもう出てこない。

わるい人 7 にせの札 じぶんの鍵 7 番のたな たなの持ちぬし 知らない鍵が 入っている
札 1 枚で、他人の棚の中身を入れ替えられた
04

札から意味を消して、控えは店が持つ

なおした

札に書くのを、意味のないでたらめな長い番号に変えた。札を見ても棚は分からない。

「この番号は 7 番の棚」という控えは、店の中の帳面だけが持つ。帳面に書き込めるのは、棚の持ち主だと確かめてもらった人だけ。

これで、外から札を作っても帳面に載っていないので、店の人は「知らない番号です」と言って断れる。

9f3c…a70b 札(意味なし) 店の帳面 9f3c… → 7 b1d0… → 3 外からは見えない・書けない
札はただの番号札になり、意味は店の中に隠れた
05

札を切るのが、二つの動作だった

もんだい

札は 1 回きりのはずだった。だから店の人は、帳面を 読んで、それから 消す

けれど「読む」と「消す」は別々の動作だ。ふたりが まったく同じ瞬間に同じ番号を出すと、消される前に両方が読めてしまう。1 回きりの札が、2 回使えたことになる。

よむ けす このすきまが空いている ひとりめ ふたりめ
すきまが小さくても、ゼロではない
06

先に「私がもらった」と宣言する

なおした

順番を変えた。帳面を読む前に、「この番号は私がもらいます」と 1 回だけ書ける欄に名乗り出る。

この欄は、先に書いた人しか書けない。同時に来ても、書けるのは必ずひとり。書けなかった人はそこで引き返す。

「読んでから消す」ではなく「取ってから読む」。動作の順番を入れ替えただけで、すきまが消える。

1 人しか書けない欄 ひとりめ すすむ ひきかえす
同時に来ても、通れるのは必ずひとり
07

札は「誰に渡したか」を覚えていない

いま残っている

ここまでで、他人の棚を狙う攻撃は消えた。けれど向きを逆にした攻撃が残っている。

悪い人は、今度は正直に 自分の棚の札 をもらう。ちゃんと帳面に載った本物の札だ。そしてその札を、よその人に渡して言う。「これを持って、鍵を預けてきて」。

言われた人は、自分の鍵を許してもらって帰ってくる。店の人は札を読み、帳面のとおり 悪い人の棚 にその鍵を置く。

札は本物。帳面も正しい。誰が持ってきたかを、誰も見ていないだけ。

わるい人 本物の札 わたす よその人 じぶんの鍵 わるい人のたな
札が本物かどうかは見ていた。持ち主が同じ人かは見ていなかった
08

札を半分にちぎる

これから直す

直し方は、映画館のもぎりと同じ。札を 半分にちぎって、片方を出かける人のポケットに入れておく。

帰ってきたら、持ってきた札とポケットの半券が合うかを見る。合わなければ断る。

悪い人から札を渡された人のポケットには、合う半券が入っていない。ちぎってもらった覚えがないからだ。それで止まる。

半券はポケットの中にあり、外から取り出す道はない。同じ店に帰ってきたときだけ、そっと出てくる。

じぶんで始めた人 ぴったり合う → とおる 札をもらっただけの人 なし 半券がない → ことわる 札が本物かどうかではなく 出かけた人と帰った人が同じかを見る
見るものが「札の中身」から「持ち主が同じか」に変わる

たとえと、ほんとう

クロークの引換札認可フローの照合用トークン
札に書かれた棚の番号クライアントが組み立てた、署名のない値
でたらめな長い番号暗号論的乱数で作った不透明な値
店の中の帳面サーバ側の一時保存
1 人しか書けない欄アトミックな 1 回きりの確保
ポケットの半券ブラウザに置く短命の識別子
札を渡してこさせる逆向きのクロスサイトリクエストフォージェリ
棚に置く鍵外部サービスのアクセストークン

ひとことで言うと

札から意味を消して控えを店に隠した。取る動作を 1 回にまとめた。残っているのは、出かけた人と帰ってきた人が同じかを誰も見ていないこと。だから札を半分にちぎって、片方を持たせて出す。

3 つの問題は、どれも「札そのもの」の話ではなく 札の周りにある約束の話だった。偽造は札の中身を空にして直り、二重使用は動作の順番で直り、持ち主のすり替えは札の外に置いた半券で直る。