OAuthとアクセストークン

技術の仕組み | 認可の仕組み

← 技術の仕組み

OAuthは、パスワードを渡さずに「あるサービスの自分のデータを、別のアプリに必要な範囲だけ使わせる」仕組みです。カギになるのがアクセストークン範囲と期限が限られた合鍵。パスワードという“親鍵”を渡す代わりに、限定された合鍵だけを渡すので、漏れても被害が限られます。

先に押さえる(登場人物)

利用者(データの持ち主)/使いたいアプリ(=クライアント。あなたのデータを使いたい側)/資源を持つサービス(データの置き場)/認可サーバ(合鍵=トークンを発行する窓口)。ポイントは、アプリは利用者のパスワードを一度も受け取らないことです。

合鍵(トークン)が渡るまでの流れ

1利用者が「このアプリに許可」と認可サーバへ同意
利用者+使いたいアプリ
認可サーバでログイン&同意 → 認可コード(引換券)を受け取る
認可サーバ合鍵の発行窓口
2アプリが引換券をトークンに交換
使いたいアプリ
認可コードを送る
認可サーバアクセストークンを発行
アクセストークン(範囲=scope・期限つき)
3トークンでデータにアクセス
使いたいアプリ
アクセストークンを添えてAPI呼び出し
資源を持つサービストークンの範囲だけ許可

「同意 → 引換券(認可コード) → 合鍵(トークン) → 範囲内で利用」。パスワードは認可サーバにしか渡らず、アプリが手にするのは限定された合鍵だけです。

動きで見る

番号順に追うと、同意 → 引換券(認可コード) → 合鍵(アクセストークン) → 範囲内で利用の流れが見えます。パスワードは認可サーバにしか渡りません(図は横スクロールできます)

なぜトークンなら安全側なのか

見抜きどころ

アクセストークンは範囲(scope)と期限が限られた合鍵です。だからパスワード共有と違い、漏れても「その範囲・その期限まで」しか悪用できない。設問では「なぜパスワードを渡さずに済むか/トークンが漏れたときの影響範囲/有効期限で被害をどう抑えるか」が問われます。親鍵(パスワード)と合鍵(トークン)の違いを軸に読むと答えが決まります。

つまずきやすい

認証(=あなたが誰か)と認可(=何を許すか)は別物です。OAuthは元々認可の仕組み。「本人確認そのもの」を上に載せたい場合は、その上の層(IDトークンを扱う仕組み)を足します。「誰か」を確かめたいのか「何を許す」のかを取り違えないのが急所です。

横取りを防ぐ小さな工夫

引換券(認可コード)やトークンを途中で奪われないよう、次のような手当てが問われます。

引換券の横取り対策

  • アプリ本人だけが交換できる合言葉を後から突き合わせる
  • 横取りした認可コードだけではトークンに換えられない

使い回し・なりすまし対策

  • 1回限りの値で応答の紐づけを確認
  • 期限切れは更新用トークンで取り直す(合鍵を短命に)

つながる仕組み

似た発想→ Kerberosとチケット(合鍵で範囲を限る) 土台→ 署名(トークンの正しさを検証)

この仕組みを使う設問