Google Spreadsheet JWT 403 PERMISSION_DENIED 오류 해결기
Autowini 프로젝트에서 Node.js로 구글 스프레드시트 다국어 데이터를 가져오던 중, PERMISSION_DENIED 오류가 발생했습니다.
json
{
"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로 업그레이드하여 문제를 해결했습니다.
bash
# pnpm
pnpm add google-spreadsheet@^5.0.2업그레이드 후, JWT 인증 방식으로 스프레드시트에 접근하니 정상적으로 데이터 로딩이 가능했습니다.
js
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), 저도 해당 이슈에 댓글을 남겼습니다.
- #403
- #Google Spreadsheet JWT
- #PERMISSION_DENIED