필요
업데이트 중에 실수로 빠진 보안 설정은 눈에 보이지 않습니다. 감사나 고객이 알아차리기 전까지는요.
아이디어
점검하는 것을 기억에 의존하지 않습니다. 감시 대상과 떨어져서 스스로 돌아가게 해, 한 장애가 다른 장애를 가리는 일이 없도록 합니다.
만든 것
- 웹사이트가 보내야 하는 기본 보호 장치를 점검하는 기능: 보안 헤더 다섯 가지, HTTPS 전환, 쿠키 설정, 그리고 3주 전에 경고하는 인증서 만료.
- 웹사이트 밖에서 자체 일정에 따라 실행되고, 이력은 자체 데이터베이스에 저장합니다.
- 인증 관문 뒤에 있는 비공개 대시보드.
결과
- 30분점검 주기
- 5매번 확인하는 보안 헤더 수
- 3주인증서 만료 전 사전 경고
- 2026년 8월 30일운영 시작일
첫 점검에서 사용 중인 프레임워크 버전을 드러내는 헤더를 찾아 1시간 안에 고쳤습니다. 그다음에는 스스로의 실수까지 잡아냈습니다. 첫 대시보드가 공개된 채 사이트맵에 올라 있어, 사실상 공격자를 위한 지도였던 것입니다. 그날 바로 닫고, 인증 뒤에서 다시 열었습니다.
화면으로 보기
배운 점
보안 도구는 먼저 자기 자신의 점검을 통과해야 합니다. 무엇을 감시하는지 공개적으로 보여 주는 모니터링 도구는, 그것을 발견한 누구에게나 정찰 도구가 됩니다.
기술 세부 정보 기술 스택, 아키텍처, 설계 결정 — 기술 담당자용
기술 스택
- Node.js(npm 의존성 없음)
- Express
- SQLite (node:sqlite)
- systemd 타이머
- Cloudflare Access
작동 방식
- 점검 항목: CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy 존재 여부, Server·X-Powered-By 정보 노출 없음, 모든 쿠키의 Secure·HttpOnly, HTTP → HTTPS 리디렉션, 3주 안에 만료되지 않는 TLS 인증서.
- npm 의존성 0개 — Node 내장 모듈만 사용합니다.
- 설계상 분리: 점검기는 30분마다 실행되는 systemd 서비스로 자체 SQLite 데이터베이스에 기록하고, 대시보드는 그 데이터베이스를 읽기만 할 뿐 직접 점검하지 않습니다.
- 스스로 만든 노출 이후: 대시보드를 사이트맵과 robots.txt에서 빼고, 서비스 식별자를 소스 코드 밖으로 옮긴 뒤, 전용 서브도메인에서 Cloudflare Access 뒤에서만 다시 열었습니다.
아직 부족한 점
- 대시보드는 비공개 — 의도한 설계