조각된 노르딕 석재 강독대 앞에 서 있는 NordBastion의 북극곰 마스코트, 그 위로 막대 그래프와 상승하는 선 그래프, 호박색 강조가 하나 들어간 도넛 링을 보여주는 크고 떠 있는 청록색 홀로그램 대시보드, 그리고 오로라가 비치는 아치형 창문에서 대시보드를 지나 룬 문자가 새겨진 금고 문으로 이어지는, 끊기지 않고 빛나는 청록색 점들의 흐름 하나, 그 뒤로 보이는 서버 랙
방법 가이드 · 분석·읽기 18분 · 실습 40분

독자를 지켜보기 위해 스크립트 하나를 설치했습니다.
그것은 되받아 감시하며, 다른 곳으로 보고합니다.

분석 도구는 대부분의 사람이 마지막까지 남겨 두는 제3자 태그이며, 모든 것을 지켜보는 태그입니다. 모든 페이지, 모든 독자, 매 시간을, 여러분이 소유하지도 감사할 수도 없는 시스템 위에서 말입니다. 이를 여러분 소유의 카운터로 바꾸는 여섯 단계 — Umami, Plausible Community Edition, Matomo, 혹은 서버 로그뿐인 방식 — 신분증 없이 대여한 노르딕 서버 위에서 실행됩니다. 기본값부터 쿠키가 없고, 다툴 배너도 없으며, 독자 데이터를 제3국으로 옮기지도 않습니다. 월 $3.90부터. Debian 12에서 테스트했습니다.

6단계
  1. 01

    선택

    네 가지 도구, 하나의 솔직한 표

  2. 02

    프로비저닝

    서브도메인 하나, 포트 세 개

  3. 03

    배포

    Compose, Caddy, 첫 로그인

  4. 04

    계측

    태그 하나, 그리고 퍼스트파티 경로

  5. 05

    준수

    법률은 하나가 아니라 둘

  6. 06

    Keep

    보관 기간, 백업, 잊혀진 로그

시작하기 전에 · 태그란 무엇인가

이것은 카운터가 아닙니다. 보고 라인입니다.

방문자 수를 세는 일은 실제로 유용하며, 그렇게 하고 싶어 하는 데에 불순한 의도는 전혀 없습니다. 리라이팅이 도움이 되었는지, 사람들이 실제로 끝까지 읽는 글이 무엇인지, 어떤 리퍼러가 이탈이 아니라 실제 독자를 데려오는지, 지난밤의 배포가 특정 브라우저에서 결제를 조용히 망가뜨리지는 않았는지를 알아야 합니다. 이 모든 질문에는 페이지 조회수 테이블 하나로 답할 수 있으며, 이들 각각은 측정을 정당화하는 타당한 이유입니다.

정면으로 들여다볼 가치가 있는 것은, 그런 답을 얻기 위해 거의 모든 사람이 받아들인 그 거래 구조입니다. 표준 분석 태그는 광고 회사가 작성한 코드 조각으로, 여러분은 이를 사이트의 모든 페이지에 심어 두고 독자의 브라우저에서 실행하도록 지시합니다. 이는 페이지 주소, 리퍼러, 화면, 언어, 기기를 읽어 들이고, 기기에 식별자를 설정하거나 읽으며, 그 모든 것을 여러분이 들여다볼 수 없는 시스템으로, 여러분이 선택하지 않은 규칙을 가진 나라로 보내고, 그 결과로 만들어진 파일을 사람들이 무엇을 하는지 아는 것으로 수익을 내는 회사에 넘겨줍니다. 사이트 운영자는 대시보드를 얻습니다. 그 대시보드는 이 거래의 더 작은 절반입니다.

청구서는 네 번에 걸쳐 도착하며, 그중 눈에 보이는 것은 하나뿐입니다. 하나는 동의 배너입니다. 이것은 거의 전적으로 이 태그 하나 때문에 존재하며, 방문자 중 측정 가능한 비율을 문 앞에서 잃게 만들고, 그런 다음 그것을 관리하기 위해 또 다른 벤더에게 돈을 지불하게 만듭니다. 다음은 이전(transfer) 문제입니다. 독자들의 데이터가 제3국으로 나가기 때문에, 결국 누군가는 그것이 왜 합법인지를 적어 두어야 합니다. 그다음은 데이터 그 자체입니다. 이는 여러분의 독자층이지만, 제공되는 리포트를 통하지 않고서는 직접 조회할 수 없는 데이터베이스 안에 있습니다. 그리고 의존성이 있습니다. 그 제품은 다른 누군가의 일정에 따라 종료되거나, 이름이 바뀌거나, 구조가 바뀌며, 지난번 그런 일이 있었을 때 과거의 측정값들도 함께 사라졌습니다.

셀프 호스팅은 이 네 가지를 한꺼번에 없애 주며, 그다지 큰 작업도 아닙니다. 소프트웨어는 성숙하고 무료이며 특별할 것 없이 안정적입니다. 서버는 한 달에 몇 달러이고, 작업량은 한 저녁 정도입니다. 그 대가로 얻는 것은 여러분이 고른 관할권의 하드웨어 위에, 여러분 소유의 표이며, 공시해야 할 제3자도 없고 — 대부분의 설정에서는 — 다툴 배너도 없습니다. 사이트를 읽는 사람 수를 아는 네 가지 방법과, 각각의 비용은 다음과 같습니다.

속성 그 크고 무료인 분석 태그 프라이버시 우선 분석 SaaS 같은 소프트웨어, 여러분의 VPS
독자 테이블을 쥐고 있는 사람광고 회사계약을 맺은 벤더여러분, 디스크에
동의 배너 필요예, 실무적으로는 항상 그렇습니다대개는 아님대개는 아님 — 5단계 참고
데이터가 EEA를 벗어남예, 설계상 그렇습니다벤더에 따라 다름그 밖의 서버를 선택할 때만
공시해야 할 제3자최소 하나, 그리고 그 하위 처리자들처리자 한 곳없음
필터 목록에 의해 차단됨많음흔히 호스트명 단위로퍼스트파티가 되면 거의 없음
여러분이 직접 다룰 수 있는 원본 데이터아니요 — 리포트만 제공요금을 내는 동안에는 API를 통해그것은 여러분의 데이터베이스입니다
월 10만 조회수 기준 비용돈으로는 들지 않음수십 달러, 트래픽에 따라 증가$3.90–$7.90, 균일가
적합한 경우광고 플랫폼 연동이 필요하며 나머지는 감수함아무것도 운영하지 않으면서 윤리성을 원함독자층도, 그것을 담은 표도 모두 여러분의 것입니다

세 번째 항목은 허수아비가 아니라 진짜 답입니다. 호스팅형 프라이버시 우선 벤더는 서버를 직접 운영해서는 안 되는 사람들에게 같은 문제 대부분을 없애 주며, 그런 벤더에게 비용을 지불하는 것은 광고 태그를 그대로 두는 것보다 나은 결과입니다. 이 가이드는 이미 서버를 대여하고 있거나, 대여할 예정인 경우를 위한 것입니다.

단계 01 · 선택

네 가지 도구. 청구서를 결정하는 것은 데이터베이스입니다.

이 넷은 같은 것의 네 가지 변형이 아닙니다. 데이터를 무엇에 저장하는지가 서로 다르며, 바로 이 하나의 선택이 메모리 사용량, 디스크 증가량, 업그레이드 위험, 리포트의 깊이를 결정합니다. 저장소 열을 먼저 읽고 기능 열을 그다음에 읽으십시오. 실제로 결정이 이루어지는 순서가 그렇습니다.

도구 스택과 저장소 적정 등급 적합한 용도
UmamiNode 애플리케이션 + PostgreSQL 또는 MySQL. 컨테이너 2개.Sentinel · $3.90기본 정답. 가볍고, 읽기 쉽고, 쿠키가 없고, 다중 사이트를 지원하고, MIT 라이선스입니다.
Plausible Community EditionElixir 애플리케이션 + PostgreSQL + ClickHouse. 컨테이너 4개.Garrison · $7.90목표, 퍼널, 공개 대시보드. 대용량에서도 빠른 쿼리.
MatomoPHP 애플리케이션 + MariaDB, 그리고 예약된 아카이빙 작업.Garrison · $7.90기존 도구와 동등한 기능 — 세그먼트, 코호트, 이커머스, 로그 임포트.
GoAccess웹 서버 접근 로그를 읽는 바이너리 하나. 데이터베이스 없음.이미 운영 중인 것 그대로JavaScript 전혀 없음 — 정적 사이트, 문서, API.

Umami는 특별한 이유가 없다면 가장 먼저 손이 가야 할 도구입니다. 단일 관계형 데이터베이스 위에서 동작하는 Node 애플리케이션으로, 메모리 1기가바이트에도 만족하며, 스키마는 직접 조회할 수 있는 몇 개의 테이블로 이루어져 있고, 리포트는 대부분의 사람이 대시보드를 열어 보고자 하는 것, 즉 페이지, 리퍼러, 국가, 기기, 그리고 원할 때 쓸 수 있는 커스텀 이벤트를 다룹니다. 기본값부터 쿠키가 없으며, 그것을 설정하라고 요구하지도 않습니다.

Plausible Community Edition은 호스팅형 제품을 셀프 호스팅할 수 있게 만든 릴리스이며, 추가되는 구성 요소는 ClickHouse입니다 — 수천만 행에 걸친 집계 쿼리를 즉각적으로 느껴지게 해주는 컬럼 스토어로, 허용하는 만큼 메모리를 사용합니다. 월간 조회수가 수백만을 넘는다면 합리적인 맞교환이지만, 그 아래에서는 다소 어색한 선택이 됩니다. 배포하기 전에 프로젝트의 라이선스 조항을 읽으십시오. 커뮤니티 에디션은 자신의 분석을 직접 운영하기 위한 것이며, 서비스로 재판매하기 위한 것이 아닙니다.

Matomo는 넷 중 유일하게 기존 도구를 기능 대 기능으로 진짜 대체하는 도구이며, 이 말의 솔직함은 양쪽 모두에 적용됩니다. 세그먼트, 퍼널, 코호트, 이커머스 어트리뷰션, 플러그인을 통한 히트맵, 자신의 서버 로그를 가져오는 기능을 얻는 동시에, 원본 테이블이 빠르게 커지고 리포트는 직접 일정을 잡아야 하는 아카이빙 작업으로 미리 계산해 두어야 하는 대형 PHP 애플리케이션도 함께 얻게 됩니다. 그럼에도 눈여겨볼 이유가 두 가지 있습니다. 쿠키를 전혀 설정하지 않도록 구성할 수 있다는 점, 그리고 이를 이용한 관객 측정 구성이 규제 기관이 발표한 동의 예외 도구 목록에 실린 적이 있다는 점입니다 — 블로그 글이 아니라 최신 목록을 직접 확인하십시오, 그래도 이는 문서상 실질적인 강점입니다.

GoAccess는 아무도 권하지 않지만 많은 사람이 선택해야 할 옵션입니다. 이미 여러분의 웹 서버가 기록하고 있는 접근 로그를 읽어, 터미널 리포트나 단일 파일로 완결된 HTML 페이지로 렌더링합니다. 브라우저에서 실행되는 것도, 기기에 저장되는 것도 없으며, 요청 자체를 넘어서는 수집이 없으므로 동의를 물을 필요도 없습니다. 그 대신 포기하는 것은 페이지 내부에서 일어나는 모든 일과, 요청이 아니라 사람을 세고자 하는 희망입니다. 문서 사이트나 정적 블로그라면 이는 흔히 합리적인 맞교환이며 — 다른 도구를 대체하기보다는 그중 하나와 함께 쓰기에 좋습니다.

한 줄로 정리한 결정

Plausible이나 Matomo에서 꼭 필요한 기능이 무엇인지 딱히 떠오르지 않는다면, 필요한 것은 Umami입니다. 20분 안에 배포하고 한 달간 실행해 보십시오. 스스로 답할 수 없는 질문이 생긴다면, 그것이 옮겨야 할지를 알려 줄 것입니다. 나중에 옮기더라도 잃는 것은 이력뿐이고 그 외에는 없으며, 잃게 될 이력도 한 달 치일 뿐입니다.

단계 02 · 프로비저닝

서버 하나, 이름 하나. 먼저 이름을 정하십시오.

VPS를 주문하고, 독자들이 어디에 있는지와 데이터를 어디에 두고 싶은지에 따라 요새(bastion)를 고르십시오 — 스톡홀름, 헬싱키, 오슬로, 레이캬비크는 모두 EEA 안에 있으며, 이것이 바로 핵심입니다. 그런 다음 서버에 다른 무엇이 손대기 전에 첫 시간 보안 강화 절차를 진행하십시오. 키 전용 SSH, 포트 변경, 기본 거부 방화벽, 무인 업데이트까지. 이 시리즈의 모든 가이드에서 동일한 40분이며, 누군가의 1년 치 독자 데이터를 담게 될 서버에서는 선택 사항이 아닙니다.

그런 다음 호스트명을 확정하십시오. 이는 측정하는 모든 사이트의 모든 페이지에 있는 트래킹 스니펫에 박혀 들어가므로, 나중에 바꾼다는 것은 옛 이름이 여전히 방문 기록을 받고 있는 동안 그 모든 페이지를 일일이 고쳐야 한다는 뜻입니다. 두 가지 형태가 통합니다. 측정하려는 사이트의 전용 서브도메인 — 분석 서버 위의 리버스 프록시가 이를 처리하며, 가장 단순하게 작동하는 방법입니다. 또는 그 자체로 독립된 도메인의 중립적인 이름인데, 하나의 인스턴스가 서로 관련 없는 여러 사이트를 서비스하고 각 사이트의 소스가 다른 사이트를 드러내지 않았으면 하는 경우에 씁니다. 더 나아가기 전에 레코드를 만들어 해석되도록 하십시오. 프록시는 처음 시작할 때 인증 기관에 인증서를 요청하며, 그 기관은 외부에서 이름을 확인합니다.

dig +short stats.example.com          # must return the VPS address before you deploy
ufw default deny incoming
ufw allow 47222/tcp                  # administrative SSH, moved off 22
ufw allow 80/tcp                     # ACME challenge and the redirect to 443
ufw allow 443/tcp                    # the dashboard and the collection endpoint
ufw enable && ufw status numbered

포트 세 개, 그 외에는 없습니다. 데이터베이스는 절대 공개하면 안 됩니다. 내부 Docker 네트워크 안에만 있어야 하며, 애플리케이션 컨테이너만 접근할 수 있고 인터넷의 누구도 접근할 수 없어야 합니다. 셀프 호스팅 분석 서버가 스캔 결과에 걸리는 가장 흔한 원인이 바로 이것입니다. 튜토리얼에서 가져온 Compose 파일에 로컬 개발용으로 들어 있던 포트 매핑 때문에, PostgreSQL이나 MySQL 포트가 공개 주소에 바인딩되는 경우입니다.

용량 선정에서는 과도하게 사양을 올리려는 충동을 참으십시오. Sentinel — 2 vCPU, 4 GB, 120 GB NVMe, 월 $3.90 — 이면 여유롭게 Umami와 Postgres를 실행할 수 있고, 월 방문 수가 여섯 자리인 사이트라도 몇 년치 이벤트를 담아 둘 수 있습니다. Plausible을 선택했다면 Garrison — 4 vCPU, 8 GB, 240 GB — 으로 올리십시오. ClickHouse가 그쪽에서 더 편하게 돌아가기 때문입니다. Matomo를 선택했을 때도 마찬가지인데, 아카이빙 작업이 코어를 더 필요로 하기 때문입니다. 대역폭은 모든 등급에서 무제한이며 분석 트래픽은 그에 비하면 오차 범위에 불과합니다. 방문 하나당 몇백 바이트일 뿐입니다.

단계 03 · 배포

컨테이너 두 개와 프록시 하나. 그런 다음 문을 닫으십시오.

아래의 기준 배포는 Umami입니다. 대부분의 독자가 실행해야 할 도구이기도 하고, 그 형태가 일반화되기도 하기 때문입니다. 애플리케이션 컨테이너 하나, 그것만 접근할 수 있고 다른 누구도 접근할 수 없는 데이터베이스 컨테이너 하나, 그리고 인증서를 쥐고 있는 리버스 프록시입니다. Plausible과 Matomo는 컨테이너 수와 변수 이름에서 차이가 있을 뿐 구조는 다르지 않습니다 — 각자의 공식 Compose 파일을 가져와 동일한 세 가지 규칙을 적용하십시오.

세 가지 규칙을, 무시했을 때 치러야 할 대가가 큰 순서로 나열합니다. 모든 이미지를 정확한 태그로 고정하십시오, 절대 유동적인 태그로 두지 마십시오. 관련 없는 재부팅 도중에 조용히 새로운 메이저 버전을 끌어오는 분석 스택은, 여러분이 일정을 잡지 않은 스키마 마이그레이션입니다. 애플리케이션 시크릿은 실제 난수 소스로 생성하고 이를 보관하십시오 — 이는 세션 정보를 암호화하며, 나중에 이를 바꾸면 잘해야 모든 사람이 로그아웃되는 정도로 끝납니다. 데이터베이스 포트는 공개하지 마십시오. 두 컨테이너는 네트워크를 공유하며, 그것이 이들에게 필요한 접근 제어의 전부입니다.

mkdir -p /srv/analytics && cd /srv/analytics
openssl rand -base64 32 > .app_secret      # keep this file; back it up with the database
openssl rand -base64 24 > .db_password
chmod 600 .app_secret .db_password

Compose 파일입니다. 서비스 두 개, 프라이빗 네트워크 하나, 데이터베이스용 명명된 볼륨 하나, 그리고 공개된 포트는 단 하나도 없습니다 — 외부 세계와 이야기하는 것은 오직 프록시뿐입니다.

services:
  umami:
    image: ghcr.io/umami-software/umami:postgresql-v2.x.y   # an exact tag, never :latest
    environment:
      DATABASE_URL: postgresql://umami:CHANGE_ME@db:5432/umami
      APP_SECRET:   CHANGE_ME                                # the openssl output above
    depends_on: [db]
    restart: unless-stopped
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB:       umami
      POSTGRES_USER:     umami
      POSTGRES_PASSWORD: CHANGE_ME
    volumes:
      - umami-db:/var/lib/postgresql/data
    restart: unless-stopped
volumes:
  umami-db:

올바른 TLS 설정에 이르는 가장 짧은 길은 Caddy입니다. 설정 두 줄, cron 작업 없이 발급되고 갱신되는 인증서, 그리고 직접 조사할 필요가 없는 현대적인 기본값까지 갖추고 있습니다. 이미 서버에서 nginx를 쓰고 있다면 nginx를 계속 쓰십시오 — 필요한 것은 앞단의 프록시이지, 특정한 프록시 그 자체가 아닙니다. 어느 쪽이든 분석 애플리케이션이 443번 포트를 직접 리스닝하는 일은 절대 없어야 합니다.

# Caddyfile — Caddy runs as a third service in the same Compose project, so
# "umami" resolves on the internal network. It is the only service that
# publishes ports (80 and 443).
stats.example.com {
    encode zstd gzip
    reverse_proxy umami:3000
}

스택을 띄운 다음, 진짜로 시간이 중요한 일 하나를 처리하십시오. docker compose up -d를 실행하고, 마이그레이션을 기다린 뒤 대시보드를 여십시오. 이 도구들은 하나같이 문서화된 기본 관리자 계정이나 열려 있는 첫 가입 화면을 제공하며, 인증서가 발급되는 순간 호스트명은 이미 공개된 정보가 됩니다. 인증서 투명성 로그는 공개되어 있고 끊임없이 스크래핑되기 때문입니다. 기본 비밀번호를 바꾸고 가입을 막는 일은 첫 로드에 성공한 지 몇 분 안에 하십시오, 내일이 아닙니다.

docker compose up -d
docker compose logs -f umami          # wait for the schema migration to finish
docker compose ps                     # both services healthy, no published ports listed
ss -tlnp | grep -E ':(5432|3306)'     # must print nothing at all
인스턴스의 소유자를 결정짓는 5분

Umami는 지구상의 모든 설치본에서 비밀번호가 동일한, 문서화된 관리자 계정을 그대로 제공합니다. Plausible은 환경에서 가입을 막아 두지 않으면 첫 방문자가 소유자가 됩니다. Matomo는 첫 방문자를 슈퍼유저를 생성하는 설치 과정으로 안내합니다. 세 경우 모두 "인증서가 존재한다"와 "로그인을 마쳤다" 사이의 시간은, 다른 누군가가 대신 로그인할 수 있는 시간이며 — 그들은 호스트명을 추측할 필요조차 없습니다, 이미 그들을 위해 공개되어 있으니까요. 먼저 로그인해서 자격 증명을 바꾸고, 가입 스위치를 닫음으로 설정한 다음, 페이지를 새로고침해서 적용되었는지 확인하십시오.

단계 04 · 계측

태그 하나. 그런 다음 그것이 어느 도메인에 놓일지 정하십시오.

대시보드에서 사이트를 등록하고, 발급받은 식별자를 복사한 다음, 지연 로딩되는 스크립트 태그 하나를 템플릿에 넣으십시오 — head든 body 끝이든 크게 상관없지만, 어느 쪽이든 지연 로딩이어야 페이지를 절대 지연시키지 않습니다. 이것이 통합 작업의 전부입니다. 태그 매니저도, 컨테이너도, 데이터 레이어도, 동의 모드 연동도 없으며, 바로 그 부재가 여러분이 이 도구를 찾은 이유의 대부분입니다.

<script defer src="https://stats.example.com/script.js"
        data-website-id="00000000-0000-0000-0000-000000000000"></script>

사이트의 페이지 하나를 로드한 다음 대시보드를 확인하십시오. 방문 기록은 몇 초 안에 나타나야 합니다. 그렇지 않다면 브라우저 콘솔과 네트워크 탭이 1분 안에 답을 줍니다 — 흔한 실패 유형은 두 가지로, 잘못 입력된 식별자 때문에 요청은 받아들여지지만 버려지는 경우와, 요청이 아예 나가지도 않는 경우인데 후자는 확장 프로그램이 삼켜 버렸다는 뜻입니다. 수치를 읽기 시작하기 전에 자신의 트래픽은 제외하십시오. 그러지 않으면 일주일 동안 자신의 새로고침이 최상위 리퍼러 자리를 차지하게 됩니다.

이제 고민해 볼 만한 결정이 남았습니다. 위 스니펫은 사이트 자체가 아닌 호스트명으로 요청을 보내는데, 방문자 중 일부는 이런 요청을 패턴 기반으로 차단하는 소프트웨어를 실행하고 있습니다. 필터 목록은 잘 알려진 파일명 — 벤더 고유의 스크립트 이름으로 끝나는 모든 것 — 과 잘 알려진 호스팅 도메인을, 그것이 어떤 서버를 가리키는지와 무관하게 잡아냅니다. 해결책은 두 부분으로 이루어집니다. 트래커 이름처럼 보이지 않는 이름으로 스크립트 파일과 수집 엔드포인트의 이름을 바꾸는 것인데, 이 도구들은 모두 이를 지원합니다. 그리고 기존 프록시가 전달하는 경로를 통해 사이트 자체의 오리진에서 이를 제공하는 것입니다. 그러면 차단할 제3자 요청이 더 이상 남지 않게 됩니다.

# On the site's own web server — the two paths the tracker needs, first-party:
example.com {
    handle /p/s.js      { reverse_proxy https://stats.example.com { header_up Host stats.example.com } }
    handle /p/collect   { reverse_proxy https://stats.example.com { header_up Host stats.example.com } }
    # ... the rest of the site
}

이것이 절반만 작동하지 않고 제대로 작동하게 만드는 세부 사항이 두 가지 있습니다. 프록시는 분석 애플리케이션이 신뢰하도록 설정된 헤더에 방문자 주소를 담아 전달해야 하며, 그러지 않으면 모든 방문이 여러분 자신의 웹 서버에 귀속되어 국가별 리포트가 막대 하나로만 나오게 됩니다. 그리고 트래커는 데이터를 어디로 보낼지 알아야 하는데, 이는 세 도구 모두에서 스크립트 태그의 데이터 속성으로 지정됩니다 — 엔드포인트를 다시 지정하지 않고 파일 이름만 바꾸면, 로드는 되지만 아무 곳에도 보고하지 않는 스크립트가 됩니다.

이것이 또한 측정이라는 이야기의 솔직한 끝입니다. JavaScript를 꺼 둔 방문자, 혹은 엄격한 필터 목록에 퍼스트파티 대상 차단 규칙까지 더한 방문자는 집계되지 않으며, 그런 방문자를 좇는 데 어떤 엔지니어링 노력도 들여서는 안 됩니다 — 네트워크 수준의 필터는 명시적으로 표현된 선호이며, 이에 대한 정중한 대응은 아무것도 추가로 수집하지 않으면서도 그들을 세어 주는 서버 로그입니다. 이벤트와 단일 페이지 애플리케이션은 계측의 나머지 절반입니다. 모든 도구가 커스텀 이벤트를 위한 작은 함수를 제공하며, 이들 모두는 라우트 변경 시 명시적인 호출이 필요합니다. 내비게이션 없이 화면을 바꾸는 프레임워크는 스크립트가 감지할 페이지 로드를 전혀 발생시키지 않기 때문입니다.

단계 05 · 준수

법률은 하나가 아니라 둘. 인터넷 대부분은 이 둘을 뭉뚱그립니다.

분석 도구에 배너가 필요한지를 두고 사람들이 합의하지 못하는 이유는, 서로 다른 두 규칙을 하나인 것처럼 놓고 다투기 때문입니다. 이 둘을 분리하면 답은 다룰 만해집니다. ePrivacy 지침 5(3)조 — 모든 회원국의 국내법으로 전환되었으며, 실제로 쿠키 배너의 근원이 되는 조항입니다 — 는 가입자의 단말 장비에 정보를 저장하거나, 이미 저장된 정보에 접근하는 데에는 그들이 명시적으로 요청한 서비스를 제공하는 데 반드시 필요한 경우가 아니라면 동의가 필요하다고 규정합니다. 이 조항이 말하지 않는 것에 주목하십시오. 쿠키라고 말하지 않고, 개인정보라고도 말하지 않습니다. 이는 localStorage도 포착하고, 기기 핑거프린팅도 포착하며, 누구도 식별하지 못하는 값에조차 적용됩니다.

GDPR은 두 번째 규칙으로, 다른 질문을 규율합니다. 즉 개인정보를 손에 넣은 뒤 그것으로 무엇을 할 수 있는가입니다. 여러분의 분석 도구가 기기에 무언가를 저장하는지 여부와 무관하게 적용되는데, 웹 요청은 IP 주소를 전달하며 유럽사법재판소가 Breyer 사건(C-582/14)에서 IP 주소가 웹사이트 운영자의 손에서는 개인정보가 될 수 있다고 판단했기 때문입니다. 따라서 두 규칙은 겹쳐 적용됩니다. 5(3)조는 기기에 무언가를 기록했는가를 묻고, GDPR은 도착한 것으로 무엇을 했는가를 묻습니다.

쿠키를 쓰지 않는 분석 서버는 이 두 질문 모두에 좁게 답하도록 만들어져 있습니다. 기기에는 아무것도 저장하지 않습니다 — 쿠키도, localStorage 항목도, 어떤 종류의 식별자도 없습니다 — 이는 저장도 저장소 접근도 없기 때문에 5(3)조를 처음부터 적용 대상에서 제외시킵니다. 그리고 어쩔 수 없이 수신하게 되는 IP 주소를 사용자 에이전트, 사이트, 그리고 매일 회전하는 비밀 솔트와 결합해 해시를 만들고, 해시만 보관한 뒤 주소는 버립니다. 이 해시는 하루 안에서는 두 방문자를 구별할 수 있게 해 주지만 솔트가 회전하는 순간 쓸모가 없어지며, 바로 그래서 같은 사람이라도 다음 날에는 새로운 방문자로 집계됩니다. 이 처리는 실재하는 처리이며, 처리라는 것이 가질 수 있는 최소 수준에 가깝습니다.

남는 것은 이 좁은 처리 작업을 위한 법적 근거이며, 실무적으로 운영자들은 6(1)(f)조의 정당한 이익에 의존하고, 사실관계가 단순하기 때문에 짧게 작성되는 이익 균형 평가서로 이를 문서화합니다. 프로파일링 없음, 공유 없음, 사이트 간 추적 없음, 매일 소멸하는 가명, 정해진 보관 기간입니다. 여러 감독 기관은 여기서 한 걸음 더 나가, 엄격히 제한된 관객 측정이 동의 대상에서 완전히 제외되는 기준을 발표했습니다 — 그 기준은 국가마다 다르고 계속 갱신되며, 여러분에게 중요한 것은 여러분 자신의 관할권 기준입니다. 이는 법률 자문이 아닙니다. 이것은 어떤 법적 문서가 적용되는지를 보여 주는 지도일 뿐이며, 그래야 여러분이 구하는 자문이 문제의 일반적인 형태가 아니라 여러분 자신의 상황에 관한 것이 될 수 있습니다.

질문 애드테크 분석 태그 쿠키 없음, EEA 내 셀프 호스팅
방문자의 기기에 기록하나요?예 — 그래서 5(3)조 동의가 적용됨아니요 — 5(3)조가 적용되지 않음
지속적인 식별자를 보관하나요?사이트 전체에 걸쳐 몇 달에서 몇 년까지매일 만료되는 솔트 해시
문서화해야 할 제3국 이전이 있나요?예, 유지해야 할 이전 메커니즘과 함께없음 — 서버가 EEA 안에 있음
명시하고 계약해야 할 처리자들벤더와 그 하위 처리자들하드웨어에 대해서는 여러분의 호스트, 그 외에는 아무도 없음
정보주체 열람 요청에 답할 수 있는 사람여러분, 존재하는 내보내기 기능을 통해여러분, SQL로 — 그리고 흔히 돌려줄 것이 아무것도 없음

파일에는 한 줄이 더 필요합니다. 이것이 바로 이 모든 작업을 하는 조용한 이유이기 때문입니다. 유럽 방문자의 데이터를 미국 분석 서비스로 보내는 것이 합법인가는 10년째 다투어지고 있는 문제입니다. 유럽사법재판소는 2020년 Schrems II 판결(C-311/18)에서 기존의 이전 체계를 무효화했고, 2022년에는 여러 국가 감독 기관이 이를 근거로 표준 분석 태그에 불리한 판단을 내렸습니다 — 1월 오스트리아, 2월 프랑스, 6월 이탈리아, 그리고 그 뒤를 이은 다른 국가들. 그리고 새로운 적정성 결정인 EU-US 데이터 프라이버시 프레임워크가 2023년 7월 이전 경로를 복원했지만, 그 자체도 이의 제기를 받고 있습니다. 이것이 어떻게 끝날지에 대해 의견을 가질 필요는 없습니다. 헬싱키에 있는 서버는 그 질문 자체를 파일에서 영구히 없애 주며, 그것은 지금 상태에 대해 옳은 판단을 하는 것보다 더 값어치가 있습니다.

단계 06 · 보존

보관 기간, 백업, 업그레이드. 그리고 여러분이 잊고 있던 로그.

보관 기간은 첫날에 정하십시오. 그때는 아직 추상적인 숫자일 뿐이지, 여러분이 애착을 갖게 된 1년 치 데이터가 아닙니다. 이 도구들은 모두 원본 이벤트를 일정에 따라 삭제하면서 집계된 요약은 남겨 둘 수 있습니다. 12개월치 상세 데이터면 거의 모든 목적에 넉넉하며, 이는 "얼마나 오래 보관하나요"라는 질문에 대한 솔직한 답이 "무기한"이 아니라 구체적인 숫자가 된다는 뜻입니다. 이는 또한 디스크 문제가 시작되기 전에 해결해 주는데, 원본 테이블이 계속 커지는 Matomo에서 특히 중요합니다.

데이터베이스는 이 서버가 아닌 다른 곳에 백업하고, 나가는 길에 암호화하십시오 — 전체 내용은 백업 가이드를 참고하시고, 짧게 말하면 매일 밤 덤프를 떠서 이상적으로는 다른 관할권에 있는 두 번째 서버의 추가 전용(append-only) 저장소로 파이프하는 방식입니다. 애플리케이션 시크릿도 함께 백업하십시오. 복원할 수 있는 데이터베이스와 복원할 수 없는 시크릿이 합쳐지면 아무도 로그인할 수 없는 대시보드가 됩니다. 그런 다음, 필요해지기 전에 일부러 한 번 임시 VPS에 복원해 보십시오.

docker compose exec -T db pg_dump -U umami umami | zstd -q -o /srv/backup/umami-$(date -u +%F).sql.zst
restic -r sftp:backup@bastion-2:/srv/repo backup /srv/backup /srv/analytics/.app_secret
restic -r sftp:backup@bastion-2:/srv/repo forget --keep-daily 7 --keep-weekly 8 --prune

업그레이드는 일반적인 컨테이너 버전 갱신보다 조금 더 신경 써야 합니다. 이 애플리케이션들은 스키마를 소유하고 있기 때문입니다. 건너뛰게 되는 메이저 버전들의 릴리스 노트를 읽고, 백업은 나중이 아니라 먼저 받으십시오. 그런 다음 고정된 태그를 바꾸고 로그를 지켜보면서 스택을 올리십시오 — 절반쯤 실패하는 마이그레이션은 지난밤 덤프가 있으면 복구할 수 있지만, 없으면 매우 골치 아픈 일이 됩니다. 새 릴리스가 나온 그 주에 곧바로 올라탈 이유는 없으며, 그러지 않을 좋은 이유는 있습니다.

이 모든 노력을 무너뜨리는 로그

여러분은 방금 IP 주소를 절대 저장하지 않도록 의도적으로 설계된 스택을 배포했습니다. 그런데 불과 몇 미터 옆에서는, 여러분의 리버스 프록시가 방문자 한 명 한 명의 전체 IP 주소를 평문으로 접근 로그에 기록하고, 기본 순환 설정이 정한 기간만큼 보관하고 있습니다 — 분석 서버와, 여러분의 실제 사이트 앞에 있는 웹 서버 모두에서 말입니다. 그 로그는 분석 데이터베이스보다 더 크고 더 민감한 데이터셋이며, 여러분이 책임져야 할 처리 작업인데도 거의 아무도 이를 기억하지 못합니다. 그 로그가 무엇을 위한 것인지 정하십시오. 디버깅용일 뿐이라면 로그 형식에서 마지막 옥텟을 잘라내거나 마스킹하고 적극적으로 순환시키십시오. 로그 기반 측정을 위한 것이라면 정책에 그렇게 적고 실제 보관 기간을 부여하십시오. 해서는 안 되는 일은 기본값 그대로 두면서 여러분의 사이트가 IP 주소를 수집하지 않는다고 설명하는 것입니다.

마지막으로, 솔직하게 인정해야 할 한계가 있습니다. 셀프 호스팅 카운터가 여러분이 걷어낸 것보다 무조건 더 나은 버전은 아니기 때문입니다. 기기 간, 날짜 간 동일성을 잃게 되므로, 재방문자라는 말은 예전보다 좁은 의미를 갖게 됩니다. 광고 플랫폼과의 연동도 잃게 되는데, 이는 트래픽을 구매한다면 중요하지만 그렇지 않다면 무관합니다 — 검색 콘솔 데이터는 별개의 제품이며 영향을 받지 않습니다. 업그레이드와 백업이라는 짐을 지게 되며, 이는 저녁 시간으로 측정되는 실질적인 반복 비용입니다. 그리고 서버 자체가 보호할 가치가 있는 대상이 됩니다. 여러분의 독자층을 담고 있고, 공용 인터넷에 노출되어 있으며, 보안 강화 체크리스트와 대시보드로의 프라이빗 경로가 이를 별일 없이 조용하게 유지해 주는 두 가지입니다.

현장 노트 · 여섯 가지 함정

이 일이 잘못될 수 있는 여섯 가지 방식. 그중 둘은 조용히 일어납니다.

함정 01 · 치명적임

누구나 아는 기본 비밀번호

이 도구들 중 하나는 지구상의 모든 설치본에 동일한 관리자 자격 증명을 그대로 제공하며, 나머지는 가장 먼저 가입하는 사람에게 소유권을 넘깁니다. 호스트명은 TLS가 작동하는 순간 인증서 투명성 로그에 공개됩니다. 로그인해서 자격 증명을 바꾸고 가입을 막으십시오 — 첫 5분 안에, 내일이 아니라.

함정 02 · 치명적임

튜토리얼에 나온 데이터베이스 포트

노트북용으로 작성된 Compose 파일은 작성자가 GUI에서 접속할 수 있도록 5432번이나 3306번 포트를 공개합니다. 그런 파일을 그대로 공개 서버에 복사해 넣으면, 독자 테이블까지의 거리는 비밀번호 추측 한 번뿐입니다. 애플리케이션 컨테이너는 내부 네트워크를 통해 데이터베이스에 접근하므로, 프록시 외에는 아무것도 공개할 필요가 없습니다.

함정 03 · 법적 문제

셀프 호스팅이면 예외라고 가정하기

소프트웨어를 자신의 서버로 옮기는 것은 이전(transfer) 문제와 처리자(processor) 문제에 답을 줍니다. 하지만 그런 다음 기기에 무언가를 기록하는 기능을 켠다면 5(3)조에는 답이 되지 않으며, 여러분의 프라이버시 정책을 대신 써 주지도 않습니다. 예외는 호스팅의 속성이 아니라 설정의 속성입니다.

함정 04 · 조용함

모든 방문자가 같은 국가에서 오는 것으로 나타남

클라이언트 주소를 전달하지 않는 리버스 프록시를 쓰면 모든 방문이 프록시 자신에게서 온 것처럼 보이게 됩니다. 대시보드는 데이터로 가득 차고 총합은 그럴듯해 보이지만, 지역과 순 방문자 수 열은 조용히 허구가 됩니다. 국가별 통계는 분기 리뷰가 아니라 첫날 확인하십시오.

함정 05 · 조용함

여전히 보관하고 있는 접근 로그

이 스택을 선택한 이유는 IP 주소를 결코 저장하지 않기 때문입니다. 하지만 그 앞의 프록시는 기본값으로 IP 주소를 하나하나 평문으로 저장하며, 여러분의 실제 사이트 앞에 있는 웹 서버도 마찬가지입니다. 이를 의도적으로 마스킹하거나 순환시키고, 정책에도 명시하십시오 — 그러지 않으려면 그것들을 수집하지 않는다는 주장을 그만두십시오.

함정 06 · 피할 수 있음

옛 수치를 좇는 일

새 합계는 옛 합계와 일치하지 않을 것이며, 어떤 설정으로도 일치시킬 수 없습니다. 계산 규칙이 다르고, 차단되는 비율이 다르며, 표본을 걸러내는 배너도 없습니다. 2주를 들여 자신만의 비율을 파악한 다음, 새 수치를 기준선으로 삼고 두 정의를 맞추려는 시도는 그만두십시오.

FAQ · 셀프 호스팅 분석

질문들, 답변됨.

이 작업을 하면서 나오는 열한 가지 질문 — 모두가 양쪽 방향으로 잘못 이해하는 질문부터 시작합니다.

셀프 호스팅하면 쿠키 배너를 정말로 없앨 수 있나요?

흔히 그렇습니다. 다만 그 이유는 "셀프 호스팅이면 괜찮다"보다 더 정밀합니다. 여기에는 두 개의 별개 규칙이 작동합니다. ePrivacy 지침 5(3)조 — 흔히 쿠키법이라 부르는 그 조항 — 은 방문자가 요청한 서비스에 반드시 필요한 경우가 아니라면, 방문자의 기기에 정보를 저장하거나 그로부터 정보를 읽어 오는 데 동의를 요구합니다. 이는 쿠키뿐 아니라 localStorage, sessionStorage, 그 외에 남겨 두는 모든 것에 적용되며, 그 데이터가 개인정보인지 여부와도 무관하게 적용됩니다. 기기에 아무것도 기록하지 않는 도구는 이 조항을 그저 발동시키지 않습니다. GDPR은 두 번째 규칙이며 이는 사라지지 않습니다. 모든 요청에서 여전히 IP 주소와 사용자 에이전트 문자열을 수신하게 되며, IP 주소는 웹사이트 운영자의 손에서는 개인정보입니다(유럽사법재판소, Breyer 사건, C-582/14). 쿠키를 쓰지 않는 분석 서버가 하는 일은, 매일 회전하는 솔트로 그 IP를 해시한 뒤 폐기하는 것입니다. 그래서 데이터베이스에 남는 것은 한 사람이 아니라 하루 단위, 사이트 단위의 가명입니다. 이는 좁고 잘 문서화된 처리 작업으로, 대부분의 운영자가 정당한 이익을 근거로 삼고 있으며, 여러 감독 기관이 순수한 관객 측정이 동의 대상에서 제외되는 기준을 발표한 바 있습니다. 이는 정당화 가능한 입장이지 마법의 단어가 아닙니다. 무엇을, 왜, 얼마나 오래 수집하는지를 적어 두고, 벤더의 랜딩 페이지가 아니라 여러분 자신의 규제 기관이 낸 지침을 읽으십시오. 이 페이지의 어떤 내용도 법률 자문이 아닙니다.

고민하고 싶지 않다면 어떤 것을 골라야 하나요?

Umami입니다. 단일 Node 애플리케이션과 PostgreSQL 데이터베이스 하나로 이루어져 있고, 메모리 1 GB 안에서도 편안하게 돌아가며, 대시보드는 처음 봐도 읽기 쉽고, 기본값부터 쿠키가 없으며, 인스턴스 하나로 여러분이 소유한 모든 사이트를 즐겁게 서비스할 수 있습니다. 블로그, 문서 사이트, 상점, 회사 사이트에서 Google Analytics를 교체하려는 압도적 다수의 사람들에게는 이것이 정답이며, 나머지 셋은 굳이 겪지 않아도 될 고민입니다. 대신 퍼널, 수익 목표, 더 강력한 공개 대시보드를 원하고 그를 위해 ClickHouse를 기꺼이 운영하겠다면 Plausible Community Edition을 고르십시오. 세그먼트, 코호트, 커스텀 리포트, 이커머스 어트리뷰션, 원본 로그 임포트 등 Google Analytics의 기능 집합이 정말로 필요하고, 예약된 아카이빙 작업이 딸린 대형 PHP 애플리케이션을 운영하는 것을 받아들일 수 있다면 Matomo를 고르십시오. 페이지에 JavaScript를 전혀 두고 싶지 않다면 GoAccess를 고르십시오.

수치가 Google Analytics와 일치하지 않는 이유는 무엇인가요?

이 둘은 서로 다른 것을 세고 있으며, 그 차이는 두 방향으로 동시에 벌어지기 때문입니다. 위쪽 방향: 동의 배너 뒤에 있는 Google Analytics는 수락 버튼을 누른 방문자만 볼 수 있는데, 유럽에서는 이 비율이 흔히 절반 정도이며, 배너 없는 쿠키리스 카운터는 모든 사람을 봅니다. 또 다른 위쪽 방향: 새 엔드포인트는 여러분 자신의 도메인에 있으며, 잘 알려진 트래커로 가는 요청을 걸러내는 필터 목록에 올라 있지 않습니다. 아래쪽 방향: 매일 회전하는 해시는 내일의 같은 사람을 알아보지 못하므로, 월요일과 목요일에 방문한 독자는 재방문자 한 명이 아니라 방문자 두 명으로 집계됩니다 — 세션은 하루 안에서만 이어지고 날짜나 기기를 넘어서는 이어지지 않습니다. 또 다른 아래쪽 방향: 대부분의 셀프 호스팅 도구는 보수적인 봇 필터를 기본 제공하며 Discover식의 부풀림이 없습니다. 실용적인 조언은 두 수치를 맞추려는 시도를 그만두는 것입니다. 2주 동안 두 도구를 함께 돌려서 자신만의 비율을 파악하고, 그것을 메모지에 적어 둔 다음, Google 태그를 삭제하고 새 수치를 이제부터의 기준선으로 사용하십시오. 의사 결정에서 중요한 것은 추세의 모양과 페이지·소스 간의 상대적 순위이며, 둘 다 이전 과정에서 그대로 유지됩니다.

광고 차단기가 제 인스턴스도 차단하나요?

부분적으로는 그렇습니다. 그리고 그 정확한 방식을 아는 것은 그럴 만한 가치가 있습니다. 그 작동 방식이 사람들이 짐작하는 것보다 훨씬 단순하기 때문입니다. 대형 필터 목록은 패턴으로 작동합니다. 호스팅형 서비스들의 호스트명, 그리고 널리 알려진 파일명과 경로명 몇 가지입니다 — plausible.js, umami.js, matomo.php로 끝나는 요청은 어떤 서버로 가든 알아볼 수 있습니다. 소프트웨어를 stats.example.com으로 옮기더라도 기본 파일명을 그대로 쓴다면 여전히 일부 기술 성향 방문자를 잃게 됩니다. 정직한 해결책은 두 가지이며, 서로 겹쳐 적용됩니다. 스크립트와 수집 엔드포인트의 이름을 트래커 이름처럼 보이지 않는 것으로 바꾸십시오 — 이 도구들은 모두 이를 지원하며, 설정 한 줄이면 됩니다. 그리고 리버스 프록시가 전달하는, 메인 도메인의 한 경로를 통해 사이트 자체와 같은 오리진에서 이를 제공하십시오. 그러면 차단할 제3자 요청이 남지 않습니다. 이 둘을 합치면 손실 대부분을 되찾을 수 있습니다. 전부를 되찾지는 못할 것이고, 그러기를 바라서도 안 됩니다. 엄격한 필터 목록에 JavaScript까지 꺼 둔 방문자는 이미 하나의 선택을 한 것이고, 그에 대한 올바른 대응은 군비 경쟁이 아니라 서버 로그입니다.

스크립트를 자체 도메인으로 프록시하는 것은 다크 패턴인가요?

물어볼 만한 질문이며, 답은 그 차단기가 무엇을 막아 주고 있었는지에 달려 있습니다. 필터 목록에는 뭉뚱그린 도구 하나와 매우 다른 두 대상이 있습니다. 한 사람을 만 개의 사이트에 걸쳐 추적해 프로필을 만드는 애드테크 네트워크와, 어느 사이트 운영자에게 자신의 문서 페이지가 어제 400번 읽혔다고 알려 주는 카운터입니다. 첫 번째를 막는 것은 감시에 맞서 스스로를 지키는 행동입니다. 두 번째를 막는 것은 둘을 구별하지 못하는 규칙이 낳은 부수적 피해입니다. 자신의 카운터를 자신의 도메인에서 제공하는 것은 방어망을 뚫고 트래커를 밀반입하는 일이 아니라, 원래 존재할 필요가 없었던 제3자 요청 하나를 없애는 일이며, 어차피 같은 방문은 여러분의 접근 로그에도 한 줄을 남깁니다. 이것이 정당화되지 않는 지점은, 프록시하는 대상이 여기서 설명한 것과 다른 것이 되는 순간입니다 — 사이트 간 식별자나 핑거프린팅, 혹은 광고 플랫폼으로의 파이프라인을 추가한다면 차단기가 옳았던 것이고 프록시는 거짓이 됩니다. 검증은 간단하며 한 번쯤 스스로에게 적용해 볼 만합니다. 이 엔드포인트가 정확히 무엇을 수집하는지 설명하는 페이지를 공개할 수 있고, 독자가 그것을 보고 어깨를 으쓱하고 넘길 수 있겠습니까? 그렇다면 프록시하십시오. 그렇지 않다면 문제는 프록시가 아닙니다.

VPS는 실제로 얼마나 커야 하나요?

걱정하는 것보다는 작으며, 예외가 하나 있습니다. Umami는 Node 프로세스와 Postgres 데이터베이스로 이루어져 있습니다. 일반적인 사이트라면 메모리 1 GB 아래에서 안정되고, 데이터베이스는 페이지뷰당 텍스트 한 줄 정도의 크기로 커지므로, Sentinel — 2 vCPU, 4 GB, 120 GB NVMe, 월 $3.90 — 이면 몇 년치 여유가 있습니다. GoAccess는 거의 무시할 수 있는 수준입니다. Matomo는 중간쯤에 있습니다. PHP와 MariaDB는 아카이빙 작업이 돌기 전까지는 크게 요구하지 않지만, 그 작업이 바로 사양을 맞춰야 하는 CPU 스파이크이며, 원본 테이블은 방문당 더 많은 것을 저장하기 때문에 다른 도구보다 더 빠르게 커집니다. 예외는 Plausible Community Edition이며, 그 이유는 Plausible이 아니라 ClickHouse에 있습니다. 컬럼 스토어는 메모리를 희생해 쿼리 속도를 얻도록 만들어져 있어서, 남겨 둔 만큼 마음대로 가져다 씁니다. 제공되는 설정에서 캐시를 제한하면 4 GB에서도 돌아가고, 8 GB에서는 여유롭습니다 — 이것이 바로 $7.90의 Garrison 등급이 이 도구에는 합리적인 최저선인 이유입니다. 어느 경우든 결국 업그레이드를 강제하는 수치는 메모리가 아니라 디스크이며, 6단계에서 이를 막는 방법을 다룹니다.

하나의 인스턴스로 여러 사이트를 측정할 수 있나요?

네, 그리고 이는 이 도구들을 운영하는 일반적인 방식입니다. JavaScript 기반 세 도구 모두 설계상 다중 사이트를 지원합니다. 대시보드에서 각 도메인을 등록하면 각각 고유한 식별자를 받고, 같은 스크립트 엔드포인트가 이들 모두의 방문 기록을 받아들이면서도 리포트는 분리해서 유지합니다. 서버 하나, 인증서 하나, 백업 하나, 업그레이드 하나로 스무 개의 사이트를 처리할 수 있습니다. 목록이 늘어날 때 유의할 점이 두 가지 있습니다. 리포트는 사이트별로 분리되므로, 고객을 위해 사이트를 관리한다면 모두에게 관리자 계정을 넘겨주는 대신 도구 자체의 사용자·팀 권한 기능을 쓰십시오. 그리고 공유 인스턴스가 어떤 의미를 갖는지 계약으로 합의하기 전에 확인하십시오. 여러분이 그들의 방문자 데이터를 쥐고 있는 당사자가 되기 때문입니다. 또한 트래킹 엔드포인트는 공유된 이름이므로, 이를 제공하는 도메인이 목록에 있는 모든 사이트의 소스에 나타나게 됩니다 — 경쟁사가 페이지 소스를 살펴보는 고객에게는 언급할 가치가 있는 사실이며, 4단계에서 다룬 퍼스트파티 경로를 택해야 할 근거이기도 합니다.

정말 JavaScript가 필요한가요? 서버 로그를 분석하는 방법은요?

많은 부류의 사이트에서는 로그만으로 충분하며, 이는 이용 가능한 측정 방법 중 가장 솔직한 방법입니다. 이미 존재하는 줄(라인)일 뿐이므로 추가로 수집하는 것이 전혀 없기 때문입니다. GoAccess는 웹 서버 접근 로그를 읽어 터미널 리포트나 단일 파일로 완결된 HTML 대시보드를 만들어 냅니다 — 인기 페이지, 리퍼러, 상태 코드, 대역폭, 응답 시간, 사용자 에이전트까지. 정적 사이트, 문서 세트, API라면 이것이 스크립트 태그가 알려 줄 내용의 대부분입니다. 이것이 충분한지는 두 가지 한계가 결정합니다. 로그는 페이지 내부에서 일어나는 일을 볼 수 없습니다. 스크롤 깊이도, 아웃바운드 링크 클릭도, 버튼 이벤트도, 단일 페이지 애플리케이션의 라우트 변경도 알 수 없는데, 이들 중 어느 것도 서버에 닿지 않기 때문입니다. 그리고 로그는 사람이 아니라 요청을 세므로, 캐싱과 이제는 원본 트래픽의 다수를 차지하는 봇 무리에 좌우됩니다 — 필터링은 설정 단계가 아니라 영구적인 유지보수 작업입니다. 여기에는 예상과는 반대 방향의 프라이버시 함정도 있으며, 6단계에서 이를 다룹니다. 지금 분석하고 있는 그 로그에는 전체 IP 주소가 담겨 있는데, 이는 여러분이 거부했던 JavaScript 도구가 보관하던 것보다 더 많은 개인정보입니다.

Google Analytics 기록을 가져올 수 있나요?

현실적으로는 불가능하며, 그것과 싸우기보다는 그것을 전제로 계획을 세우는 편이 낫습니다. 넷 중 진지한 임포트 방법을 갖춘 것은 Matomo뿐이며, 그마저도 실질적인 방법은 자신의 웹 서버 로그를 임포트하거나 이전 Matomo 인스턴스를 위한 마이그레이션 도구를 쓰는 것이지, Google이 가공한 리포트를 그대로 옮기는 방법은 아닙니다. Umami와 Plausible Community Edition은 매핑을 직접 작성할 준비가 되어 있다면 API를 통해 일괄 로드를 받아들일 수는 있지만, 그렇게 하면 집계된 데이터로부터 세션과 방문자를 사실상 지어내는 셈이 되고, 결과물은 연속적으로 보이지만 접합점 너머로는 비교할 수 없는 그래프가 됩니다. 실제로 효과가 있는 방법은 이렇습니다. 속성이 사라지기 전에 신경 쓰는 리포트를 Google에서 내보내십시오 — 월간 합계, 인기 페이지, 인기 소스, 전환 수 — CSV로 받아 다른 기록들과 같은 곳에 보관하고, 새 도구는 적어 둔 날짜를 기준으로 새로운 기준선에서 시작하십시오. 그 옛 내보내기 파일은 첫 해에 두 번 정도 참고하고 그 후로는 다시 볼 일이 없을 것이며, 어차피 그 안의 모든 수치는 다른 정의 아래서 측정된 것입니다.

프라이버시 정책에 실제로 무엇을 적어야 하나요?

생각보다 적으며, 짧다는 것 자체가 핵심입니다 — 스스로 옹호할 수 있는 한 단락이 어디선가 복사해 온 한 페이지보다 낫습니다. 어떤 도구인지, 그것을 직접 운영하고 있다는 사실을 밝히십시오. 서버의 위치와 법적 운영자 이름도 밝히십시오. "핀란드에서 대여한 서버에서"라고 말할 수 있다는 것이야말로 이 모든 작업의 핵심 이득이기 때문입니다. 방문마다 어떤 것이 기록되는지 밝히십시오. 페이지, 리퍼러, 국가, 기기 및 브라우저 종류, 그리고 매일 바뀌는 솔트로 IP 주소와 사용자 에이전트로부터 만들어 낸, 원래 IP를 복원할 수 없는 가명 식별자입니다. 무엇이 기록되지 않는지도 밝히십시오. 쿠키 없음, 사이트 간 식별자 없음, 프로필 없음, 판매되거나 공유되는 데이터 없음. 근거로 삼는 법적 근거와 보관 기간을 명시하고, 여러분이 적는 수치가 도구에 실제로 설정된 수치와 같은지 확인하십시오. 리버스 프록시가 접근 로그를 보관하고 있다면, 이는 별도의 보관 기간을 가진 별개의 처리 작업입니다 — 이를 언급하십시오, 사람들이 가장 자주 빠뜨리는 부분이기 때문입니다. 그런 다음 그 단락을 실제 설정과 계속 일치시키십시오. 2년 전의 설정을 설명하는 정책은 모호한 정책보다도 못합니다.

페이지 조회수만 담고 있는 서버인데 호스트가 왜 중요한가요?

"페이지 조회수일 뿐"이라는 말은 분석 데이터베이스가 실제로 무엇인지 과소평가하는 표현이기 때문입니다. 1년 치를 모아 보면 그것은 여러분 사이트의 독자층 그 자체입니다 — 어떤 페이지를, 어떤 순서로, 어느 국가에서, 몇 시에, 어떤 링크를 통해 들어왔는지. 소규모 발행인이나 니치 상점에게는 이것이 사업 계획서와 소스 목록을 한 테이블에 담아 놓은 것과 같습니다. 그리고 관할권의 관점에서 보면, 이는 정확히 상대측이 여러분이 아니라 제공업체에게 요구할 종류의 데이터이기도 합니다. 여기서 두 가지 특성이 따라옵니다. 서버가 어디에 있는지는 어떤 법적 절차가 그 서버에 도달할 수 있는지를 결정합니다. 스톡홀름, 헬싱키, 오슬로, 레이캬비크에 있는 서버는 EEA 내부에 위치하므로 국제 이전 문제 자체가 컴플라이언스 파일에서 완전히 사라지며, 언론 자유 전통이 강한 네 헌정 체제 안에 놓이게 됩니다. 그리고 계정에 누구의 이름이 올라 있는지는 그 계정 자체가 무엇을 드러내는지를 결정합니다. NordBastion에서는 신분증도, 법적 이름도, 카드도 없으며, 청구는 Monero나 Bitcoin으로 결제되고, 여러분의 독자층을 담고 있는 서버는 여권이 첨부된 어딘가의 고객 데이터베이스 한 행이 아닙니다. 관할권 가이드에서 네 곳 각각의 법적 기준선을 자세히 다룹니다.

서버를 확보하십시오

여러분의 독자층, EEA 안에 있으며 여러분의 이름으로 등록되지 않은 서버 위에.

Sentinel — 헬싱키, 스톡홀름, 오슬로, 레이캬비크에서 월 $3.90에 2 vCPU, 4 GB, 120 GB NVMe — 는 Umami와 그 데이터베이스를 몇 년치 이벤트를 담을 여유와 함께 실행합니다. Plausible이나 Matomo를 선택했다면 $7.90의 Garrison으로 올리십시오. 가입 시 이메일도, 신분증도, 카드도 필요 없으며, 여러분의 사이트를 읽은 모든 사람의 목록을 쥐고 있는 제3자도 없습니다.

마지막 검토일 · 2026-10-12 · 출처 · Umami, Plausible Community Edition, Matomo, GoAccess 공식 문서; ePrivacy 지침 2002/58/EC 5(3)조; 규정 (EU) 2016/679; 유럽사법재판소의 Breyer 판결(C-582/14) 및 Schrems II 판결(C-311/18); 2023년 7월 EU-US 데이터 프라이버시 프레임워크 적정성 결정 · 주기 · 연간

북유럽에서 구축한 프라이빗 호스팅.