← 01 THINK어떻게 생각하는가
커밋 없이 값이 바뀌었다
자동 주입은 CSP 를 좁게 유지하는 대신, 어느 통계 사이트로 보고하는지를 대시보드에 남긴다. 저장소가 쥐지 못한 값은 알림 없이 바뀐다.
이 글은 AI 에이전트(Claude)와 함께 진행한 세션의 기록이다. 커밋 해시와 인용은 이 저장소에서 확인할 수 있다. 다만 토큰이 실제로 한 번 바뀌었다는 것은 세션에서 관찰한 사실이고, 코드에는 남아 있지 않다 — 그게 이 글의 주제다.
lib/csp.mjs 에 이렇게 적혀 있다.
connect-src deliberately gets nothing. Under Cloudflare's AUTOMATIC
injection the beacon reports to the site's own domain, which 'self'
already covers. (...) automatic injection is not a convenience here,
it is the reason the second hole stays shut.
이 사이트는 허용한 곳 외에는 아무 데도 접속하지 않는다는 CSP 를 걸고 있고, 외부 오리진은 통계 비컨의 스크립트 호스트 하나뿐이다. 비컨을 직접 내보내면 보고가 나가는 주소를 하나 더 허용해야 한다. 그래서 자동 주입을 쓴다. 정책을 한 칸이라도 좁게 유지하려고 고른 것이고, 이건 의도된 트레이드다.
그 문장이 말하지 않는 쪽이 값이다.
저장소가 쥐지 못한 값은 알림 없이 바뀐다
자동 주입에서 HTML 에 도달하는 토큰 — 어느 통계 사이트로 보고할지를 정하는 값 — 은 대시보드가 이 호스트에 연결해 둔 사이트의 것이다. 저장소에는 그 연결이 없다.
그러니까 이 값은 커밋 없이 바뀔 수 있다. 그리고 실제로 한 번 그랬다.
diff 도, 작성자도, 시각도 없다. 코드에 기록이 없으니 바뀐 것을 알 신호가 없고, 알아챈 뒤에도 원인을 물을 데가 없다. 정책은 좁게 유지됐고, 대신 값 하나가 diff 밖에 있다. 좁은 정책의 값이 그것이다.
대시보드에만 있는 상태
같은 자리에 셋이 더 있다. www 를 기본 주소로 보내는 리다이렉트 룰, 통계 사이트
연결, 그리고 그 연결이 어느 사이트를 가리키는지.
docs/PRODUCTION.md 에는 이 셋이 절차로만 적혀 있다. DNS 에 프록시된 AAAA
레코드를 100:: 로 두고, Redirect Rules 에서 301 로 보내고 — 무엇을 하면 되는지는
있다. 지금 그렇게 되어 있는지는 없다.
이건 게이트로 막을 수 있는 종류가 아니다. pnpm check:release 는 저장소가 만드는
정책과 헤더를 검사하지만, 대시보드의 토글은 저장소가 읽을 수 없다. 그래서 여기서
할 수 있는 최소한은 결론이 아니라 확인 절차를 남기는 것이다.
같은 형태가 그 주에 두 번 더 있었다
받을 수 없는 자료. 지도를 읍면동까지 쪼개려면 자료가 하나 필요한데 제공처가
계정을 요구한다. 계정 생성은 스크립트가 할 일이 아니다. 목록에서 지우는 대신
"못 받는 자료" 로 옮겨, 매 실행이 없다는 사실과 손으로 받아 둘 위치와 자동으로 못
받는 이유를 출력하게 했다(388d02c, f36d4c3).
지우면 6개월 뒤에 같은 조사를 다시 한다. 이미 두 번 했다 — 첫 번째는 대화로만 하고 어디에도 안 적어서 잃어버렸다.
되돌린 리팩터. CSS 램프가 셀의 fill 과 범례 스와치의 background 로 두 번
적혀 있어서, 아홉 색을 사용자 정의 속성으로 한 번만 선언하게 바꿨다. color-mix()
18개가 9개로 줄었고, 10,445 B — 105 B 나빠졌다. gzip 이 반복 문자열을 이미
접고 있었고, 아홉 개의 서로 다른 변수명이 압축 가능한 반복을 압축 불가능한 신규
문자열로 바꿨다. 되돌리고, 그 실측값을 perf.budget.json 에 적었다(74d469e).
숫자를 안 적으면 다음에 같은 리팩터를 한다. 중복이 추상보다 싸다는 건 아무도 추측할 수 없는 답이다.
가져갈 것
셋이 같은 형태다. 값이 저장소 밖에 있거나, 자료가 손을 거쳐야 하거나, 결과가 직관과 반대일 때 — 저장소가 쥘 수 있는 것은 결론이 아니라 확인 방법이다.
- 끌어올 수 있는 상태는 끌어온다. 대시보드 토글 하나가 프로덕션 HTML 을 바꿀 수 있다면 그건 설정이 아니라 코드다.
- 못 끌어오면 절차를 대신 둔다. 게이트가 읽을 수 없는 상태라도, 어떻게 확인하는지 한 줄은 저장소 안에 있어야 한다.
- 없는 것과 되돌린 것을 출력하게 한다. 손으로 받아야 하는 자료와 실패한 리팩터의 실측값은, 적어 두지 않으면 반드시 다시 조사된다.