## What — 認証は「誰か」、認可は「していいか」の別々の検査
API サーバーはリクエストを2段階で検査する。
**認証(Authentication)**は「このリクエストの主は誰か」をトークンなどの証拠で確かめる工程。
**認可(Authorization)**は「確認できたその主に、この操作を許すか」を権限設定と照らして判定する工程。
順番は必ず認証→認可。誰か分からない相手の権限は調べようがない。
| | 答える問い | 落ちたときのコード | 直し方 |
| --- | --------- | --------- | --------------- |
| 認証 | お前は誰だ | 401 | トークンを付け直す・再発行する |
| 認可 | それをしていいのか | 403 | 権限やスコープを付与してもらう |
どちらで落ちたかは**ステータスコードで読み分ける**。判定するのは常にサーバー側で、クライアントは選べない。
## How — 具体のサービスでの置き場所
認証の証拠は**クライアントが毎回リクエストに載せる**もの、認可の権限は**サービス側に事前に登録されている**もの。
| サービス | 認証=毎回提示する証拠 | 認可=事前に登録された権限 |
| ---------- | ------------------------------- | ----------------------- |
| BigQuery | `gcloud auth login`・サービスアカウントキー | IAM ロール(データ閲覧者 など) |
| Slack API | Bot トークン(`xoxb-…`) | インストール時に承認した OAuth スコープ |
直す場所も分かれる。401 はコードやコマンド側、403 は管理画面の側の作業になる。
## 関連
- [[API]] — API まわりの地図
- [[認証トークンの3層]] — 認証の「証拠」を支える OAuth2 / JWT / Bearer の役割分担
- [[エラーレスポンス]] — 401/403 以外も含めたエラーの3段読み
- [[HTTPレスポンスの構造]] — ステータスコードが載っている場所