OAuth2、認可、認証とは？わかりやすく解説！OAuth2の仕組みとその流れを徹底理解

## はじめに

WebアプリケーションやAPI開発において、**認証**や**認可**は避けて通れない重要な概念です。特に、外部のサービスと連携する場合には**OAuth2**がよく使われます。しかし、「認証と認可の違いは何？」や「OAuth2の流れが複雑で分かりにくい」と感じる方も多いのではないでしょうか？

この記事では、**認証**と**認可**の違い、そして**OAuth2**が何を提供するのかを明確に解説し、OAuth2の流れを図解するような形で分かりやすく説明します。ぜひ、OAuth2の仕組みを理解して、Web開発に役立てましょう！

## 認証とは？

**認証**（Authentication）は、**ユーザーが誰であるかを確認するプロセス**です。たとえば、ログインフォームでユーザー名とパスワードを入力することで、そのユーザーが本当に本人であることを確認する作業が認証です。

### 認証の例
- ログイン時にユーザーIDとパスワードを入力する。
- 指紋認証や顔認証。
- APIキーやトークンを使ってAPIリクエストを行う。

## 認可とは？

**認可**（Authorization）は、**特定のユーザーがシステム上のリソースにアクセスする権限があるかどうかを確認するプロセス**です。認証によって「誰か」が確認された後、そのユーザーに特定のリソースに対するアクセス権限があるかをチェックします。

### 認可の例
- 管理者ユーザーだけが管理画面にアクセスできる。
- ユーザーが自分のプロフィール情報を編集できるが、他のユーザーの情報にはアクセスできない。

## OAuth2とは？

**OAuth2**は、**第三者のアプリケーションに対してユーザーのリソースにアクセスする権限を委譲するための認可プロトコル**です。ユーザーが第三者のアプリケーションに直接パスワードを渡すことなく、安全にアクセスを委任できる仕組みを提供します。

### OAuth2の利用シーン
- **Googleアカウントでログイン**して、他のアプリケーションにユーザーのGoogleプロフィールやGmailのデータを共有する。
- **Facebookアカウントでログイン**し、Facebookの写真や友達リストにアクセスする権限を他のアプリに与える。

OAuth2は、ユーザーの**認可（Authorization）**を行うためのプロトコルですが、後述の**OpenID Connect**を使うことで、認証もカバーできます。

## OAuth2の基本的な流れ

OAuth2の認可フローは、4つの主要な役割（登場人物）に基づいて動作します。

### OAuth2の登場人物
1. **リソースオーナー（Resource Owner）**: アクセスを許可するユーザー（例: 自分のGoogleドライブのファイルを第三者アプリに提供するユーザー）。
2. **クライアント（Client）**: リソースオーナーに代わって、リソースサーバーにアクセスするアプリケーション（例: アクセスを求めるサードパーティアプリ）。
3. **リソースサーバー（Resource Server）**: リソース（データ）を保管しているサーバー（例: Googleのサーバー）。
4. **認可サーバー（Authorization Server）**: 認可を管理し、トークンを発行するサーバー（例: GoogleのOAuth2認可システム）。

### OAuth2のフロー（認可コードフロー）

1. **認可リクエスト**
   - クライアント（サードパーティアプリ）は、ユーザーに対して認可サーバー（Google）への**認可リクエスト**を送る。ユーザーは認可リクエストを承認するかどうかを選択する。
   
   - 例: Googleアカウントでログインボタンをクリックすると、Googleの認可画面が表示され、アクセスを許可するか選べる。

2. **認可コードの発行**
   - ユーザーがアクセスを許可すると、認可サーバーはクライアントに**認可コード**を発行する。このコードは、クライアントがアクセストークンを取得するために必要なもの。

3. **アクセストークンの取得**
   - クライアントは認可コードを受け取り、認可サーバーに**アクセストークンのリクエスト**を行う。このリクエストには、クライアントID、認可コード、リダイレクトURL、クライアントの秘密鍵が含まれる。

4. **アクセストークンの発行**
   - 認可サーバーがリクエストを承認すると、クライアントに**アクセストークン**を発行する。このアクセストークンを使って、クライアントはリソースサーバー（GoogleのAPI）にアクセスできる。

5. **リソースへのアクセス**
   - クライアントは、リソースサーバーにアクセストークンを送り、リソースにアクセスする（例: Googleドライブのファイルリストを取得）。

---

## OAuth2の流れを図解

```mermaid
sequenceDiagram
    participant User as リソースオーナー（ユーザー）
    participant App as クライアント（アプリ）
    participant Auth as 認可サーバー
    participant Resource as リソースサーバー

    User->>App: 認可リクエスト
    App->>Auth: 認可コードのリクエスト
    Auth->>User: 認可画面（同意要求）
    User->>Auth: 認可（同意）
    Auth->>App: 認可コード発行
    App->>Auth: 認可コードを使ってアクセストークンリクエスト
    Auth->>App: アクセストークン発行
    App->>Resource: アクセストークンを使ってリソースアクセス
    Resource->>App: リソース提供（例: Googleドライブのファイルリスト）
```
## OAuth2の利点と課題
### 利点
- **パスワードを直接共有しない**: クライアントがユーザーのパスワードを保持する必要がなく、安全にアクセス権を付与できる。
- **アクセストークンで操作**: トークンに有効期限があるため、セキュリティが高くなる。
### 課題
- **実装の複雑さ**: OAuth2は実装が少し複雑で、特にトークンの管理やリフレッシュの扱いに注意が必要。
- **認証ではない**: OAuth2自体は認可のフレームワークであり、認証を行うものではない。認証が必要な場合はOpenID Connectのようなプロトコルを使用する。
## まとめ
- **認証**はユーザーが誰であるかを確認するプロセス。
- **認可**は特定のユーザーがリソースにアクセスする権限があるかを確認するプロセス。
- **OAuth2**は、第三者のアプリケーションにユーザーのリソースへのアクセス権限を委譲するための認可フレームワーク。


**OAuth2**は、Webアプリケーション開発において外部サービスと安全に連携するための基本的な仕組みです。**認証**や**認可**の違いを理解し、適切にOAuth2を活用することで、安全で効率的なアプリケーションを構築しましょう！