지식 정리 📝

Google Spreadsheet JWT 403 PERMISSION_DENIED 오류 해결기

엄성준 2025. 8. 20. 20:00
728x90

Autowini 프로젝트에서 Node.js로 구글 스프레드시트 다국어 데이터를 가져오던 중, PERMISSION_DENIED 오류가 발생했습니다.

{
  "code": 403,
  "message": "Method doesn't allow unregistered callers (callers without established identity). Please use API Key or other form of API consumer identity to call this API.",
  "status": "PERMISSION_DENIED"
}

🔍 원인 확인 과정

처음에는 스프레드시트 공유 설정과 IAM 서비스 계정 키를 재발급하며 문제를 해결하려 했습니다.

  • 구글 스프레드시트에서 서비스 계정 이메일 편집자 권한 부여
  • Google Cloud Console IAM에서 서비스 계정 키 재발급

하지만, 위 방법만으로는 오류가 계속 발생했습니다.

 

❗️ 문제 원인

google-spreadsheet 패키지 ^4.1.4 버전에서는 JWT 인증 시 일부 호출에서 권한 없는 호출자(403 Error)로 인식되는 문제가 있었습니다.
즉, IAM이나 스프레드시트 권한 설정을 아무리 변경해도 패키지 버전 자체에서 인증 처리 방식이 완전히 지원되지 않아 오류가 발생한 것이었습니다.

 

✅ 해결 방법

google-spreadsheet 패키지를 ^5.0.2로 업그레이드하여 문제를 해결했습니다.

# pnpm
pnpm add google-spreadsheet@^5.0.2

 

업그레이드 후, JWT 인증 방식으로 스프레드시트에 접근하니 정상적으로 데이터 로딩이 가능했습니다.

import { GoogleSpreadsheet } from 'google-spreadsheet';
import { JWT } from 'google-auth-library';
import { credentials } from './credentials.js';

const doc = new GoogleSpreadsheet(SPREADSHEET_DOC_ID);
await doc.useServiceAccountAuth(new JWT({
  email: credentials.client_email,
  key: credentials.private_key,
  scopes: ['https://www.googleapis.com/auth/spreadsheets'],
}));
await doc.loadInfo();

💡 느낀 점

  • 같은 오류를 겪는 경우, 패키지 버전 문제를 먼저 확인하는 것이 빠른 해결 방법이 될 수 있다고 느꼈습니다.
  • 실제로 GitHub에서도 동일한 문제를 겪은 사람이 있었고 (이슈 #723), 저도 해당 이슈에 댓글을 남겼습니다.