← eli5

OAUTH / OIDC

合鍵に、
名札はついていない

「開けていいよ」と「これは誰々です」は、別のことです。
ずっと前者だけを渡して、後者を推測していました。

SEALED
01

あなたの荷物は、預かり所にある

写真も、連絡先も、書きかけの文章も、あなたのものは預かり所にしまってあります。

そこへ別のお店がやってきて、「あなたの荷物をちょっと使わせてほしい」と言う。写真を印刷したい、連絡先に招待を送りたい。

あなた 預かり所 お店
荷物は預かり所にあり、お店はそれを直接は開けられない。
02

だから、合鍵を渡す

あなたのパスワードをお店に教えるのは、家の鍵をまるごと渡すようなものです。そうはしません。

代わりに預かり所が合鍵を作ります。開けられる棚は限られていて、期限もある。これが OAuth のやっていることです。

預かり所 写真の棚だけ 1 時間だけ お店
合鍵は「どの棚を、いつまで」を決めて渡される。パスワードは渡らない。
03 ここが問題

合鍵には、誰の鍵か書いていない

合鍵が言っているのは 「この棚を開けてよい」 だけです。誰の棚なのかは、どこにも書いてありません。

ところがお店がやりたいのは、たいていログインでした。「鍵を持っている=本人だろう」で済ませたくなる。

でも鍵は落ちていることもあれば、人から借りたものかもしれない。持っていることは、本人であることの証明になりません。

? 開けてよい 誰か ——
鍵は「開けてよい」としか言わない。名札の欄は空のまま。
04 ここが問題

だからみんな、中を覗いて推測した

誰の鍵か知りたいお店は、もらった鍵で棚を開けて、中の書類から名前を読むことにしました。

ところが預かり所ごとに、名前の置き場所も書き方も違う。預かり所の数だけ、読み方を書く羽目になりました。

そもそも、それでは足りない 棚を開けられたのは事実でも、いま目の前にいる人がその鍵をもらった本人だとは限りません。鍵を横取りした誰かでも、同じように開けられます。
05 こう直した

鍵に、名札を添えて渡す

OIDC がしたのは、預かり所の仕組みを作り直すことではありません。合鍵はそのまま、名札を一枚添えただけです。

名札には「この人を確かに確認しました」と書いてある。仕様の言葉では ID トークン

これで「開けてよい」と「これは誰々です」が、別々の紙に分かれました。

合鍵 + 名札
鍵は仕事のまま。誰かを言うのは、隣の名札の仕事。
06 こう直した

名札には、必ず 5 つ書いてある

推測が要らなくなったのは、名札の書式が決まっているからです。どの預かり所の名札でも、この 5 つは必ずあります。

名札に書いてあること仕様の名前
どこの預かり所が出したかiss
誰のことかsub
どのお店宛かaud
いつまで有効かexp
いつ出したかiat
「どのお店宛か」が効く 名札は宛名を持っています。よそ宛の名札を拾ってきて自分のところで使うことができません。合鍵にはなかった性質です。
07 こう直した

名札には、封がしてある

名札はただの紙ではなく、預かり所のがしてあります。仕様の言葉では署名です。

だからお店は、名札を受け取った時点で確かめられます。棚を開けに行く必要がありません。

途中で誰かが名前を書き換えれば、封が合わなくなって分かります。

封が合う 書き換えられた
封が合わない名札は、その場で捨てられる。
08

名札が欲しいときは、そう言う

合鍵だけが欲しい日もあります。だから名札は頼んだときだけ出ます。

頼み方は決まっていて、お願いの中に openid という一語を入れる。これが入っていなければ、預かり所は今まで通り合鍵だけを渡します。同じ窓口が、言い方ひとつで両方に使えます。

言わなかった
合鍵だけ棚を開ける許可。誰かは分からない
openid と言った
合鍵 + 名札許可に加えて、確かめられる身元
09

ほんとうは、こういう話でした

たとえほんとう
預かり所認可サーバ / リソースサーバ
お店クライアント(アプリ)
合鍵アクセストークン
開けてよい棚スコープ
名札ID トークン
名札の封JWS による署名
宛名aud クレーム
合鍵の仕組みOAuth 2.0
名札を足した約束OpenID Connect

ひとことで言うと

OAuth は「何をしてよいか」を渡す仕組みで、そこに「誰か」は入っていません。入っていないものを読み取ろうとしたから、みんなが違うやり方で推測することになりました。

OIDC は作り直したのではなく、足りなかった一言を、決まった形で載せられるようにしたものです。だから OAuth の上に乗ります。