
개인정보처리방침 AI 처리 위치(국외 이전): 하루에 두 번 고친 고지를 코드에 묶기
Vertex AI global 엔드포인트는 처리 국가를 하나로 적을 수 없어 "한국 밖일 수 있음"으로 고지하고, 이 문장을 코드·CI·출시 게이트에 묶었습니다.
2026년 10월 10일, 출시 전인 가족 일정 앱 AXFamily의 개인정보처리방침에서 AI 처리 위치가 두 번 바뀌었습니다. 14시 05분에는 "Google Cloud 서울 리전"으로, 23시 00분에는 "Google 글로벌 인프라(처리 위치는 한국 밖일 수 있음)"로요. 두 번째에는 앱 저장소 커밋 1426e97(23:00:36)과 사이트 커밋 89e0bb3(23:01:09) 사이가 33초였고, 앱 안 AI 동의도 새 버전으로 다시 받게 했습니다. 실제로는 쓸 수 없던 서울 문장이 8시간 55분 동안 공개돼 있었습니다. 출시 전이라 실사용자는 없었습니다.
출처: AXFamily 앱 저장소의 커밋, 결정 기록, CI 검사 코드와 이 사이트 저장소의 git 기록, 작업 세션 기록입니다. 시각은 한국 시간 커밋 시각이고, 기준일은 2026년 10월 22일입니다.
목차 (8)
하루 동안 방침이 두 번 달라진 순서
첫 변경은 AI 코딩 에이전트의 정책 사실 검토였습니다. 커밋 13d00b8(14:05:08)은 방침 초안에 있던 Vertex AI 처리 위치 "global·미국"을 서울 리전(asia-northeast3)으로 고쳤습니다. 근거는 함수 기본 위치와 앱 AI 동의 화면의 고지 상수, 둘 다 서울인 코드였습니다. 49초 뒤 사이트 커밋 6321f14로 이 방침이 처음 공개됐습니다.
15:13, 운영 배포 준비를 맡은 다른 에이전트가 과금되지 않는 countTokens 호출로 모델을 확인했습니다. 메인 에이전트가 미리 맡겨 둔 확인이었습니다. 고른 두 모델(gemini-3.5-flash-lite, gemini-3.8-flash)은 global 엔드포인트에만 있어서, 서울과 도쿄에서는 둘 다 404가 나왔습니다. 코드 허용 목록의 4조합(서울·도쿄 × 두 모델)이 하나도 동작하지 않았습니다. 이 결과는 커밋 cc54a82의 운영 문서에 남았습니다.
에이전트는 15:27에 운영자에게 선택지 세 개를 물었고, 운영자는 22:46에 global을 골랐습니다. 질문부터 답까지 7시간 18분입니다. 코드 커밋은 그 14분 뒤에 나왔고, 사이트가 곧바로 따라왔습니다.

AI가 서울로 고친 근거는 한 번도 호출되지 않은 코드였습니다
14:05의 검토 에이전트는 충돌을 알고 있었습니다. 보고서에 "지시에는 Vertex AI 위치가 global이라고 되어 있지만, 코드는 global을 막아 둡니다"라고 적고 코드 쪽을 택했습니다. 방침을 코드에 맞춘다는 원칙은 맞았지만, 그 코드 값은 실제 엔드포인트를 한 번도 부른 적이 없었습니다.
원인은 세 단계입니다.
- 방침이 서울이 된 이유: 검토 에이전트가 코드 상수 두 개(함수
DEFAULT_VERTEX_LOCATION, 앱AiProcessingDisclosure.region)를 정본으로 봤습니다. - 코드가 서울이 된 이유: 10월 9일 출시 계획이 "Vertex 위치를 특정 리전으로 고정, global 사용 금지(처리 국가를 고지에 반영)"를 정했습니다. 그런데 하루 전 10월 8일 모델 평가는
locations/global로 호출해 모델을 골랐습니다. 모델은 평가 문서가, 위치는 계획 문서가 정했고 둘을 함께 확인한 단계가 없었습니다. 기획 문서에는 "서울 리전 가용성"이 확인할 항목으로, 감사 문서에는 "모델별 서울 가용성은 미확인"으로 남아 있었습니다. - 그때까지 아무도 몰랐던 이유: 기기 E2E는 데모 에뮬레이터와 가짜 모델로 돌았고, 운영 AI 스위치는 꺼져 있었습니다. 서울 엔드포인트를 실제로 부른 것은 15:13의 확인이 처음이었습니다. 10월 8일 모델 평가는 global만 불렀습니다.
AI가 검증되지 않은 코드에 맞춰 고치기 전, 14:05 이전 초안의 문장은 "미국 등 Google 데이터센터 소재국(위치 global)"이었습니다. 23:00에 확정된 문장도 "한국 밖(미국 등 Google 데이터센터 소재국)일 수 있음"을 담고 있습니다.
운영자가 고른 global과 버린 세 가지
15:27 질문의 선택지는 global 사용(에이전트 권장), 서울에서 한 세대 전 모델 gemini-2.5-flash 사용, AI를 당분간 끄기였습니다. 운영자는 global을 골랐습니다. 결정 기록과 질문에 남은 버린 안은 이렇습니다.
| 버린 안 | 이유 |
|---|---|
서울 + gemini-2.5-flash | 처리 국가는 쓰기 쉽지만 모델 평가를 다시 해야 하고 단가와 정확도가 다릅니다. |
| AI 당분간 끄기 | 서울에 새 모델이 나올 때까지 내부 테스트를 AI 없이 해야 합니다. |
| global로 쓰고 고지는 "미국" | global은 미국으로 고정되지 않습니다. 사실과 다른 고지입니다. |
동의 버전 2026-10-10b | 앱·서버·CI가 같은 YYYY-MM-DD 정규식으로 검사해서 쓸 수 없었습니다. 다음 날짜 2026-10-11을 썼습니다. |
새 고지 문장은 "Google 글로벌 인프라(처리 위치는 한국 밖일 수 있어요)"입니다. 국외 이전 표의 이전받는 자는 그대로 Google LLC이고, 처리할 리전은 Google이 요청마다 정한다고 적었습니다. 법률 검토는 거치지 않았고, 코드가 실제로 하는 일을 그대로 옮겼습니다.
지금 공개된 AXFamily 개인정보처리방침(2026-10-17판) 국외 이전 표의 Vertex AI 행을 그대로 옮깁니다. 연락처, 근거, 거부 방법 칸은 뺐고, 줄표만 쌍점으로 바꿨습니다.
| 칸 | 공개된 문장 |
|---|---|
| 이전받는 자 | Google LLC: Vertex AI Gemini(유료 등급, Google Cloud 글로벌 엔드포인트, 생성·임베딩 모델) |
| 국가 | Google 글로벌 인프라(Vertex AI global 위치). 처리할 리전은 Google이 요청마다 정하며 한국 밖(미국 등 Google 데이터센터 소재국)일 수 있음. 처리 위치를 바꾸면 이 방침과 앱 안 동의를 먼저 고침 |
| 이전 항목 | AI 정리를 요청한 사진·문서의 축소본(WebP, 긴 변 1280px 이하)과 공유하거나 붙여 넣은 글, 가족 구성원의 표시 이름과 내부 식별자(보호자 동의 전 자녀는 보내지 않음). 비서·플래너·기억·브리핑: 질문, 플랜 입력, 요청한 성인이 볼 수 있는 가족 기록의 요약(제목·날짜·담당·기억 카드 값, 사람 이름은 별칭으로 바꿈). 만 14세 미만 자녀에 관한 기록과 건강 기록(본인이 켜지 않은 경우)은 보내지 않음(자녀가 함께하는 일정·여행은 이름 대신 나이대로) |
| 이전 시기·방법 | 사용자가 AI 정리·비서·플래너를 쓸 때, 그리고 동의한 성인의 가족 기억 정리(새벽 배치·기록 변경 때)와 Plus 주간 브리핑(일요일 저녁)에 서버를 거쳐 암호화된 네트워크로 전송 |
| 이용 목적 | 자료에서 일정·준비물 제안, 가족에게 묻기 답과 승인 카드, 여행·주말 플랜 초안, 가족 기억 색인(임베딩)과 사람 카드·앨범 제안, 주간 브리핑 요약(최종 저장은 사용자가 결정) |
| 보유·이용 기간 | Google은 결과를 돌려준 뒤 보관하지 않음. 모델 학습에 쓰지 않음. Google이 남용 탐지를 위해 짧게 기록할 수 있음. 저희 서버의 결과 보관은 4. 보유·이용 기간(비서 대화 90일, 브리핑 요약 30일, 제안·플랜 7일, 기억 색인은 원본 삭제·동의 철회 때까지) |
커밋 하나에 묶인 다섯 곳과 push 뒤의 옛 버전
커밋 1426e97은 파일 38개를 바꿨습니다(+216/−156). 처리 위치에 걸린 것만 추리면 다섯 곳입니다.
- 함수:
DEFAULT_VERTEX_LOCATION = "global",ALLOWED_VERTEX_LOCATIONS = ["global"] - 앱 고지:
AiProcessingDisclosure.region = 'global'과 ko·en 고지 문구 - AI 동의 버전: 2026-10-10에서 2026-10-11로. 문구·받는 곳·위치를 묶은 sha256 해시도 새로 냈습니다. 서버와 앱은 옛 버전 동의를 동의 없음으로 보고 다시 묻습니다.
- 처리방침 버전: 2026-10-09에서 2026-10-10으로. 국외 이전 표는
processors.json에서 다시 생성했습니다. - CI
legal-consistency의ai-region규칙
이전 규칙은 앱 고지가 global이 아니고 함수 기본 위치와 같으면 통과였고, 함수가 global이면 메모만 남겼을 뿐 허용 목록은 보지 않았습니다. 그래서 고지는 서울인데 허용 목록에 도쿄(asia-northeast1)가 들어 있어도 CI는 초록이었습니다. 환경 변수 하나만 바꾸면 고지하지 않은 나라에서 처리할 수 있었습니다. 새 규칙은 세 가지를 봅니다.
앱 AiProcessingDisclosure.region == 함수 DEFAULT_VERTEX_LOCATION
함수 ALLOWED_VERTEX_LOCATIONS == [그 값] (딱 하나)
region == "global"이면 consent_regionGlobal 문구(ko·en)가 비어 있으면 실패
이 규칙의 음성 사례는 2개에서 7개로 늘었습니다. 허용 목록에 서울을 하나 더 넣은 경우, 허용 목록 줄이 아예 없는 경우가 각각 실패해야 테스트가 통과합니다(가드 지워 보기와 같은 방식).

사이트 반영은 같은 에이전트가 이어서 했습니다. 정책 HTML 6개를 사이트로 복사하고 빌드와 --check를 통과시킨 뒤 23:01:09에 커밋했습니다. 26초 뒤 다시 보니 두 URL 모두 200인데 페이지는 아직 옛 버전 2026-10-09였고, 23:02:01에야 2026-10-10이 보였습니다.
출시 게이트의 정책 URL 단계가 바로 이 두 가지를 봅니다. 공개 URL이 200인지, 본문의 data-policy-version 표식이 버전 파일과 같은지입니다. 다른 앱의 출시 게이트도 방침 URL이 200인지는 봅니다(AI가 만든 Android 앱, 출시 전에 무엇을 검사하나). AXFamily 게이트는 여기에 버전 대조가 붙어 있습니다.
사이트는 앱 PR이 머지된 23:07:38보다 6분 반 먼저 공개됐습니다. 방침에 "처리 위치를 바꾸면 이 방침과 앱 안 동의를 먼저 고침"이라고 적어 두었으니 의도한 순서입니다. AI 함수가 배포 전이라 가능했던 순서이기도 합니다.
이 묶음이 아직 막지 못하는 것
CI가 비교하는 것은 두 쌍입니다. 생성된 방침 HTML과 processors.json, 앱 고지 상수와 함수 상수입니다. processors.json의 국가 문장과 함수 상수를 비교하는 규칙은 10월 17일 코드에도 없습니다.
- 게이트는 게시를 보고, 사실은 보지 않습니다. 서울 문장이 공개돼 있던 14:24 게이트 보고에서도 정책 URL 단계는 통과였습니다.
- global은 처리 국가를 하나로 적어야 하는 계약이나 고객에게는 맞지 않습니다. 지연에도 약했습니다. 10월 17일 측정에서 global 임베딩 호출은 12번 중 11번이 10.5~15.4초였고 서울은 0.28~0.64초(첫 호출 제외)여서, 임베딩만 서울로 돌리고 CI에
ai-embed-region규칙을 붙였습니다. - 처리 위치가 콘솔 설정에만 있거나 방침을 코드 저장소 밖에서 관리하면 CI가 읽을 값이 없습니다. 그때는 사전 점검이 실제 API를 읽어야 합니다.
자기 앱에 적용하는 순서
AI 처리 위치는 방침에 먼저 쓰지 마십시오. 무과금 호출로 그 위치에서 모델이 응답하는지 확인한 뒤에 씁니다.
- 처리 위치를 함수 상수 하나로 둡니다. 허용 목록은 그 값 하나만 담고, 목록 밖이면 호출 전에 거부합니다.
- 앱 고지 상수를 같은 값으로 두고, CI가 두 파일을 정규식으로 읽어 비교합니다. 허용 목록 길이가 1이 아니면 실패하게 합니다.
- 동의 문구(ko·en), 받는 곳, 위치를 묶어 sha256 해시를 냅니다. 해시가 바뀌었는데 버전이 그대로면 CI가 실패하게 합니다.
- 방침의 국외 이전 표는 JSON에서 생성하고, 생성물과 다르면 CI가 실패하게 합니다.
- 배포 사전 점검에서 그 위치와 모델로
countTokens를 부릅니다. 404면 배포를 중단합니다. - 공개 페이지 본문에 버전 표식을 두고, 출시 게이트가 URL 200과 버전 일치를 확인합니다. push 직후에는 옛 버전이 보이므로 몇 분 동안 다시 봅니다.
# 5번: 위치별로 모델이 있는지 확인 (생성 호출이 아니라 과금되지 않음)
TOKEN=$(gcloud auth print-access-token)
for LOC in global asia-northeast3; do
if [ "$LOC" = global ]; then HOST=aiplatform.googleapis.com; else HOST=$LOC-aiplatform.googleapis.com; fi
curl -s -o /dev/null -w "$LOC %{http_code}\n" -X POST \
-H "Authorization: Bearer $TOKEN" -H "x-goog-user-project: $PROJECT" \
-H "Content-Type: application/json" \
"https://$HOST/v1/projects/$PROJECT/locations/$LOC/publishers/google/models/$MODEL:countTokens" \
-d '{"contents":[{"role":"user","parts":[{"text":"ping"}]}]}'
done
# 6번: 공개된 방침의 버전 표식
curl -s "$POLICY_URL" | grep -o 'data-policy-version="[0-9-]*"'
global 호스트에는 asia-northeast3- 같은 지역 접두사가 붙지 않습니다. 위 명령은 저장소 사전 점검의 요청 형식을 옮긴 것이고, 이 글을 쓰며 다시 실행하지는 않았습니다.
남은 일
10월 17일부터는 임베딩 위치(서울)와 생성 위치(global)가 갈라져, 비교할 상수가 둘이 됐습니다. 다음 작업은 방침 JSON에 위치 id를 따로 두고 CI가 생성·임베딩 상수와 비교하게 하는 것입니다.
자주 묻는 질문
Vertex AI global 엔드포인트를 쓰면 개인정보처리방침에 나라를 어떻게 적나요?
나라 하나로는 적을 수 없어서 "Google 글로벌 인프라, 처리 위치는 한국 밖일 수 있음"으로 적었습니다. global은 Google이 요청마다 처리 리전을 정하기 때문입니다. "미국"으로 적는 안은 사실과 달라 버렸습니다.
Gemini 모델이 서울 리전에 있는지 비용 없이 확인할 수 있나요?
있습니다. 그 리전 엔드포인트로 countTokens를 부르면 됩니다. 2026년 10월 10일에는 gemini-3.5-flash-lite와 gemini-3.8-flash가 서울과 도쿄에서 404였고, 서울에서 되는 것은 gemini-2.5-flash였습니다.
이 글은 SugarMount가 직접 측정한 값으로 쓰고, 초안 작성에 AI 코딩 에이전트를 썼습니다.
다른 AX 노트
- FAQ 리치 결과가 끝난 뒤의 구조화 데이터: GEO용으로 무엇을 남겼나
- 여러 에이전트 세션이 고치는 정적 사이트: 커밋 전 --check 게이트 하나
- 사이트맵 lastmod가 전부 같은 날짜였다: 본문 해시로 수정일 정하기
- Android assets를 미리 gzip한 실측: APK 이득은 0, .pack.gz는 .pack이 되어 FileNotFoundException
- SKT 판매 삼성 폰에서 market://을 열면 스토어 선택 창이 뜬다: Play 패키지부터 지정하기
- addOnCompleteListener(this)가 onStop에서 지운 리스너 때문에 스플래시에 멈춘 버그