APIに認証が必要な理由|トークンと認証の基本概念
APIに認証が必要なのは、誰でも呼べる状態にすると、ユーザー情報や社内データ、課金対象の機能まで無差別に使われるからです。公開してよい情報だけを返すAPIなら別ですが、実務で使うAPIの多くは、顧客データ、更新処理、外部サービス連携を抱えています。そこで「誰が」「どの権限で」アクセスしているかを確認する仕組みが必要になります。
もうひとつ大事なのは、認証は単なるログイン機能ではないことです。APIでは、ブラウザの画面がなくても、スマホアプリ、CLI、バックエンド、バッチ処理が同じ仕組みで安全に通信できる必要があります。そのために使われるのが、APIキー、セッション、アクセストークン、JWTといった仕組みです。
- 何ができる記事か: API認証の必要性、トークンの役割、認証と認可の違いを整理できます
- どんな場面で使うか: APIを呼ぶコードを書くとき、
401 Unauthorizedに詰まったとき、OAuthやJWTの説明を読む前の土台づくりに向いています - 対象読者: API連携をこれから扱う初心者から実務初級者
ここがポイント: API認証の目的は「鍵を付けること」だけではありません。利用者の特定、権限の制御、濫用の防止、監査のしやすさまで含めて支える仕組みです。
この記事の前提
この記事は、HTTPベースのWeb APIを前提にしています。コード例は curl で示します。内容は 2026年4月時点で、HTTPの認証枠組みを定義する RFC 9110、OAuth 2.0 の RFC 6749、Bearer Token の RFC 6750、JWT の RFC 7519、OWASP API Security Top 10 をもとに整理しています。
APIに認証が必要な理由
まず、認証がないAPIで何が起きるかを具体的に見ると、必要性がはっきりします。
1. 他人のデータを読めてしまう
たとえば /users/123/orders のようなAPIがあり、誰でも叩ける状態なら、IDを変えるだけで他人の注文履歴を読めるかもしれません。
これは「便利だから危険」ではなく、APIがデータへの直接入口になりやすいから危険です。画面ではボタンや導線で制御していても、API自体が無防備なら守れません。
2. 更新系APIは被害が大きい
POST /payments や PUT /account/email のようなAPIは、読むだけでなく状態を変えます。認証が弱いと、注文の作成、プロフィール改ざん、退会処理、権限変更まで不正に実行されるおそれがあります。
OWASP も API の主要リスクとして Broken Authentication を挙げており、トークンの検証不足や総当たり対策の弱さが、アカウント乗っ取りにつながると整理しています。
3. 利用制限と課金管理ができない
実務では、認証はセキュリティだけの話ではありません。
- どの顧客がどれだけAPIを使ったかを記録する
- 無料プランと有料プランで上限を分ける
- 問題のあるクライアントだけ停止する
- 監査ログで「誰がこの更新をしたか」を追えるようにする
認証がないと、この管理がほぼできません。運用面でも認証は必須です。
認証と認可は別もの
この2つは混同されがちですが、役割が違います。
認証: その相手は誰かを確認する
認証は、アクセスしてきた相手が正しい利用者か、正しいアプリかを確認することです。
例:
- メールアドレスとパスワードでログインする
- APIキーで利用中のアプリを識別する
- Bearer トークンでログイン済みユーザーを確認する
認可: その相手に何を許すかを決める
認可は、認証できた相手に対して、どこまで操作を許可するかを決めることです。
例:
- 一般ユーザーは自分の注文だけ読める
- 管理者だけが
DELETE /users/{id}を実行できる read:profileは許可するがwrite:billingは許可しない
「ログインできた」だけでは不十分です。APIでは、その後に権限チェックまで必要になります。
トークンとは何か
トークンは、認証や認可の結果をAPIに伝えるための「引換券」のようなものです。毎回IDとパスワードを送る代わりに、サーバーが発行した文字列を使ってアクセスします。
トークンを使う理由
毎回パスワードを送る方式には問題があります。
- 漏えい時の被害が大きい
- 権限の範囲を細かく絞りにくい
- 有効期限を短くして管理しづらい
- 外部アプリに本来のログイン情報を渡すことになりやすい
OAuth 2.0 は、この問題を避けるために、ユーザーの資格情報そのものではなく、範囲と期限を持つアクセストークンを使う設計を取っています。
よく出てくる用語の違い
APIキー
APIを呼ぶアプリや契約者を識別するための文字列です。シンプルですが、通常は「ユーザー本人のログイン確認」には向きません。
OWASP も、APIキーはAPIクライアントの認証に使うもので、ユーザー認証の代わりに使うべきではないと注意しています。
アクセストークン
APIへのアクセス権を表すトークンです。OAuth 2.0 では、ユーザーの許可を受けたうえで発行され、スコープや有効期限を持てます。
Bearerトークン
Authorization: Bearer <token> の形で送るトークンです。RFC 6750 では、その文字列を持っているだけで使えてしまう性質があるため、漏えい対策が重要だとされています。
JWT
JWTはトークンの「使い方」ではなく「形式」のひとつです。JSONベースの情報を署名付きで運べますが、JWTだから安全なのではなく、署名検証や期限チェックを正しく実装して初めて意味があります。
API認証の基本的な流れ
ここでは最小構成の流れを見ます。
1. 認証してトークンを受け取る
curl -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"email":"user@example.com","password":"secret"}'
レスポンス例:
{
"access_token": "eyJ...",
"token_type": "Bearer",
"expires_in": 3600
}
ここで受け取った access_token は、以後のAPI呼び出しに使います。
2. 保護されたAPIを呼ぶ
curl https://api.example.com/me \
-H "Authorization: Bearer eyJ..."
成功時のイメージ:
{
"id": 123,
"name": "Masa",
"plan": "pro"
}
失敗時は 401 Unauthorized が返り、トークン切れや未指定を示すことがあります。権限不足なら 403 Forbidden になることが一般的です。
3. サーバー側で確認していること
APIサーバーは、受け取ったトークンに対して少なくとも次を見ます。
- 署名や改ざんの有無
- 有効期限切れかどうか
- 発行元が正しいか
- 必要なスコープや権限を持っているか
- 失効済みでないか
この確認を省くと、「トークンを受け取っているのに守れていない」状態になります。
実務で多い使い分け
認証方式は1つではありません。何を守るAPIなのかで選び方が変わります。
自社内の簡単な連携なら APIキー
バッチ処理や社内ツールから限定的に呼ぶAPIなら、APIキーで十分なことがあります。ただし、権限の粒度や失効管理は弱くなりがちです。
向いている場面:
- サーバー間の簡易連携
- 利用者単位ではなくアプリ単位の識別
- まず利用制限をかけたい段階
ユーザー操作を伴う外部連携なら OAuth 2.0
「ユーザーの代わりに外部サービスへアクセスする」場合は OAuth 2.0 が定番です。パスワードを外部アプリに渡さずに済み、権限範囲も絞れます。
向いている場面:
- Google API や Microsoft Graph のような外部API連携
- 「このアプリにカレンダー読み取りだけ許可する」といった制御
- 複数クライアントからの安全な委譲
ブラウザ中心の自社サービスならセッションCookie
同一サイト内で使うWebアプリでは、サーバーセッションとCookieの組み合わせが扱いやすいこともあります。APIだから必ずトークン、とは限りません。
よくある失敗と改善例
認証まわりは、概念を知っていても実装で崩れやすい部分です。
NG1: トークンをURLに付ける
悪い例:
https://api.example.com/orders?token=abc123
URLはログ、履歴、リファラに残りやすく、安全ではありません。OWASP も認証情報をURLに含める実装を問題として挙げています。
改善:
Authorizationヘッダーで送る- HTTPS を必須にする
NG2: JWTの中身を読んで満足する
JWTはBase64URLで読めるため、「デコードできたから正しい」と誤解されがちです。実際には署名検証が必要です。
改善:
- 署名アルゴリズムを固定する
exp、iss、audなど必要なクレームを検証する- ライブラリ任せでも検証設定を明示する
NG3: APIキーをフロントエンドに埋め込む
JavaScriptに直書きしたキーは、ブラウザの開発者ツールから見えてしまいます。
改善:
- 秘密情報はサーバー側や安全なシークレット管理に置く
- フロントエンドから直接呼ばず、自社バックエンドを経由する
NG4: 権限チェックを省く
ログイン済みなら他人のデータも見える、という状態は珍しくありません。これは認証ではなく認可の漏れです。
改善:
- ユーザーIDと対象データの所有関係を毎回確認する
- 管理者APIは別スコープ、別ロールで分離する
初心者が押さえたい最小ルール
迷ったら、まずこの5点を守るだけでも事故を減らせます。
- パスワードやトークンは URL ではなくヘッダーや安全なCookieで送る
- 通信は HTTPS 前提にする
- トークンには有効期限を持たせる
- 401 と 403 を分けて扱う
- APIキー、アクセストークン、JWTを同じものだと思わない
代替手段と使い分け
最後に、現場で迷いやすい組み合わせを短く整理します。
- APIキー: 導入は簡単。アプリ単位の識別向き。ユーザー権限の表現は弱い
- セッションCookie: 同一Webアプリでは扱いやすい。ブラウザ中心の構成向き
- Bearerアクセストークン: API連携で広く使える。漏えい時の扱いを厳密にする必要がある
- JWT: ステートレスに扱いやすいが、失効設計やサイズ、検証実装に注意が必要
- OAuth 2.0: 外部連携や権限委譲に強い。概念は増えるが、パスワードを直接預からずに済む
「何が一番優れているか」ではなく、誰を認証したいのか、どこでトークンを保管するのか、どこまで権限を絞りたいのかで選ぶのが実務的です。
まとめ
APIに認証が必要なのは、データと処理を守るためだけではありません。利用者の特定、権限の制御、課金や監査、外部連携の安全性まで含めて、運用全体を支えるためです。
次にAPIドキュメントを見るときは、まずこの順番で確認すると理解しやすくなります。
- 何で認証するのか: APIキー、セッション、OAuth 2.0
- 何を送るのか:
Authorizationヘッダーか、Cookieか - 何を検証するのか: 期限、署名、スコープ、権限
- 失敗時に何が返るのか:
401か403か
この4点が読めるようになると、認証付きAPIの仕様書をかなり追いやすくなります。
