【入門編】 OAuth 2.0の認可コードフロー(Authorization Code Flow)のシーケンスと役割 – Web APIアーキテクチャ・データ連携実践ガイド

こんにちは!ネットワークプロトコルスペシャリストの私です。

インフラやネットワークの世界に足を踏み入れたばかりの頃って、次から次へと専門用語が出てきて「うっ……頭が……」ってなりますよね。特にWeb APIやセキュリティの分野は、アルファベットの略語が多くて壁が高く感じられがちです。

今回は、現代のWebサービス連携にはなくてはならない「OAuth 2.0 認可コードフロー(Authorization Code Flow)」について、現実世界の身近な仕組みに例えながら、一歩ずつ丁寧に紐解いていきたいと思います。

難しいパケットの解析はひとまず置いておいて、まずは「データのやり取りが裏側でどう行われているのか」を一緒にイメージしていきましょう!

—

1. なぜ「OAuth 2.0 認可コードフロー」が必要なの?

皆さんは普段、スマホのアプリや新しいWebサービスにログインするとき、「Googleアカウントでログイン」や「GitHubアカウントで連携」といったボタンを見かけることはありませんか? あれの裏側で動いているのが OAuth 2.0 です。

ここで、こんな疑問が湧きませんか?
「自分の大切なメールや写真を見せるために、サービス側にGoogleのパスワードをそのまま教えてもいいの?」……ダメですよね!そんなことをしたら、連携したアプリの運営会社にパスワードが丸見えになってしまいます。

そこで登場するのが、「パスワードを教えずに、一時的な『合い鍵』だけを渡す仕組み」であるOAuth 2.0です。

身近な例え:ホテルの「ICカードキー」

想像してみてください。あなたは高級ホテルのオーナー(リソースサーバー)で、自分の部屋に大好きな写真やデータ(リソース)を保管しています。

そこに、信頼できるお掃除ロボットの会社(クライアントアプリ)がやってきました。「お部屋のお掃除をしたいので、中に入れてください」と。
しかし、あなたの大事なマスターキー(Googleのパスワード)をそのままロボット会社に渡すわけにはいきませんよね。

そこでホテルのフロント係(認可サーバー)にお願いします。
「このロボット会社に、今日のお掃除の間だけ使える『一時的なICカードキー(アクセストークン)』を発行してあげて!」

これが、OAuth 2.0が目指す世界観です。パスワードを渡さずに、権限だけを安全に委譲(Delegate)するのです。

—

2. 登場人物を確認しよう

認可コードフローには、主に3者のプレイヤーが登場します。ここをしっかり押さえておけば、複雑なシーケンスも怖くありません!

1. リソースオーナー(Resource Owner)

  • あなた(ユーザー)のことです。データや写真の持ち主です。

2. クライアント(Client)

  • あなたが使いたいアプリやWebサービス(例:カレンダー連携アプリなど)。

3. 認可サーバー & リソースサーバー(Authorization & Resource Server)

  • GoogleやGitHubなどのプラットフォーム側。ユーザーの認証を行い、正しい相手にだけ鍵を発行(認可サーバー)し、実際のデータを提供する(リソースサーバー)場所です。

—

3. 郵便配達で例える「認可コードフロー」の全貌

それでは、この3者が裏側でどのように手紙や荷物をやり取りしているのか、郵便配達の流れに例えてシーケンスを追ってみましょう。

ステップ1:アプリが「あなた」を認可サーバーへ連れていく

あなたがアプリ(クライアント)の「Googleでログイン」ボタンを押すと、アプリはあなたを直接Googleのログイン画面(認可サーバー)へ誘導します。
このとき、アプリは「このユーザーのスケジュールを見る権限(スコープ)をください!」というリクエストをこっそり持っています。

ステップ2:あなたがログインし、「許可」を与える

Googleの画面で、あなたは自分のIDとパスワードを入力してログインします。すると、「◯◯アプリがあなたのカレンダーへのアクセスを求めています。許可しますか?」という確認画面が出ますよね。
ここであなたが「許可」のボタンを押すと、認可サーバーは「認可コード(Authorization Code)」という、いわば「引き換え券」を発行し、あなたのブラウザ経由でアプリに渡します。

ステップ3:アプリが「引き換え券」を「アクセストークン」に交換する

ここがこのフローのミソです!
アプリは受け取った「引き換え券(認可コード)」をそのまま持って、もう一度裏側でこっそり認可サーバーのところへ行きます。
「さっきお客さんからこの引き換え券をもらったので、正式な『アクセストークン(ICカードキー)』をください!」
認可サーバーは引き換え券が本物かを確認し、問題なければ本物の「アクセストークン」をアプリに渡します。

ステップ4:アクセストークンを使ってデータをゲットする

ついにアプリは、手に入れたアクセストークンをポケットに入れてリソースサーバー(Googleのデータ保管庫)に行きます。「このキーを持っています!カレンダーのデータを見せてください!」
リソースサーバーは「お、本物のキーですねどうぞ!」とデータを見せてくれます。これで連携完了です!

—

4. 実務で役立つ!パラメータとコードの裏側

「なるほど、仕組みはわかったけれど、実際のコードやHTTPリクエストはどうなっているの?」という方のために、ステップ3の「認可コードをアクセストークンに交換する瞬間」の裏側を少しだけ覗いてみましょう。

アプリのバックエンドサーバー(PHPやPythonなど)から、認可サーバーに対して以下のようなPOSTリクエスト(HTTP通信)を投げます。

POST /oauth/token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&client_id=your_client_id_12345
&client_secret=your_super_secret_key
&code=g0_auth_code_abcdef123456
&redirect_uri=https://app.example.com/callback

パラメータの意味を優しく解説!

  • grant_type=authorization_code
  • 「いまから認可コードを使ってトークンをもらいに来ましたよ」という宣言です。
  • client_id / client_secret
  • アプリ自身の「身分証明書」と「合言葉(パスワード)」です。アプリが不正な偽物ではないことを証明します。
  • code
  • ステップ2で受け取った、あの「引き換え券(認可コード)」です。
  • redirect_uri
  • 不正な宛先にコードが盗まれていないかを確認するための、あらかじめ登録された折り返し先のURLです。

このリクエストが成功すると、認可サーバーからは以下のようなJSONデータが返ってきます。

{
  "access_token": "ya29.a0AfH6SMB...(これが実際のアクセストークン)",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "1//04_refresh_token_xyz..."
}

ここで注目してほしいのが、expires_in: 3600(1時間で有効期限が切れる)と、refresh_tokenの存在です!

—

5. リフレッシュトークンで「再ログインの地獄」を防ぐ

アクセストークンには、セキュリティの観点から短い有効期限(例えば1時間など)が設定されています。
もし期限が切れるたびに、ユーザーが何度も「Googleでログイン」の画面を出されたらどうでしょう? めちゃくちゃ面倒くさいですよね。

そこで登場するのが「リフレッシュトークン(Refresh Token)」です。

身近な例え:ホテルの「長期滞在パス」

アクセストークンが「今日1日だけ有効な使い捨ての鍵」だとすれば、リフレッシュトークンは「フロントで身分証を見せれば、いつでも新しい鍵を発行してもらえる特別な引き換え証(ただし長期間有効)」です。

1. アクセストークンの有効期限が切れる。
2. アプリはユーザーを画面に登場させることなく、裏側でリフレッシュトークンを認可サーバーにこっそり提示する。
3. 認可サーバーは「よし、リフレッシュトークンは有効ですね」と、新しいアクセストークンを静かに発行する。

この仕組みのおかげで、ユーザーは一度ログインすれば、バックグラウンドでシームレスにアプリを使い続けることができるのです。

—

まとめ

今回は、OAuth 2.0 認可コードフローのシーケンスと、アクセストークン・リフレッシュトークンの役割について解説しました。

  • 認可コードフローは、パスワードを直接アプリに教えず、安全に「一時的な鍵」を受け渡すための仕組み。
  • ユーザーの操作で「認可コード(引き換え券)」を手に入れ、それをバックエンドで「アクセストークン(本物の鍵)」に交換する。
  • 期限切れ対策には「リフレッシュトークン」を使い、ユーザーの手間を減らしつつセキュリティを担保する。

最初は難しく見えるプロトコルも、現実世界のやり取りに置き換えてみると、設計者たちの「どうすれば安全かつ便利にデータをやり取りできるか」という工夫や優しさが伝わってきますよね。

インフラやネットワークの世界は、こうした「ルールの積み重ね」でできています。一つひとつ紐解いていけば必ず理解できますので、焦らず一歩ずつ進んでいきましょう!

それでは、また次回の深淵でお会いしましょう!

コメント

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