【入門編】OIDCのUserInfoエンドポイントにおけるアクセストークンのスコープ検証 – アプリケーションセキュリティ & 安全な開発防御ガイド

ログインしたのに「別の人の情報」が見えてしまう?OIDCの落とし穴と「鍵の管理」の話

こんにちは!セキュリティの世界へようこそ。今日は、開発の現場で意外と見落とされがちな「UserInfoエンドポイントでのスコープ検証」についてお話しします。

「認証(ログイン)は通ったから安心!」と思っていませんか?実は、そこには泥棒がこっそり裏口を狙うような、小さな隙間が隠れているんです。専門用語を並べる前に、まずは身近な「家の鍵」に例えて考えてみましょう。

—

「合鍵」と「入れる場所」はちゃんと区別できていますか?

想像してください。あなたは高級マンションのオーナーだとします。
「このカードキーがあれば、マンションに入れますよ(認証)」と渡しました。これがアクセストークンです。

でも、このカードキーを持っていれば「全室の部屋の中」を覗けるべきでしょうか?もちろん違いますよね。
「このカードはエントランス用」「このカードは〇〇号室用」という制限、つまりスコープ(権限の範囲)が必要です。

UserInfoエンドポイントとは、いわば「マンションのコンシェルジュカウンター」です。「さっきエントランスを通ったカードを見せてください。あなたの名前や住所を教えますね」と情報を開示してくれる場所です。

ここで恐ろしいのは、「エントランスを通ったカード」さえ見せれば、コンシェルジュが誰に対しても「住人全員の個人情報」をペラペラ喋ってしまう状態です。これが、スコープ検証をサボった時に起こる「権限の不整合」なんです。

—

なぜ攻撃者はここを狙うのか?

攻撃者は「自分専用の正しいトークン」を一つ手に入れたら、そのトークンを使ってUserInfoエンドポイントを叩きまくります。

もしサーバー側が「ログインしているか」しか見ておらず、「このトークンに、この情報を表示する権限があるか(スコープチェック)」を確認していないと、攻撃者は他人のメールアドレスや電話番号を簡単に引き抜けてしまいます。これは、「泥棒が、自分の合鍵を使って隣の家の荷物を盗む」ようなものなのです。

—

実装で気をつけるべき「スコープ検証」の基本

では、どうやって防げばいいのでしょうか?答えは簡単です。「コンシェルジュ(UserInfoエンドポイント)に、毎回スコープを確認させる」のです。

例えば、以下のようなコードをイメージしてください。

// サーバー側でのUserInfo処理の例
app.get(‘/userinfo’, async (req, res) => {
// 1. まず、渡されたトークンが有効かチェック
const token = verifyToken(req.headers.authorization);
if (!token) return res.status(401).send(‘鍵が違います’);

// 2. 【ここが一番重要!】スコープの検証
// トークンの中に「profile(プロフィール閲覧権限)」が含まれているか確認
if (!token.scope.includes(‘profile’)) {
// 権限がないなら、たとえログインしていても情報は渡さない!
return res.status(403).send(‘その情報を閲覧する権限がありません’);
}

// 3. 全てクリアしたら情報を返す
const userInfo = await getUserData(token.sub);
res.json(userInfo);
});

この「2番」の処理、ついつい忘れがちですよね。「ログインしているんだから、少しくらい見せてもいいだろう」という油断が、セキュリティ事故の入り口になります。

—

一歩ずつ対策を学んでいきましょう!

現場で実装する際は、以下の3点を意識するだけでグッと強固になります。

  • 「最小権限の原則」を徹底する:ユーザーには「必要な情報」しか見せない。プロフィール情報が不要なら、そもそもprofileスコープを要求させないようにしましょう。
  • トークンの有効期限を短くする:もし万が一トークンが盗まれても、寿命が短ければ被害を最小限に抑えられます。
  • ログで異常なアクセスを監視する:特定のユーザーが、自分自身の情報ではないものにアクセスしようとして「403 Forbidden(権限なし)」を連発していないか、ログを眺めてみてください。それが攻撃の予兆かもしれません。

—

最後に

セキュリティは、完璧な壁を作ることではなく、「どこが壊れやすいかを知り、そこに補強を入れること」の繰り返しです。

最初は難しく感じるかもしれませんが、こうして「鍵と権限」の関係をイメージするだけで、あなたの書くコードはぐっと安全になります。一歩ずつ、一緒に学んでいきましょう!

もし、「自分の現場のコードは大丈夫かな?」と不安になったら、いつでもこの基本に立ち返ってくださいね。応援しています!

コメント

タイトルとURLをコピーしました