VPN 출구와 브라우저 언어가 일치하지 않는 이유
Accept-Language는 응답 언어를 요청하고, VPN은 출발지 주소를 바꾼다. 사이트가 현지화되어 보일 때 세 가지 입력이 어느 쪽이 이겼는지 결정한다.
VPN에 대해 어떤 결론을 내리기 전에 개발자 도구를 열고 페이지를 불러온 뒤 요청 헤더를 읽어 보라. 보통 특정 언어 집합을 요청하는 Accept-Language 줄이 보일 것이고, 그 줄은 출구 주소가 아니라 브라우저 설정에서 온다. 도쿄 출구에 있는 프랑스어 사용자도 여전히 프랑스를 보내고, 프랑스어로 응답하는 사이트는 그 헤더에 응답하는 것이다. 페이지가 익숙한 언어로 도착했다고 해서 터널이 새는 것은 아니다.
무엇보다 먼저 헤더를 읽어라
데스크톱 브라우저에서 네트워크 패널을 열고 새로 고친 뒤 문서 요청을 클릭해 요청 헤더 아래를 보라. 터미널에서는 브라우저 없이 같은 것을 볼 수 있고, 값을 덮어써서 사이트의 동작을 시험할 수 있다.
curl -sS -D /tmp/h1 -o /tmp/b1 https://example.com
curl -sS -D /tmp/h2 -o /tmp/b2 -H 'Accept-Language: fr,en;q=0.6' https://example.com
grep -o 'lang="[^"]*"' /tmp/b1 /tmp/b2
diff /tmp/b1 /tmp/b2 | head -40
이제 본문이 디스크에 있으므로 비교 대상은 페이지이고, 어쩌면 한 번도 전송되지 않을 헤더가 아니다. html 태그의 lang 속성과 눈에 보이는 텍스트를 보라. Content-Language는 선택 사항이고 많은 서버가 생략하기 때문이다. 그래서 같은 URL에서 페이지 전체를 영어에서 프랑스어로 바꾸는 사이트는 헤더만 비교하면 변하지 않은 것처럼 보일 수 있다. 출구가 고정된 채 문서 언어가 헤더를 따른다면 헤더가 결정적 입력이었고, 그 관찰에 VPN은 관계가 없다.
이 시험에는 사이트 자체의 언어 전환 대신 두 번째 브라우저 프로필을 사용하라. 전환은 보통 쿠키를 쓰는데 그것은 다른 입력이므로, 결국 헤더 대신 쿠키를 재게 된다.
q 값이 뜻하는 것과 뜻하지 않는 것
RFC 9110 12.5.4절은 Accept-Language를 응답에 선호되는 자연어 목록으로 정의한다. 각 항목은 0에서 1까지의 가중치를 가질 수 있고, 가중치가 없는 범위의 가중치는 1이며, 가중치 0은 그 언어를 받아들일 수 없음으로 표시한다. 이는 선호 순서일 뿐 그 이상이 아니다.
이 값은 위치 보고서도, 신뢰 점수도, 신원도 아니다. 서버는 그것을 무시할 수도, 가진 유일한 번역을 제공할 수도, 국가 기반 리디렉션이 이기게 할 수도 있다. 콘텐츠 협상은 서버의 선택이며, 헤더는 그 선택에 대한 입력이지 명령이 아니다.
현지화된 페이지를 위치 시험으로 다룰 때 사람들이 놓치는 부분이 바로 이것이다. 헤더는 그 사람이 어떤 언어를 읽고 싶어 하는지 말해 주며, 선호는 어디든 이동할 수 있다.
실제로 받는 언어를 결정하는 세 가지 입력
밖에서는 어느 것이 이겼는지 보이지 않으므로 하나씩 분리하라.
- 헤더. 다른 언어 목록으로 설정한 두 번째 프로필로 시험하고, 나머지를 고정한 채 페이지가 바뀌는지 관찰하라.
- 저장된 선택. 쿠키가 없는 시크릿 창에서 시험하거나 사이트 저장소를 지워라. 계정 설정과 localStorage 항목은 언어를 몇 달 동안 고정할 수 있다.
- URL 또는 리디렉션.
/fr/같은 명시적 언어 경로를 요청하고, 출발지 주소에 기반한 리디렉션의 상태 코드를 관찰해 시험하라.
세 시험을 그 순서로 실행하고 어느 것이 결과를 움직였는지 적어라. VPN을 켠 뒤 언어가 바뀌는 한 번의 페이지 로드는 약한 증거다. 리디렉션도 캐시된 쿠키도 그런 인상을 만들 수 있다.
VPN이 바꾸는 것과 바꾸지 않는 것
터널은 서버가 보는 출발지 주소를 바꾸고, 그와 함께 서버가 IP 위치 정보에서 추론하는 모든 것을 바꾼다. 브라우저의 언어 설정을 다시 쓰지 않고, 저장된 설정을 지우지 않으며, 입력한 URL을 바꾸지도 않는다. 그 입력들은 원래 자리에 그대로 있으므로, 출구가 옮겨진 뒤에도 페이지는 예전 언어를 유지할 수 있다.
위치 정보에는 고유한 잡음이 있다. 주소 데이터베이스는 서로 어긋나고, 한 국가에 등록된 출구가 다른 국가로 매핑될 수 있어, 국가 기반 리디렉션이 브라우저와 무관한 이유로 잘못 보이게 된다.
짧은 확인으로 분리할 수 있다. 페이지를 새로 요청하고, 제시하는 주소를 기록한 뒤 응답 언어를 헤더 목록과 비교하라. 언어가 출구 국가가 아니라 목록과 일치한다면 헤더가 결정적 입력이었고 터널에서 고칠 것은 없다.
현지화된 페이지가 증명하는 것과 증명하지 않는 것
여기에는 실제 프라이버시 쟁점이 있고, 그것은 사람들이 흔히 내세우는 것보다 작다. 언어 선호의 전체 목록은 지문 입력이며 당신이 누구인지, 무엇을 읽는지에 대해 무언가를 드러낼 수 있다. 그것은 선호의 진짜 노출이고, 트래픽이 터널을 빠져나갔다는 증명과는 같지 않다.
현지화된 페이지는 유출 지표가 아니다. 유출을 정말 시험하려면 사이트가 보는 출구 주소, 이름 조회에 쓰이는 리졸버 경로, WebRTC 스택이 노출하는 후보를 확인하라. 그 시험들이 페이지 언어로는 답할 수 없는 질문에 답한다.
다음에 사이트가 당신의 국가를 아는 것처럼 보이면 먼저 요청 헤더를 열어라. 응답 언어가 브라우저 목록과 일치한다면 아무것도 유출되지 않았고, 살펴볼 계층은 눈앞에 있는 것이다.