はじめに
先日、先輩がAPIの認証・認可について勉強会を開いてくれました。その復習も兼ねて、この記事では認証と認可の基本から、OAuthやAPIキーの仕組みまでを整理してみます。
認証と認可
認証
認証は「あなたは誰ですか?」を確認する仕組み
認証は、ユーザーやクライアントが本人であることを認証するプロセスです。これによって、APIやクライアントは「誰がアクセスしているのか」を確認できます。
例えば、以下のような認証があります。
- ユーザー認証:ユーザー名とパスワードを入力してログインする仕組み(一般的なログイン画面)
- クライアント認証:アプリケーションがAPIにアクセスする際に、クライアントIDとシークレットを使用して自分を証明する仕組み(OAuthでの認証)
認証の手法には以下の種類があります。
- パスワード認証:説明不要の一般的な認証方式
- 多要素認証:パスワードに加えて、生体認証を使用
- OAuth認証:トークンベースの認証方式で、ユーザーのパスワードを共有せずに認証を行う
- APIキー:アプリケーションごとに発行されるキーを利用
認可
認可は「あなたは何をしていいですか?」を確認する仕組み
認可は、認証されたユーザーやクライアントが特定のリソースや機能にアクセスする権限があるかを判断するプロセスです。
これからOAuthやAPIキーについての仕組みを理解していきます。まずはOAuthから見ていきます。
OAuth
OAuth(Open Authorization)とは、インターネット上で安全に認証や認可を行うためのプロトコルです。特に、他のサービスに自分のアカウントの情報を渡さずに、アプリケーションやサービス同士が連携できる仕組みを提供してくれます。
OAuthの目的
- ユーザーが自分のパスワードや機密情報を第三者(アプリ)に直接共有せず、安全に特定のリソースやサービスへのアクセスを許可すること
- 認証と認可を分離し、第三者に許可する範囲を限定できる
OAuthの仕組み
- クライアントがユーザーに対してアクセスをリクエスト
-
認可サーバーが認可コードを発行
認可サーバーは、ユーザーが許可を確認した後、一時的な認可コードをクライアントに返す。 -
クライアントがアクセストークンを要求
クライアントは認可サーバーに対し、認可コードを使ってアクセストークンを要求する。 -
アクセストークンが発行される
認可サーバーはリクエストを確認後、アクセストークンをクライアントに発行する。 -
クライアントがリソースサーバーにアクセス
クライアントはアクセストークンを使って、リソースサーバーにリソースへのアクセスを要求。リソースサーバーはアクセストークンを確認し、許可された範囲内でデータを提供する。
アクセストークンに含まれる情報
認可してもらったら、アクセストークンを使って認証を行うという流れになっていますが、アクセストークンにはどんな情報が含まれているのでしょうか?
アクセストークンに含まれている情報は以下の通りです:
- 発行者情報(issuer): 認可サーバーの情報
- 対象者情報(audience): このトークンが使用できるリソースサーバーの情報
- ユーザー情報(subject): トークンが紐づいているリソースオーナー(ユーザー)
- スコープ(scope): 許可された操作やリソースの範囲
- 有効期限(expiration): トークンの有効期限
- トークンID(jti): トークンの一意な識別子
スコープの具体例
例えば、Google APIを利用する場合、スコープを以下のように指定することでアクセス範囲を細かく制御できます:
-
https://www.googleapis.com/auth/drive.readonly
: Google Drive内のファイルを「読み取り専用」でアクセスする許可 -
https://www.googleapis.com/auth/calendar.events
: Googleカレンダーのイベントを管理する許可 -
https://www.googleapis.com/auth/userinfo.profile
: ユーザーの基本プロフィール情報へのアクセスを許可
アクセストークンにはスコープが含まれており、これによりクライアントがリソースサーバーにアクセスできる範囲を定義しています。
APIキー
APIキーはアプリケーションやユーザーを識別するために使用されます。リクエストヘッダーやURLに含まれており、シンプルで使いやすい分、ネットワーク上で盗まれるリスクがあり、セキュリティはOAuthより劣ります。
APIキーの構造
APIキーは通常、ランダムな英数字の文字列として生成されます。例えば以下のような形です:
123abc456def789ghi012jkl345mno678pqr
リクエストやクエリパラメータに含めて使用します。URLの一部としてAPIキーを送信する場合は以下のようになります:
https://api.example.com/v1/resource?api_key=123abc456def
APIキーの使用範囲を制限するために、IPアドレスやドメインで制限できます。これにより不正使用を防ぐことができます。
APIのダッシュボードやログを活用して、APIキーの使用状況を定期的に確認することも大事です。不審なトラフィックがあれば、APIキーを無効化して再発行することが推奨されます。また、使用期限や利用可能なAPIエンドポイントの制限を設定することで、セキュリティを向上させることができます。
APIリクエストを確認
開発者ツールでリクエストヘッダーを確認したところ、Authorizationヘッダーにアクセストークンが含まれていることがわかります。このように、アクセストークンを用いて認証・認可を実現します。
おわりに
APIの認証認可についての基礎を学びました。OAuthやAPIキーの仕組みはAPIを扱う際に必須の知識だと思うので、さらに理解を深め、実装できるようになりたいです。
最後までお読みいただきありがとうございました。
参考文献