구글 API 사용 시 에러 `API keys with referer restrictions cannot be used with this API.`를 해결하면서
- Tags:
- google api,
- error
배경
기존에 사용하던 Google API Key가 있었다. 해당 API Key는 클라이언트 사이드에서 사용되고 있었고, Key restrictions에서 Application restrictions을 설정해 놓았었다. 즉, 우리가 원하는 도메인, URL에서의 API 요청만 허용되는 것이다.
나는 이 Key를 서버사이드에서 사용하고 싶었다.
문제 발생
하지만 에러가 발생했다.
API keys with referer restrictions cannot be used with this API.
나는 처음에 이 에러를 보고 아하, 서버 사이드에서 이 API Key를 사용했으니까 Referer Header가 없었구나. 별도로 설정해주면 되겠다! 라고 생각했다.
Referer Header는 브라우저에서 설정해주는 것이니, 서버 사이드 호출은 따로 설정이 안 되는 것이다, 라고 이해했다(아닐 수도 있으니 검증이 필요하다).
하지만 fetch 호출에서 Referer header를 수동으로 설정해도 같은 에러가 발생했다.
문제 원인
사용자가 API 호출 시 수동으로 Referrer를 설정했다고 해도, 구글이 어떻게든 서버사이드에서 Application Restriction이 설정된 API Key를 사용했다는 것을 알아낸다고 한다. 그래서 계속 같은 에러 메시지가 나왔던 것이다. 어떻게 알 수 있었던 걸까? 그 질문은 뒤로 하고, 나는 어떻게든 해결 방법을 찾았어야 했다.
조건부 해결
Application Restriction이 없는 새로운 API Key를 만들어서 해결했다. 하지만 조건이 있다. 클라이언트 사이드에서 이 Key를 (당연히) 사용하면 안 된다. 서버 사이드에서만 Key를 사용해서 브라우저에 노출될 일이 없도록 하면 된다.
결론
개발자 도구 네트워크 탭에서 Google API를 요청할 때 상세를 보면 어떤 키를 사용했는지 다 나온다. 하지만 그렇다고 낯선 사람이 내가 사용하고 있는 Google API Key를 마음대로 사용할 수 있는 것은 아니다. 클라이언트 사이드에서 Google API Key가 노출되는 것은 막을 수 없기 때문에 Application Restriction이 나왔다. 클라이언트 작업 시 구글 API Key가 필요하다면 이렇게 제한을 걸면 된다.
하지만 같은 Key를 서버 사이드에서는 사용할 수 없다. 즉, 서버 사이드 API 호출을 위한 별도의 키를 만들줘야 한다. 용도 별로 Google API Key를 만들어 사용하는 것을 Google에서 강력하게 권장하고 있다는 느낌을 받았다.
By the way, Google은 어떤 신묘한 방법으로 서버 사이드 호출을 캐치하는 걸까?