← eli5

AUTH TIME

押し直された
入館スタンプ

「いつ本人確認したか」を毎回書き換えていたら、もう一度確認する日は永遠に来ない。

15:00 12:00 9:00 押し直し
01

入るときに、一度だけ本人確認をする

大きな図書館があるとします。入口で受付の人に「あなたは本人ですね」と確認してもらう。これは 1 日 1 回だけ。

確認が終わると、手の甲にスタンプが押されます。書いてあるのは 確認した時刻。朝 9 時に来たなら「9:00」です。

このスタンプは「今が何時か」ではありません。「あなたが本人だと確かめたのは何時か」です。ここがこの話の全部です。

受付 本人確認 手の甲 9:00
スタンプに書くのは「確認した時刻」。一度押したら、それ以上動かないはずのもの。
02

中で使う通行証は、すぐ切れる

館内で本棚を開けるには通行証が必要です。ただしこの通行証は 1 時間で使えなくなる。落としたり盗まれたりしても被害が長引かないように、わざと短くしてあります。

そのかわり、受付まで戻って本人確認をやり直さなくていいように「取り替え券」も渡されます。切れた通行証は、取り替え券を出せば新しいものにしてもらえる。

だから 9 時に入った人は、10 時・11 時・12 時と、何度も通行証を取り替えながら一日を過ごします。

通行証 〜10:00 通行証 〜11:00 通行証 〜12:00 取り替え券 取り替え券 受付に戻らなくていい
通行証は短命。取り替え券があるから、受付での本人確認は朝の 1 回で足りる。
03

係の人が、スタンプも押し直していた

ここが不具合

取り替えのとき、係の人は新しい通行証を作ります。そして通行証には スタンプの写し も刷り込まれます。

ところが係の人は、そこに その場の時計を見て「いま」を刷っていた。10 時に取り替えれば「10:00」、15 時に取り替えれば「15:00」。

朝 9 時に確認したという事実が、取り替えのたびに上書きされていきます。

古い通行証 9:00 確認した時刻 新しい通行証 12:00 ← いまの時刻 壁の時計
参照先を間違えている。左のカードにも 9:00 が書いてあるのに、係の人は壁の時計を見ていた。
04

だから「もう一度確認」の日が来ない

実害

奥に貴重書コーナーがあります。ここには追加のルールがある — 本人確認から 3 時間以上たった人は、受付でもう一度確認してから入ってください。

係員はスタンプを見て「確認から何時間?」を計算します。ところがスタンプはいつも「たったいま」。経過時間はいつ計っても 0 分です。

朝 9 時に入った人が夕方まで館内にいても、3 時間の線を越えることが一度もない。再確認を求める仕組みが、丸ごと死んでいました。

9時 15時 経過 3 時間 = 再確認ライン ほんとうの経過 スタンプから計った経過 ● = 通行証を取り替えた瞬間。ここで 0 に戻る
取り替えごとにリセットされるので、赤い線は破線を一度も越えない。緑はもう越えている。
05

元の時刻は、実はもう書いてあった

おもしろいのはここです。取り替え券の には、ちゃんと「元の確認時刻 9:00」が書いてありました。

前の作業で、誰かがその欄を作り、書き込む処理も入れ、取り替えのときに次の券へ写す処理まで入れていた。欄の中身は、ずっと正しかった

抜けていたのは、通行証を刷るときにその欄を 読む ことだけ。係の人は、目の前のカードではなく壁の時計を見ていました。

取り替え券(裏) 9:00 元の確認時刻 ✓ 読まれない 刷る処理 壁の時計を見る 部品はどちらも動いている。つないでいないだけ。
データは正しく用意されていた。使う側の 1 行が入っていなかった。
06

直し方は「写す」だけ

修正

やったことは一つ。刷る処理に 壁の時計ではなく、手元の券の裏を見なさい と教えました。

これで何度取り替えても、通行証のスタンプは朝の 9:00 のまま。夕方 15 時に貴重書コーナーへ行けば、経過は 6 時間と計算され、ちゃんと受付へ戻されます。

変えた行
1 本体側
足したテスト
2
通ったテスト
7547 全件
券の裏 9:00 写す 新しい通行証 9:00 何度取り替えても、この数字は動かない
壁の時計をやめて、手元を見る。変えたのはこれだけ。
07

なぜ誰も気づかなかったのか

教訓

この館では、部品ごとに点検をしています。そして 点検はどれも合格していました

  • 券の裏に欄を作る処理 → 合格
  • 取り替えのとき次の券へ写す処理 → 合格
  • 通行証を刷る処理 → 合格

壊れていたのは部品ではなく 部品の間。「写された欄を、次に読む」という一本のつなぎ目だけ、誰も点検していなかった。

部品を全部○にしても、つなぎ目を見ていなければ製品は動かない。これが今回いちばん学びのある部分です。

欄を作る ✓ 合格 写す ✓ 合格 刷る ✓ 合格 ? ? 点検されていないのは、箱ではなく箱の間
部品の点検は全部○。抜けていたのは点線の 2 か所。
08

つなぎ目を縛るテストを足した

再発防止

足したテストは 2 本。1 本目は素直に「刷られたスタンプは朝の時刻か?」を見ます。

2 本目が本題です。取り替えを 2 回続けて 行い、しかも 2 回目に渡すのは 1 回目が実際に作った券そのもの。テストが用意した都合のいい券ではありません。

だから「写す側」と「読む側」が食い違えば、必ずこのテストが落ちます。実際に片方ずつ壊して確かめました — 読む側を壊すと 2 本とも落ち、写す側を壊すと 2 本目だけが落ちる。1 本目では見えない穴を、2 本目が見ている証拠です。

1 回目(12 時) 券 A 券 B 実際に 作られた券 これをそのまま次に渡す 2 回目(15 時) 券 B → スタンプは 9:00 のままか?
2 回目の入力を自前で作らないのが要点。作らせたものを食わせるから、つなぎ目が試される。
09

たとえと、ほんとう

入口での本人確認ログイン(認証)
手の甲のスタンプauth_time クレーム
1 時間で切れる通行証アクセストークン / ID トークン
取り替え券リフレッシュトークン
券の裏の「元の確認時刻」欄リフレッシュトークンに保存された認証時刻
貴重書コーナーの 3 時間ルールmax_age / 段階的な再認証
壁の時計を見ていた再発行時の現在時刻を書いていた
部品は全部合格していた単体テストは全て通っていた

ひとことで言うと

「いつ本人確認したか」は、確認したその時刻を持ち歩かないと意味がありません。取り替えのたびに今の時刻で押し直すと、記録は常に新品で、もう一度確認すべき時が永遠に来なくなる
直したのは 1 行。抜けていたのは部品ではなく、部品と部品のつなぎ目でした。

正しい値はすでに保存されていて、読む側の 1 行だけが入っていなかった、という形のバグです。前の作業が「保存する」までを出荷して「使う」を入れずに終わっていたため、その間ずっと記録は上書きされ続けていました。