고객 지원 문의

이메일로 답장드리며, 보통 이틀 안에 회신합니다.

Google reCAPTCHA가 이 제출을 악용 여부에 대해 확인하며, 이 과정에서 데이터가 Google로 전송됩니다. 스크립트는 이 양식을 열 때만 불러옵니다.

← 전체 글

쿠키 없이 세기

방문자 카운터에는 곤란한 임무가 하나 있습니다. 두 번의 방문을 구별해야 합니다. 그러지 못하면 한 사람이 페이지를 열 번 새로 고친 것이 열 사람처럼 보이고, 사이트에 걸린 숫자는 허구가 됩니다.

흔한 해법은 쿠키입니다. 이 사이트는 쓰지 않습니다. 대신 무엇을 하는지, 그리고 그 문장을 정직하게 말할 수 있게 되기까지 왜 품이 들었는지 적습니다.

아무도 요청하지 않은 쿠키

올해까지 카운터로 들어오는 모든 요청은 PHP 세션을 시작했습니다. 코드 한 줄이고, 무해해 보이며, 그것이 뜻하는 바는 Stats4U 카운터를 쓰는 모든 사이트의 모든 방문자가 세션 쿠키를 받았다는 것입니다. 우리가, 남의 페이지에서, 양쪽 누구도 의도하지 않은 채 심은 것입니다.

재료IP · UA · ID날짜 · 일일 소금해시16바이트보관2일주소 자체는 결코 적히지 않습니다소금이 사라지면 어느 하루도 다시 계산할 수 없습니다 — 우리도 마찬가지입니다

그 세션은 어디에도 쓰인 적이 없습니다. 누군가 한 번 들여다보자 증거는 쉽게 나왔습니다. 세션이 저장되는 디렉터리에는 파일이 0개였습니다. 한 번도 쓰이지 않고 한 번도 읽히지 않은 데이터를 담겠다고 남의 웹사이트에 여러 해 동안 쿠키를 심어 온 것입니다.

그것은 계수 경로에서 사라졌습니다. 이제 세션은 누군가 카운터를 만들거나 다시 설정할 때에만 시작됩니다. 그 사람이 이 사이트에서 스스로 한 행동입니다.

무엇이 그 자리를 대신했는가

방문자는 해시로 구별합니다. 다섯 가지가 들어갑니다:

  • IP 주소
  • 사용자 에이전트
  • 카운터 번호
  • 오늘 날짜
  • 날마다 바뀌는 비밀값

나오는 것은 16바이트이고, 저장되는 것은 그것뿐입니다. 이틀 보관한 뒤 지웁니다. IP 주소 자체는 어느 시점에도 적히지 않습니다.

같은 사람이 같은 날 같은 카운터를 두 번 방문하면 같은 16바이트가 나오므로, 두 번째는 되풀이로 인식됩니다. 내일 같은 사람은 완전히 다른 값을 만들어 냅니다. 날짜와 비밀값이 둘 다 바뀌었기 때문입니다. 원리는 그것이 전부입니다.

왜 비밀값이 돌아가는가

여기가 틀리기 쉬운 대목이고, 올해까지 여기서도 틀려 있었습니다.

옛 방식은 고정된 비밀값 하나를 썼습니다. 그래도 사람마다 다른 해시가 나오니 괜찮게 들립니다. 그러나 그 비밀값을 가진 사람은 의심되는 IP 주소를 골라 보관된 어느 날에 대해서든 그 해시를 다시 계산할 수 있었습니다. 익명의 16바이트 값이 담긴 표를, 데이터가 남아 있는 데까지 거슬러, 누가 무엇을 방문했는지의 기록으로 되돌리는 셈입니다.

이제 비밀값은 날마다 바뀌고 옛 값은 이틀 뒤에 지워집니다. 그러고 나면 그 계산은 누구도 더는 할 수 없습니다. 이 사이트를 운영하는 사람도 마찬가지이며, 바로 그것이 핵심입니다. 운영자의 선의에 기대는 보호는 보호가 아니라 약속입니다.

화면 해상도, 그리고 무언가를 지우는 일에 관한 교훈

화면 해상도는 예전에 수집했습니다. 전형적인 지문 채취 신호이고 값어치에 비해 비용이 컸기에, 삽입 페이지에서 도는 스크립트에서 빼냈습니다.

그것으로는 부족했고, 그 까닭은 남의 웹사이트에 들어갈 것을 만드는 사람이라면 알아 둘 만합니다. 그 스크립트는 캐시 수명 7일로 전달되므로, 바꾼 뒤에도 옛 사본이 방문자 브라우저 안에서 한 주 동안 살아 있었습니다. 더 나쁜 것은, 어떤 사이트는 스크립트를 링크로 걸지 않고 몇 해 전에 사본을 자기 페이지 안에 붙여 넣었다는 점입니다. 그 사본은 붙여 넣은 그날 하던 일을 영원히 그대로 계속합니다.

그래서 해상도는 계속 들어왔습니다. 해법은 서버가 누가 보내든 그 값을 거부하게 만드는 것이었습니다. 클라이언트에서 수집을 없애는 것은 새 클라이언트만 멈춥니다. 서버에서 없애는 것은 지금 당장 멈춥니다.

직접 확인하기

이 모든 것은 주장으로는 값어치가 크지 않으니, 명령을 적습니다:

  • curl -sk -D - -o /dev/null 'https://www.stats4u.net/index.php?action=pic&s4uid=1' | grep -i set-cookie

출력이 없다는 것은 쿠키가 심어지지 않았다는 뜻입니다.

끝으로 늘 같은 당부 하나. 이 글은 소프트웨어가 무엇을 하는지 설명합니다. 그것이 특정 나라의 규정을 충족하는지는 그에 답할 자격을 갖춘 사람의 몫이며, 이 글은 그 답이 아닙니다.

광고