#S3 The Loot Report, Vol. 2: 지루한 부분을 해결한 네 줄의 코드
요약
개발자가 시스템의 보안 스캐너, 모니터링 훅, 접근성 검사 등 자동화된 체크 프로세스를 개선한 경험을 공유합니다. AI와 스크립트를 활용해 수동 검토의 한계를 극복하고 시스템의 신뢰성을 높이는 실무적인 팁을 다룹니다.
핵심 포인트
- 보안 스캐너의 성능을 검증하기 위해 의도적인 취약점을 심어 테스트할 것
- 모니터링 시스템이 작동하지 않을 때를 대비해 데드맨 스위치를 도입할 것
- 인간의 시각적 판단 대신 스크립트를 활용해 접근성 표준을 자동 검증할 것
지난 Loot Report는 단 하루 동안의 수확물이었습니다. 이번 보고서는 조금 더 느릿합니다. 몇 주에 걸쳐 제가 가져온 네 줄의 코드인데, 각각 제 시스템에서 가장 매력적이지 않은 구석, 즉 감시를 해야 하지만 조용히 작동하지 않고 있던 체크(checks)들을 겨냥한 것입니다. 저는 AI로 병원의 내부 도구를 만드는 물리치료사입니다. 따라서 "만들었다"는 말은 AI와 제가 실제로 무엇이 고장 나고 있는지를 설명하며 함께 만들었다는 뜻입니다. 모든 것은 누군가의 문장에서 시작되었습니다.
Loot #1: 연기 감지기를 위한 매칭
누군가가 의도적으로 심어놓은 10개의 취약점에 대해 무료 보안 스캐너(security scanner)를 실행했습니다. 그중 3개를 잡아냈습니다. 그들의 문장이 제 머릿속에 남았습니다: "한 번도 씨앗을 뿌려본 적 없는 탐지기는, 성냥을 한 번도 가져다 대본 적 없는 연기 감지기와 같다."
저에게도 정확히 그런 상황이 있었습니다. 제 코드베이스(codebase)를 감시하는 정적 보안 스캐너(static security scanner)가 있었지만, 그것이 실제로 볼 수 있는지 단 한 번도 테스트해 본 적이 없었습니다. 그래서 저는 10개의 알려진 악성 패턴을 심고 실행해 보았습니다. 10개 중 7개였습니다. 놓친 3개에 대해 규칙(rules)을 작성하고 다시 실행했더니, 10개 중 10개를 잡아냈습니다. 그러고 나서 저를 웃게 만든 일이 일어났는데, 이는 그들에게도 일어났던 일이었습니다. 제가 "하드코딩된 비밀(hardcoded secret)" 규칙을 추가한 순간, 그것이 실제 코드에서 작동했습니다. 이미 "검토"했다고 확신했던 프로그램들 안에 제가 분명히 없다고 장담했던 실제 API 키 3개가 발견된 것입니다. 탐지기에 씨앗을 뿌리는 작업은, 탐지기가 그동안 놓치고 있었던 모든 것에 대한 조용한 감사(audit)이기도 했습니다.
Loot #2: 감시자를 위한 감시자
누군가는 23일 동안 조용히 죽어있던 모니터링 훅(monitoring hook)에 대해 썼습니다. 아무도 눈치채지 못했는데, 경고가 0개인 상태가 건강한 상태와 똑같이 보였기 때문입니다. 그들의 문장: "죽어있는 감시자는 깨끗한 통과(clean pass)와 동일한 가시적 결과, 즉 '아무것도 없음'을 만들어낸다."
저는 방금 제 시스템의 상태 확인(health-check) 기능을 더 똑똑하게 만들었습니다. 이제 단순히 페이지가 로드되었다고 믿는 대신, 실제 데이터베이스 쿼리(database query)를 실행합니다. 저는 하루 정도 그것을 자랑스러워했지만, 그 포스트를 보고 제가 놓친 구멍을 발견했습니다. 저는 상태 확인 기능을 더 똑똑하게 만들었지만, 상태 확인 자체를 감시하는 것은 아무것도 없었습니다. 만약 상태 확인의 스케줄러(scheduler)가 조용히 작동을 멈춘다면, 제 대시보드는 순전한 부재(absence)로 인해 계속 초록색을 유지할 것이고 — 저는 그 침묵을 그들의 팀이 했던 방식 그대로 읽게 될 것이었습니다. 그래서 저는 데드맨 스위치(dead-man's switch)를 추가했습니다. 상태 확인이 새로운 생존 증거(proof-of-life)를 남기지 못할 경우 경보를 울리는 별도의 작업(job)입니다. 이제 감시자에게 감시자가 생겼습니다. (재귀(recursion)는 결국 인간 단계에서 멈춰야 하겠지만 — 적어도 제가 있던 곳보다는 한 단계 위에서 말이죠.)
Loot #3: 바로 지금 당신이 읽고 있는 것
누군가가 AI 에이전트(AI agent)가 모든 조사를 마친 뒤
디자인 도구를 만드는 누군가가 제가 가장 필요로 했던 문장을 썼습니다. 제 눈은 40퍼센트의 경우 틀렸고, 짧은 스크립트(script)는 매번 옳았다는 것이었습니다.
저는 몇 달 동안 제 도구의 색상 대비(color contrast)를 눈으로만 확인하며 승인해 왔습니다. 버튼을 가늘게 뜨고 바라보며 괜찮아 보인다고 판단하고 다음으로 넘어갔죠. 그날 오후, 저는 접근성 표준(accessibility standard)에 따라 대비를 확인하는 아주 작은 스크립트를 작성하여 제 팔레트 전체를 실행해 보았습니다. 제가 고심했던 색상들은 괜찮았습니다. 하지만 몇 달 전 눈으로 승인했던 링크 색상은 가독성 임계값(readable threshold) 아래에 머물러 있었습니다. 제 눈만큼 관대하지 않은 사람들에게는 내내 조용히, 보이지 않게 실패하고 있었던 것입니다. 눈으로만 봐서는 절대 잡아낼 수 없었을 것입니다. 바로 그 점이 핵심입니다. '보는 것' 자체가 문제였습니다.
네 가지의 공통점
이것들을 나란히 세워두면, 네 가지의 옷을 입고 있는 동일한 교훈입니다. 실행되었다고 말하는 스캐너(scanner). 작동 중이라고 말하는 모니터(monitor). 완료되었다고 말하는 에이전트(agent). 괜찮아 보인다고 말하는 눈(eye). 이들 모두는 자기 자신의 숙제를 스스로 채점하는 존재들이며, 모든 해결책은 동일한 움직임이었습니다. 확신(confidence)을 훔치지 말고, 검증(check)을 훔치십시오. 당신과 그 대상의 자기 의견 사이에 무언가를 두십시오. 의도적인 실패(planted failure), 생존 증명(proof-of-life), 집계(tally), 혹은 자신이 옳다는 것에 대해 감정이 없는 스크립트 같은 것 말입니다.
저는 이 원칙에 스스로 도달한 것이 아닙니다. 이것이 하나의 아이디어라는 것을 깨닫기 전까지, 네 명의 낯선 이들로부터 네 번이나 훔쳤습니다. (그리고 이 아이디어가 어디로 향하는지 — 검증하는 자를 누가 검증하며, 왜 혼자서는 할 수 없는지에 대한 심층적인 버전을 원하신다면 — 다음 포스트에서 다룹니다.)
문이 열려 있다면 강도질이 아니다
이것이 도둑질이 되지 않는 이유는 다음과 같습니다. 여기서 일어나는 일은 어느 한 방향으로만 흐르지 않습니다. 제 자신의 누수를 확인한 과정은 그 문구를 쓴 저자에게 돌아갔고, 이는 그의 도구가 내부에서 볼 수 없었던 사각지대를 보완해 주었습니다. 한국어 타이포그래피(typography)에 대한 제 노트는 또 다른 저자의 제품 로드맵(product roadmap)에 반영되었습니다. 한 줄을 가져가면, 한 줄을 남깁니다. 그것이 이 경제의 전부입니다.
피드를 방송 채널(broadcast channel)로 취급하는 것을 멈추고 나면, 그것이 실제로 무엇인지 알게 됩니다. 바로 모두의 도구가 작업대 위에 놓여 있는 공유 워크숍(shared workshop)이며, "그거 훔쳐 갈게요"라는 말은 우리가 감사를 표하는 방식일 뿐입니다.
그러니: 감사합니다. 가방이 가득 찼네요. 다음 포스트에서는 더 가득 찬 가방과 함께 뵙겠습니다.
이 글은 Stolen from the Feed — 비개발자가 dev.to에서 가져와 실제로 구축하는 것들에 대한 시리즈의 일부입니다. From Zero to Ship의 자매 시리즈입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기