なぜGCPのサービス間認証ではprint-access-tokenではなくprint-identity-tokenなのか?
アクセストークン (Access Token)
形式: OAuth2 アクセストークン
誰が: Google API (Storage, Pub/Sub, BigQuery など) に対して使う
中身: 「この SA は GCP API を呼んでいいですよ」という 権限証明
特徴: リソースの「操作権限」を証明するトークン
発行元: accounts.google.com の OAuth2 エンドポイント
👉 だから、Cloud Storage API や Pub/Sub API を叩くときはこれで OK。
ID トークン (Identity Token)
形式: OIDC JWT (eyJhbGciOi... な JWT)
誰が: Cloud Run / Cloud Functions / API Gateway などの「ユーザーリクエストを受けるサービス」
中身: 「このリクエストを投げたのは誰か?」を表す 認証証明
特徴: aud (Audience) に「このサービス向けだよ」という対象が埋め込まれる
発行元: 同じく Google アカウントだが、OIDC として ID を保証
👉 Cloud Run の 認証付きエンドポイントは「呼び出し元が正規の ID か?」を確認するため、ID トークンを要求する。
(アクセストークンを渡しても「それは API 操作用の権限証明でしょ、ID がわからないから拒否する」となる → 401 Unauthorized)
参照