회고 · OAuth · Google Cloud

공부 플래너 앱의 Google Calendar API 권한 심사 좌충우돌기

박찬빈

구글 캘린더를 붙인 이유

하루치는 시험까지 남은 공부를 하루 몫으로 나눠 주는 플래너다. 시험 날짜와 공부 범위를 넣으면 날마다 할 만큼을 정해 주고, 약속이 생기면 그날 공부를 줄여 남은 날에 다시 나눈다. 그런데 그 약속은 이미 구글 캘린더에 다 적혀 있었다. 같은 일정을 두 군데에 적고 싶지는 않았다. 그래서 구글 캘린더 일정을 가져와서, 일정이 있는 시간만큼 그날 공부 시간을 알아서 줄이기로 했다. 문제는 권한이었다. 남의 캘린더를 읽으려면 사용자의 허락(OAuth)을 받아야 하고, 일정 내용까지 읽는 권한은 구글 심사를 통과해야 모두에게 열 수 있다. 이 글은 그 심사를 준비해서 통과하기까지의 기록이다. 결과부터 말하면, 제출하고 이틀 만에 승인이 났다.

심사 대상 권한 확인

구글 캘린더에서 일정을 읽는 권한은 생각보다 여러 갈래였다. 일정 제목과 시간까지 읽는 calendar.events.readonly 가 있고, 언제 바쁜지만 알려 주는 calendar.events.freebusy 가 있다. 어떤 권한이 심사 대상인지 정리된 공식 표는 찾지 못했고, 블로그 글마다 말이 달랐다. 가장 확실한 방법은 콘솔에 직접 넣어 보는 거였다. 구글 클라우드 콘솔의 데이터 액세스에서 범위를 추가해 보면, 심사가 필요한 범위 옆에는 자물쇠 모양 아이콘이 있다. 구글 클라우드 콘솔의 범위 추가 창. 바쁜 시간 권한 옆에는 자물쇠 모양이 없고, 일정 보기 권한 옆에는 있다 바쁜 시간 권한 옆에는 자물쇠 모양이 없었다. 심사 없이 바로 쓸 수 있다는 뜻이었다.

권한 두 단계 설계

처음엔 바쁜 시간 권한으로 먼저 만들었다. 그런데 만들다 보니 가져온 일정이 전부 "구글 캘린더 일정"이라는 같은 이름으로 들어가게 돼 있었다. 이러면 공부 시간이 왜 줄었는지 알 수가 없다. 일정 제목이 보여야 했다. 그렇다고 심사도 받기 전에 제목 권한을 모두에게 물을 수는 없었다. 심사를 받지 않은 앱이 민감한 권한을 요청하면 "확인되지 않은 앱" 경고가 뜨고, 그 경고를 본 신규 사용자는 프로젝트 전체 기간을 통틀어 100명까지만 받을 수 있다. 미인증 상태의 사용자 한도. 100명 중 1명을 썼다 그래서 권한을 두 단계로 나눴다. 바쁜 시간 권한은 바로 모두에게 열고, 제목까지 읽는 권한은 운영자만 숨은 주소로 써 보다가 심사를 통과하면 설정 하나로 모두에게 켜는 방식이다. 제목 권한이어도 일정의 설명, 장소, 참석자는 받지 않도록 받는 항목도 줄였다. 1단계는 심사 없는 바쁜 시간 권한, 2단계는 심사가 필요한 일정 보기 권한. 심사 전에는 운영자만 숨은 주소로 2단계를 쓴다 날짜를 열면 어떤 일정이 공부 시간을 얼마나 뺐는지 보인다

데모 영상 요건

심사를 준비하면서 가장 먼저 찾아본 건 유튜브에 꼭 올려야 하냐는 거였다. 공식 문서는 데모 영상 링크를 요구했고, 유튜브에 일부 공개로 올리는 방법 하나만 적어 두었다. 다른 길은 없었다. 민감한 범위 심사에는 앱 기능을 보여 주는 데모 영상 링크가 필요하다 영상에 꼭 보여야 하는 것도 정해져 있었다.

  • 동의 과정은 영어 화면으로
  • 동의 화면에 앱 이름
  • 주소창에 OAuth 클라이언트 ID
  • 요청한 권한을 앱에서 실제로 쓰는 장면

데모 영상 촬영

영상에는 내 실제 일정 대신 영어로 된 예시 일정 세 개를 캘린더에 넣고 찍었다. 심사 담당자가 볼 영상에 개인 일정이 그대로 나오는 건 피하고 싶었다. 첫 판은 화면이 어수선했다. 브라우저 탭 줄을 흐리게 가리고 장면마다 두 줄짜리 설명을 깔았는데, 다시 보니 오히려 눈에 거슬렸다. 두 번째 판에서는 탭 줄을 아예 잘라 내고 자막을 짧은 제목과 설명 한 줄로 줄였다. 마지막 판은 화면 가장자리에 남아 있던 군더더기까지 없앤 상태로 처음부터 다시 녹화했다. 완성본은 5분 11초였다. 설정에서 연결하고, 계정을 고르고, 경고를 넘기고, 권한에 동의한 뒤, 가져온 일정이 공부 계획에 반영되는 장면과 연결을 끊는 장면까지 한 흐름으로 담았다. 3판의 흐름. 설정에서 연결, 주소창의 클라이언트 ID, 계정 선택, 미인증 경고, 동의, 일정이 들어온 화면, 연결 해제

유튜브 채널과 업로드

영상을 올리려고 보니 이 구글 계정에는 유튜브 채널이 없었다. 새로 만들면서 채널 이름은 신청서의 앱 이름과 같은 haruchi, 핸들은 도메인과 같은 @getharuchi 로 정했다. 심사 담당자는 영상 링크를 열면서 채널 이름도 같이 보게 되니까, 앱 이름과 같아야 덜 헷갈릴 것 같았다. 영상은 아동용 아님, 일부 공개로 올렸다. 채널 haruchi 에 데모 영상을 일부 공개로 올렸다

권한 사용 사유 작성

콘솔에서 민감한 권한을 추가하면 사용 사유를 1,000자 안에서 적는 칸이 생긴다. 구글은 필요한 만큼만 권한을 받으라고 하니까, 이 칸에서 가장 중요한 건 왜 더 작은 권한으로는 안 되는지라고 봤다. 바쁜 시간만으로는 어떤 일정 때문에 공부 시간이 줄었는지 사용자가 알 수 없다는 점을 중심으로 938자를 채웠다. 일정 보기 권한 아래에 사용 사유를 적어 저장했다 추가 정보 칸에는 심사 담당자가 그대로 따라 할 수 있는 테스트 순서를 적었다. 심사 전에는 제목 권한을 숨은 주소에서만 묻고 있었기 때문에, 그 길을 알려 주지 않으면 담당자가 제목 권한 화면을 볼 방법이 없었다.

제출 직전 설문

마지막으로 설문지가 하나 나왔는데, 첫 질문 "애플리케이션이 개인적인 용도로만 사용되나요?"에 이미 예가 골라져 있었다. 그대로 내면 구글은 개인용 앱이니 테스트 상태로 쓰라고 하고 심사하지 않는다. 네 질문을 모두 아니요로 바꾸고 제출했다. 제출 직전 설문지. 첫 질문에 예가 골라져 있었다 제출하자 홈페이지와 브랜드 가이드라인 항목은 그날 바로 통과됐고, 나머지 항목은 검토 중으로 바뀌었다. 안내 문구에는 최대 4~6주가 걸릴 수 있다고 적혀 있었다. 제출 직후 인증 진행 상황. 최대 4~6주, 첫 메일은 3~5일 안에 온다고 적혀 있다

이틀 만의 승인

제출한 지 이틀 만인 10월 19일 오후, 승인 메일이 왔다. 콘솔의 일정 보기 권한 옆에도 초록 체크가 붙었다. 제출 이틀 만에 온 승인 메일. 일정 보기 권한을 승인했다고 적혀 있다 심사를 통과한 뒤 민감한 범위의 일정 보기 권한에 초록 체크가 붙었다 바로 설정을 켜서 누구나 일정 제목 권한까지 함께 연결할 수 있게 했다. 다시 연결해 보니 확인되지 않은 앱 경고 화면이 사라졌고, 동의 화면에 있던 노란 경고 상자도 없어졌다. 같은 동의 화면의 심사 전(위, 영어)과 심사 후(아래, 한국어). 노란 경고 상자가 사라졌다

돌아보며

앱 심사는 몇 번 받아 봤지만, 이렇게 권한 하나를 두고 받는 심사는 처음이었다. 권한 범위를 고르고, 영상을 찍고, 사유를 쓰는 과정 하나하나가 낯설었다. 바쁜 시간 권한으로 먼저 열어 두긴 했지만, 아직 쓰는 사람이 거의 없던 때라 그게 큰 차이를 만들지는 않았다. 그래도 승인 메일을 받고 동의 화면에서 노란 경고 상자가 사라진 걸 봤을 때는 꽤 뿌듯했다. 이제 하루치를 연결하는 사람은 확인되지 않은 앱이 아니라 구글이 확인한 앱에 권한을 주게 된다. 작은 플래너지만, 그 화면 하나가 바뀐 게 생각보다 기분 좋았다.

comments

자유롭게 생각을 남겨주세요.