Chrome 확장 프로그램에서 관측된 출구 IP 확인
확장 프로그램의 출처에서 제어된 엔드포인트로 제한된 요청을 보내고, 그 검사가 실제로 무엇을 증명하는지 보고합니다.
Chrome 확장 프로그램의 프록시 검사에는 응답을 예측할 수 있는 대상이 필요합니다. 직접 제어하는 HTTPS 엔드포인트를 사용하십시오. 예를 들어 관측한 주소를 담은 작은 JSON 객체를 반환하는 엔드포인트입니다.
요청은 service worker나 확장 프로그램 페이지 같은 확장 프로그램 컨텍스트에서 실행하고, 엔드포인트를 manifest의 host permissions에 넣습니다:
"host_permissions": ["https://probe.example/*"]
호스트 권한이 content script에 같은 교차 출처 권한을 주지는 않습니다. 주입된 스크립트가 같은 요청을 보낼 수 있다고 가정하지 말고 검사를 확장 프로그램 컨텍스트에 두십시오.
async function probe() {
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 5000);
try {
const response = await fetch('https://probe.example/ip', {
cache: 'no-store',
signal: controller.signal,
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = await response.json();
if (typeof result.ip !== 'string') throw new Error('Bad probe body');
return result.ip;
} finally {
clearTimeout(timer);
}
}
호스트 이름은 자리 표시자입니다. 서버와 클라이언트는 응답 형식과 캐시 정책에 합의해야 합니다. 거부된 요청과 잘못된 응답은 확장 프로그램의 호출부에서 처리하고, 유효한 출구 주소로 표시하지 마십시오.
관측을 정확하게 이름 붙이기
성공한 결과가 증명하는 것은 이 요청이 엔드포인트에 도달해 예상한 형태의 응답을 받았다는 사실입니다. 비교가 의미 있는 경우 관측된 주소를 의도한 경로와 견주어 보십시오. 설정된 프록시의 수신 IP가 곧 공용 출구라는 보장은 없습니다.
PAC 규칙이나 우회 목록 때문에 다른 대상은 프록시를 쓰는데 검사만 직접 전송될 수 있습니다. 프록시 설정을 읽으면 구성 증거가 됩니다. 요청은 이 대상에 대한 증거가 됩니다. 어느 하나만으로는 모든 탭이나 URL이 같은 경로를 따른다고 증명할 수 없습니다.
시간 초과, HTTP 오류, 예상치 못한 본문을 UI에서 구분하십시오. 요청 한 번 뒤에 기기 전체를 오프라인이라고 선언하는 것보다 “이 검사가 실패했습니다”라고 표시하는 편이 유용합니다.