OAuthの概要と仕組み

## OAuth 2.0の概要

OAuth 2.0は、インターネット上のサービス間で安全にリソースへのアクセス権を委譲するための業界標準の認可フレームワークである[^1]。

## OAuthの歴史

### 初期の開発

2006年、Blaine CookとChris Messinaによって、ユーザーが自分のデータを安全に共有できる新しい方法を模索する中でOAuthの開発が始まった[^2]。

### OAuth 1.0

2007年にOAuth 1.0が初めてリリースされた。このバージョンでは、ユーザーが自分のユーザー名とパスワードを直接共有する代わりに、トークンを使用して情報を共有できるようになり、データの安全性が大幅に向上した[^2]。

### OAuth 2.0

OAuth 2.0は、OAuth 1.0の後継バージョンとして開発された。OAuth 1.0で得られた経験を基に、さらなるユースケースや拡張性を考慮して策定されている[^3]。

## OAuth 2.0の特徴

- **認可フレームワーク**: ユーザーが自分のリソースへのアクセス許可を、サードパーティのアプリケーションに安全に委託できる[^1]
- **スコープ指定と最小特権の原則**: アクセス許可には範囲（スコープ）を設定でき、最小限の権限のみを付与できる[^1]
- **安全性**: ユーザーのログイン情報を直接共有せずに認証を行うため、より安全である[^1]
- **標準化されたプロトコル**: 多くのサービスで採用されている標準的なプロトコルである[^1]

## OAuth 2.0の仕組み

### 主要なエンティティ

1. **リソース所有者（Resource Owner）**: リソースへのアクセス権を持つエンティティ（通常はエンドユーザー）[^1][^4]
2. **クライアントアプリケーション（Client）**: リソースにアクセスするアプリケーション[^1][^4]
3. **リソースサーバー（Resource Server）**: クライアントからのリクエストを受け付け、保護されたリソースへのアクセスを許可するサーバー[^1]
4. **認可サーバー（Authorization Server）**: リソース所有者から認可を受け、クライアントにアクセストークンを発行するサーバー[^1][^4]

### 認可フロー

**1. Authorization Code Grant**

- 最も推奨される認可フロー。ウェブアプリやモバイルアプリに最適で、PKCEと組み合わせることでさらなるセキュリティ強化が可能[^11][^13]。
- Google、GitHub、Facebookなど、主要なAPIプロバイダーで標準的に採用[^11][^12]。

```mermaid
sequenceDiagram
    participant RO as リソース所有者
    participant C as クライアント
    participant AS as 認可サーバー
    participant RS as リソースサーバー

    C->>RO: 1. 認可要求
    RO->>AS: 2. 認可
    AS->>C: 3. 認可コード発行
    C->>AS: 4. 認可コードとクライアント認証情報を送信
    AS->>C: 5. アクセストークン発行
    C->>RS: 6. アクセストークンでリソース要求
    RS->>C: 7. リソース提供
```

**2. Implicit Grant（非推奨）**

- セキュリティリスクが高く、現在は非推奨。代わりにAuthorization Code Grant with PKCEの使用が強く推奨[^11][^12]。

```mermaid
sequenceDiagram
    participant RO as リソース所有者
    participant C as クライアント
    participant AS as 認可サーバー
    participant RS as リソースサーバー

    C->>RO: 1. 認可要求
    RO->>AS: 2. 認可
    AS->>C: 3. アクセストークン直接発行
    C->>RS: 4. アクセストークンでリソース要求
    RS->>C: 5. リソース提供
```

**3. Client Credentials Grant**

- サーバー間通信に特化したフロー。Slack、Twitter、Stripeなどのサービス間連携で広く採用[^11]。
- ユーザー認証が不要なバックエンドサービス間の連携に最適[^12]。

```mermaid
sequenceDiagram
    participant C as クライアント
    participant AS as 認可サーバー
    participant RS as リソースサーバー

    C->>AS: 1. クライアント認証情報を送信
    AS->>C: 2. アクセストークン発行
    C->>RS: 3. アクセストークンでリソース要求
    RS->>C: 4. リソース提供
```

**4. Password Grant（非推奨）**

- 最もセキュリティリスクが高く、OAuth 2.0の仕様で明確に非推奨とされている[^11][^12]。
- レガシーシステムの移行期間中のみ限定的に使用を検討[^12]。

```mermaid
sequenceDiagram
    participant RO as リソース所有者
    participant C as クライアント
    participant AS as 認可サーバー
    participant RS as リソースサーバー

    RO->>C: 1. ユーザー名とパスワードを提供
    C->>AS: 2. 認証情報を送信
    AS->>C: 3. アクセストークン発行
    C->>RS: 4. アクセストークンでリソース要求
    RS->>C: 5. リソース提供
```

## OAuth 1.0とOAuth 2.0の比較

OAuth 2.0は、OAuth 1.0と比較して以下のような改善が行われている：

- より多くのセキュリティ機能と柔軟性を提供[^11]
- アクセストークンの有効期限の設定が可能[^11]
- リフレッシュトークンの使用[^12]
- より詳細なアクセス制御[^2]

OAuth 2.0は、新規実装されるサービスでの使用が推奨されており、OAuth 1.0は既存サービスのサポートのためにのみ使用されることが想定されている[^3]。

## 参照
[^1] [^2] [^3] [^4] [^5] [^6] [^7] [^8] [^9] [^10] [^11] [^12] [^13]
[^1]: [https://apidog.com/jp/blog/oauth-2-guide/](https://apidog.com/jp/blog/oauth-2-guide/)
[^2]: [https://lab.wallarm.com/what/oauth-とは何ですか-この認証はどのように機能します/?lang=ja](https://lab.wallarm.com/what/oauth-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B-%^E3%81%93%E3%81%AE%E8%AA%8D%E8%A8%BC%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%BE%E3%81%99/?lang=ja)
[^3]: [https://openid-foundation-japan.github.io/rfc6749.ja.html](https://openid-foundation-japan.github.io/rfc6749.ja.html)
[^4]: [https://zenn.dev/crebo_tech/articles/article-0011-20241006](https://zenn.dev/crebo_tech/articles/article-0011-20241006)
[^5]: [https://www.weblio.jp/wkpja/content/OAuth_歴史](https://www.weblio.jp/wkpja/content/OAuth_%E6%AD%B4%E5%8F%B2)
[^6]: [https://auth0.com/jp/intro-to-iam/what-is-oauth-2](https://auth0.com/jp/intro-to-iam/what-is-oauth-2)
[^7]: [https://ja.wikipedia.org/wiki/OAuth](https://ja.wikipedia.org/wiki/OAuth)
[^8]: [https://techblog.asia-quest.jp/202410/what-is-oauth-2.0-authentication-and-authorization](https://techblog.asia-quest.jp/202410/what-is-oauth-2.0-authentication-and-authorization)
[^9]: [https://e-words.jp/w/OAuth.html](https://e-words.jp/w/OAuth.html)
[^10]: [https://openid-foundation-japan.github.io/rfc5849.ja.html](https://openid-foundation-japan.github.io/rfc5849.ja.html)
[^11]: [https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f](https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f)
[^12]: [https://zenn.dev/tanaka_takeru/articles/538aaa2fa9af8b](https://zenn.dev/tanaka_takeru/articles/538aaa2fa9af8b)
[^13]: [PKCEによるOAuth 2.0のセキュリティ強化](https://qiita.com/SHOT0/items/ee0e4be383e67c8ba7e8)