【保存版】GitHubアクセストークン全種別解説: Personal Access Token、OAuth、GitHub App、GITHUB_TOKENの違い

GitHubを使用する開発者にとって、アクセストークンの理解は非常に重要です。本記事では、GitHubの各種アクセストークンについての概要、その特徴や使用方法、有効期限、セキュリティ上の注意点などを簡単にまとめています。



## アクセストークンの種類

GitHubには以下の種類のアクセストークンがあります：

1. Personal Access Token (Classic)
2. Fine-grained Personal Access Token
3. OAuth Access Token
4. GitHub App User Access Token
5. GitHub App Installation Access Token
6. GitHub App Refresh Token
7. GITHUB_TOKEN (GitHub Actions用)

## 各トークンの詳細

### 1. Personal Access Token (Classic)

- 接頭辞: `ghp_`
- 用途: ユーザーアカウントに紐づいたトークンで、トークンを発行したユーザーとして認証可能。
- 特徴:
  - 広範なスコープを持つことができる
  - 特定のリポジトリに制限することは不可
- 有効期限:
  - 作成時に設定可能
  - デフォルトは30日間
  - カスタムの日付を入力して延長可能
  - 無期限に設定することも可能
- セキュリティ:
  - 過去1年間使用されていないトークンは自動的に削除される

### 2. Fine-grained Personal Access Token

- 接頭辞: `github_pat_`
- 用途: より細かい権限設定が可能なトークン
- 特徴:
  - 特定のリポジトリやリソースに対するアクセスを制限可能
  - セキュリティが強化されている
- 有効期限:
  - 最大で1年間
  - トークン生成時に「Expiration」フィールドで設定必須
- 注意点:
  - `package:read` などClassicでは付与できる権限が付与できない
      - https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-container-registry#container-registry%E3%81%A7%E3%81%AE%E8%AA%8D%E8%A8%BC

### 3. OAuth Access Token

- 接頭辞: `gho_`
- 用途: OAuthアプリケーションによって生成されるトークンで、ユーザーの代わりにAPIアクセスを行うために使用される
- 有効期限:
  - 有効期限なし（ユーザーが無効化しない限り）
- 特徴:
  - ユーザーが明示的に取り消さない限り、期間に制限なく使用可能
- セキュリティ:
  - 1年間使用されていないトークンは自動的に取り消される

### 4. GitHub App User Access Token (User-to-Server Token)

- 接頭辞: `ghu_`
- 用途: 
  - GitHub Appがユーザーに代わって認証するために使用
  - 特定のユーザーアクションを実行するために利用
  - ユーザーアカウントに紐づいており、ユーザーとして操作を行うために使用
- 有効期限:
  - デフォルトで8時間後に期限切れ
  - 更新トークンで再作成が可能
- 特徴:
  - オプションで無期限に設定することも可能（セキュリティ上の理由から非推奨）

### 5. GitHub App Installation Access Token (Server-to-Server Token)

- 接頭辞: `ghs_`
- 用途: GitHub Appがインストールされたリポジトリや組織に対して操作を行うために使用
- 有効期限: 1時間
- 特徴:
	- ユーザーとしてではなくアプリと振る舞う
	- このトークンでコメントやコミットなどを行うと、GitHubユーザーはアプリケーション名で表示される

### 6. GitHub App Refresh Token

- 接頭辞: `ghr_`
- 用途: ユーザーアクセストークンを更新するために使用
- 有効期限: 6か月後に期限切れ

### 7. GITHUB_TOKEN (GitHub Actions用)

- GitHub Actionsワークフロー内で自動的に生成されるトークン
- 特徴:
  - ワークフロー内でのみ有効
  - 外部リソースへのアクセスには使用不可
  - リポジトリに限定されたスコープを持つ
- 権限:
  - デフォルトではリポジトリの内容に対する読み取りおよび書き込み権限を持つ
  - ワークフローファイル内で明示的に権限を設定可能

## トークン比較表

| 種別名 | 接頭辞 | 有効期限 | 主な用途 | 特徴 | セキュリティ考慮事項 |
|--------|--------|----------|----------|------|----------------------|
| Personal Access Token (Classic) | ghp_ | 設定可能・無期限可 | ユーザーとしての認証 | 広範なスコープ、特定リポジトリに制限不可 | 1年間未使用で自動削除 |
| Fine-grained Personal Access Token | github_pat_ | 最大1年 | 細かい権限設定が必要な場合 | 特定リポジトリ/リソースに制限可能 | Classicより推奨されている |
| OAuth Access Token | gho_ | 無期 | OAuthアプリのAPIアクセス | 更新トークンなし、ユーザーが取り消すまで有効 | 1年間未使用で自動取り消し |
| GitHub App User Access Token | ghu_ | 8時間・無期限可 | GitHub Appのユーザー認証 | 更新トークンあり（6ヶ月有効） | 無期限設定可能だが非推奨 |
| GitHub App Installation Access Token | ghs_ | 1時間 | GitHub Appのリポジトリ/組織操作 | 有効期限が最も短い |  |
| GitHub App Refresh Token | ghr_ | 6ヶ月 | ユーザーアクセストークンの更新 | 認証ではなくトークンの更新のためだけに使用 |  |
| GITHUB_TOKEN | なし | ワークフロー実行中のみ | GitHub Actions内での認証 | 自動生成、ワークフロー内でのみ有効 | リポジトリに限定されたスコープ |

## セキュリティ上の注意点

1. **パブリックリポジトリへのプッシュに注意**:
   - 有効なトークンがパブリックリポジトリまたはパブリックgistにプッシュされると、そのトークンは自動的に取り消されます。

2. **トークンの過剰発行に注意**:
   - ユーザー/アプリケーション/スコープの組み合わせごとに10トークンまでの制限があります。
   - 1時間あたり10トークンの作成制限があります。
   - 制限を超えると、同じ組み合わせの最古のトークンが取り消されるか、再認証プロンプトが表示されます。

3. **定期的なトークンのレビューと取り消し**:
   - 不要になったトークンは速やかに取り消しましょう。
   - アカウント設定からGitHub AppまたはOAuth appの認証を取り消すと、関連するすべてのトークンが取り消されます。

4. **最小権限の原則を適用**:
   - 特に Fine-grained Personal Access Token を使用する際は、必要最小限の権限のみを付与しましょう。

5. **有効期限の設定**:
   - 可能な限り、短い有効期限を設定しましょう。長期間有効なトークンは、セキュリティリスクが高くなります。