玄関の鍵をコピーさせない技術:OAuth 2.0とOIDCで学ぶ「安全なAPI認証」の極意
こんにちは。セキュリティの世界へようこそ。
システム開発をしていると、必ず耳にする「OAuth 2.0」や「OpenID Connect (OIDC)」。名前は聞いたことがあっても、「なんだか難しそう…」と避けてきた方も多いのではないでしょうか。
今日は、皆さんが毎日過ごす「家」の防犯を例にして、APIを守るための仕組みを紐解いていきましょう。難しい用語は一旦置いておいて、まずは「泥棒に合鍵を作らせない」という視点で考えてみます。
—
1. OAuth 2.0は「合鍵」を渡さないための仕組み
例えば、あなたが友人を自宅に招くとき、本物の家の鍵を渡しますか? 渡しませんよね。もしその鍵を友人が落としたり、悪い人にコピーされたら大変です。
ここで使うのが「一時的な通行証」です。
- OAuth 2.0:家の中には入れないけれど、「庭のゴミ出しだけしていいよ」というような、特定の場所・期間だけ有効な「許可証」を発行する仕組みです。
- OIDC:その通行証に「身分証明書」の機能をプラスして、「誰が来たのか」をはっきりさせる仕組みです。
APIの世界では、この「通行証」が「アクセストークン」と呼ばれます。
—
2. なぜ「認可コードフロー」が最強なのか?
昔は、ブラウザから直接「通行証(アクセストークン)」を受け取ることがありました。でもこれは、窓から通行証を投げ渡しているのと同じ。道行く人に盗まれるリスクがあります。
今の主流は「認可コードフロー」です。
1. 認可コードをもらう:まずは「通行証をもらうためのチケット(認可コード)」を受け取ります。
2. 本人が交換する:そのチケットを、サーバー同士の安全な通信(裏口)に持ち込み、「本物の通行証」と交換します。
こうすれば、外の世界(ブラウザ)に通行証を晒す必要がないので、格段に安全になるんです。
—
3. 「PKCE(ピクシー)」という最強の防犯カメラ
認可コードフローを使うとき、さらに「PKCE(Proof Key for Code Exchange)」という仕組みを必ず入れましょう。これは、「チケットを盗まれたとしても、犯人には通行証と交換させない」という仕組みです。
例えるなら、「合言葉」です。
1. チケットをもらう前に、自分で決めた「暗号の種」を隠しておきます。
2. チケットを交換するときに、「さっきの暗号の種はこれだよ」と証明します。
犯人は暗号の種を知らないので、たとえチケットを拾っても、通行証には交換できません。
実装のヒント(OAuth 2.0 パラメーター例)
クライアント側でリクエストを送る際は、以下のように設定します。
// PKCEのためのコード検証用文字列を作成
const codeVerifier = generateRandomString();
// それをハッシュ化して送る(これが暗号の種)
const codeChallenge = sha256(codeVerifier);
// 認可サーバーへのリクエスト例
const authUrl = `https://auth.example.com/authorize?` +
`response_type=code&` + // 認可コードフローを使います
`client_id=YOUR_CLIENT_ID&` +
`code_challenge=${codeChallenge}&` + // ここに暗号の種をセット
`code_challenge_method=S256`; // ハッシュ化方式を指定
—
4. 寿命を短くして、盗まれても被害を最小限に
どれだけ気をつけても、通行証が盗まれるリスクはゼロではありません。そこで重要なのが「アクセストークンの短寿命化」です。
- アクセストークン(通行証):寿命は短く(例:5分〜1時間)。すぐ期限切れになるので、もし盗まれても犯人はすぐに使えなくなります。
- リフレッシュトークン(更新券):これは大事に保管します。アクセストークンが切れたら、これを使って新しい通行証をもらいます。
もしリフレッシュトークンが盗まれたら? その時は、システム側でそのトークンを「無効化(ブラックリスト入り)」すれば、被害を最小限に抑えられます。
—
一歩ずつ対策を学んでいきましょう!
セキュリティは「完璧」を目指すと疲れてしまいます。しかし、「攻撃者がどこを狙うか」を知っていれば、今日からできる防犯対策はたくさんあります。
1. 認可コードフローを使う(ブラウザに直接トークンを置かない)
2. PKCEを必須にする(認可コードの横取りを防ぐ)
3. アクセストークンは短命にする(盗まれた時の被害を抑える)
まずはこの3つを意識するだけで、あなたのAPIの守りは格段に堅くなります。もし実装で迷ったら、いつでもこのページに戻ってきてくださいね。
開発者としての皆さんの手で、安全なインターネットの世界を一緒に作っていきましょう!

コメント