노는게 제일 좋습니다.

Google Apps Script : CORS 및 '현재 파일을 열 수 없습니다' 본문

Google Apps Script : CORS 및 '현재 파일을 열 수 없습니다'

노는게 제일 좋습니다. 2021. 4. 17. 21:45

2021. 4. 25

post요청을 넣을 때 data가 stringify되지 않은 쌩 json인 케이스를 추가하였다.

 


문제상황

Access to XMLHttpRequest at 'https://script.google.com/macros/s/AKfycbxpWbwsIH8_(중략)_xv3uK3v/dev' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

xhr.js:177 GET https://script.google.com/macros/s/AKfycbxpWbwsIH8_(중략)_xv3uK3v/deV net::ERR_FAILED

createError.js:16 Uncaught (in promise) Error: Network Error
    at createError (createError.js:16)
    at XMLHttpRequest.handleError (xhr.js:84)

Google Apps Script(이하 GAS)를 웹 앱으로 배포했다.

Spread Sheet를 컨테이너로 갖는 프로젝트도 있고, Script 그 자체로만 존재하는 프로젝트도 있다. 둘 모두 동일한 증상이 나타났다.

 

이 때 권한은 아래와 같이 설정했다.

  • 실행 인증 : 나(소유자 본인)
  • 액세스 권한 : 모든 사용자(익명 포함)

이렇게 권한을 부여한 경우 누가 어떤 계정으로 로그인했든, 심지어는 로그인하지 않았어도 get/post 요청이 정상적으로 가능해야한다. 근데 잘 되던게 갑자기 안되기 시작했다.

웹앱 url을 웹브라우저에 직접 입력했을 때는 '현재 파일을 열 수 없습니다'라는 화면이 출력되고, js로 get/post 요청을 넣었을 때는 CORS+네트워크 오류가 뜬다.

 

원인

1. 구글 로그인 꼬임문제

GCP에서 버켓 CORS를 설정하니, 요청 헤더값에 무언가 동봉해주니 하는 문제가 아니다. 

로그인되어있는 구글 계정이 여러개이면 이런 문제가 발생한다.

 

2. 요청데이터 타입 문제

데이터를 문자열이 아닌 {a:11}와 같은 js데이터 타입을 보내는 경우에도 CORS에러가 발생한다.

 

해결

1. 구글 로그인 꼬임문제

  1). 계정 전부 로그아웃

  2-1). 모두 로그아웃된 그 상태로 스크립트 요청

  2-2). 또는, 어느 계정이든지 좋으니 '하나의 계정'만 로그인후 스크립트 요청

즉, 소유자를 포함한 여러 계정이 동시에 로그인 되어있지 않으면 해결.

 

2. 요청데이터 타입 문제

axios.post('https://wonj.in/', {a:11, b:22});

위와 같은 코드는 작동하지 않는다.

axios.post('https://wonj.in/', JSON.stringify({a:11, b:22}));

stringify하든 ' ' 따옴표를 붙이든 해서 데이터부분을 문자열로 만들어주어야 한다.

 

3. 결과

상당히 어이없게 잘 되는 것을 확인할 수 있다. 

Comments