날씨 정보를 불러오는 중...

개발자 도구 20개를 직접 만들었다 - K-Zero Toolbox 제작기

2026-09-16 18:39 · IT기술 · 조회 4
banner

개발자 도구 20개를 직접 만들었다 - K-Zero Toolbox 제작기

주말에 갑자기 이런 생각이 들었다. 서브넷 계산할 일이 생길 때마다 검색해서 아무 사이트나 들어가고, JWT 토큰 내용을 확인하려고 또 다른 사이트를 찾고, chmod 권한 숫자가 헷갈려서 또 검색하고... 이럴 거면 그냥 내 포털에 다 만들어두면 되지 않나? 그래서 만들었다. 하루 만에 20개.

결과물은 k0.co.kr/tools에 있다. 회원가입 없이 바로 쓸 수 있다. 이 글은 무엇을 만들었고, 만들면서 어떤 결정을 했는지에 대한 기록이다.

무엇을 만들었나

network네트워크

  • IP 계산기 — IPv4를 2진수·16진수·정수로 변환하고 클래스와 사설/공인 여부를 판별
  • 서브넷 계산기 — CIDR을 넣으면 네트워크·브로드캐스트 주소, 사용 가능 호스트 범위, 와일드카드 마스크까지
  • DNS 조회 — A, AAAA, MX, NS, TXT, CNAME 레코드 확인

linux리눅스

  • chmod 계산기 — 체크박스로 권한을 고르면 755 같은 숫자와 명령어 생성 (반대로 숫자 입력도 가능)
  • Crontab 생성기 — 다섯 칸을 채우면 cron 표현식이 나오고, 언제 실행되는지 한글로 풀어서 설명
  • systemd 유닛 생성기 — 실행 명령어를 넣으면 .service 파일과 등록 명령어까지
  • Shell 이스케이프 — 특수문자가 든 문자열을 셸에 안전하게 넘길 수 있는 형태로 변환

kubernetes쿠버네티스

  • Deployment 생성기 — 이미지·replica·리소스·프로브를 폼으로 채우면 YAML 완성
  • Service 생성기 — ClusterIP / NodePort / LoadBalancer 선택에 따라 필드가 바뀜
  • Ingress 생성기 — 호스트·경로·TLS(cert-manager 어노테이션 포함)
  • ConfigMap · Secret 생성기 — Secret은 base64 자동 인코딩
  • Helm 차트 생성기 — Chart.yaml과 values.yaml 골격

dev개발

  • JSON 포맷터 — 정렬·압축·키 정렬, 문법 오류는 몇 행 몇 열인지 알려줌
  • YAML ↔ JSON 변환 — 양방향
  • JWT 디코더 — 헤더·페이로드 해석, 만료 여부 배지로 표시
  • Base64 인코더·디코더 — 한글(UTF-8) 정상 처리, URL-safe 옵션
  • UUID 생성기 — v4를 한 번에 여러 개
  • 정규식 테스터 — 일치 부분 실시간 하이라이트, 캡처 그룹 표시

여기에 원래 있던 단위변환기와 도로명주소 검색까지 합쳐서 총 20개다.

결정 1 — 계산은 전부 브라우저에서 한다

이게 가장 먼저 정한 원칙이었다. 이유는 단순하다. 이 도구들에 붙여넣게 되는 값이 대체로 민감하기 때문이다.

JWT 디코더에 넣는 건 실제 인증 토큰이다. Secret 생성기에 넣는 건 DB 비밀번호나 API 키다. JSON 포맷터에 붙여넣는 건 운영 서버의 설정 파일일 수도 있다. 이런 값들이 내 서버 로그에 남는 상황은 만들고 싶지 않았다.

그래서 모든 계산 로직을 JavaScript로 작성해서 브라우저 안에서만 돌게 했다. 서버는 HTML을 내려줄 뿐이고, 사용자가 입력한 값은 네트워크를 타고 나가지 않는다. 개발자 도구의 Network 탭을 열어놓고 써보면 아무 요청도 발생하지 않는 걸 확인할 수 있다.

예외는 딱 하나, DNS 조회다. 이건 본질적으로 서버가 DNS 질의를 대신해야 해서 어쩔 수 없다. 대신 이 도구 페이지에는 "이 도구만 서버가 조회하므로 입력한 도메인은 서버 로그에 남을 수 있다"고 명시해뒀다.

결정 2 — 만들지 않은 도구가 하나 있다

excluded포트 체커는 의도적으로 뺐다

원래 계획한 목록에는 "Port Checker"가 있었다. 도메인과 포트를 넣으면 열려 있는지 확인해주는 흔한 도구다. 기술적으로는 몇 줄이면 만든다. 그런데 만들다가 멈췄다.

이걸 공개 웹사이트에 올린다는 건 누구나 내 서버를 통해 임의의 대상을 포트 스캔할 수 있게 된다는 뜻이다. 그리고 그 스캔 트래픽은 내 집 IP에서 나간다. 누가 이 도구로 남의 서버를 훑으면, 상대방 로그에는 우리 집 공인 IP가 찍힌다.

더 곤란한 건 내부망이다. 우리 집 서버는 172.30.1.x 대역에 있는데, 서버에서 출발하는 연결이라 내부 주소도 찍어볼 수 있다. 며칠 전에 스캐너 IP를 차단하는 글을 썼는데, 그래놓고 스스로 스캔 대행 서버를 여는 건 앞뒤가 안 맞는다.

"공인 IP만 허용하고 사설 대역은 막으면 되지 않나" 싶었지만, 그래도 제3자 스캔 대행 문제는 그대로 남는다. 그래서 그냥 뺐다. 필요하면 터미널에서 nc -zv host port 한 줄이면 된다.

결정 3 — 도구만 있는 페이지는 만들지 않았다

이건 만들기 전에 꽤 고민한 부분이다.

사실 이런 도구 모음은 이미 훌륭한 오픈소스가 있다. it-tools 같은 프로젝트를 도커로 띄우면 30분이면 끝난다. 실제로 내 서버에도 예전에 띄워둔 게 있었다.

그런데 그걸 쓰지 않고 직접 만든 이유가 있다. 그런 프로젝트들은 대부분 클라이언트 사이드 SPA다. 서버가 내려주는 HTML은 거의 비어 있고, 자바스크립트가 실행돼야 화면이 그려진다. 사람이 보기엔 멀쩡하지만 검색엔진 입장에서는 내용이 없는 페이지다. "CIDR 계산기"를 검색한 사람이 내 사이트로 올 가능성이 거의 없다는 뜻이다.

그래서 각 도구를 Flask에서 서버 렌더링되는 독립 페이지로 만들고, 페이지마다 제대로 된 설명글을 붙였다. 그냥 "이 도구는 서브넷을 계산합니다" 수준이 아니라, 실제로 헷갈리는 지점을 다뤘다.

  1. 서브넷 계산기 → "왜 /24는 256개 중 254개만 쓸 수 있는가", "/31이 예외인 이유"
  2. chmod → "디렉터리에서 x 권한은 실행이 아니라 진입을 뜻한다"
  3. Deployment 생성기 → "requests와 limits의 차이", "파드가 자꾸 재시작되면 OOMKilled부터 확인"
  4. Crontab → "일과 요일을 동시에 지정하면 AND가 아니라 OR다"
  5. YAML 변환 → "NO를 따옴표 없이 쓰면 false가 된다"

도구를 쓰러 왔다가 설명을 읽고 뭔가 하나 알아가면 그게 제일 좋은 결과라고 생각한다. 그리고 그런 내용이 있어야 검색에도 걸린다.

배포하기 전에 한 일

이 포털은 Git에 push하면 곧바로 빌드되고 운영에 반영된다. 리뷰 단계가 없다. 편하지만 위험하기도 해서, 이번처럼 파일이 20개 넘게 늘어나는 변경은 조심스러웠다.

특히 겁났던 건 템플릿 문법 오류다. 파이썬 코드는 문법 검사라도 되지만, Jinja 템플릿은 실제로 렌더링해봐야 오류를 알 수 있다. 중괄호 하나 잘못 닫은 걸 모르고 push하면 그 페이지는 운영에서 500 에러가 난다.

그래서 push 전에 이렇게 했다.

  1. 작업한 소스를 서버로 복사
  2. podman build로 임시 태그를 단 이미지 빌드
  3. 그 이미지로 일회용 파드를 하나 띄움 — 실제 ConfigMap과 Secret을 그대로 주입해서 진짜 DB에 붙게
  4. 파드 안에서 파이썬으로 새 페이지 전부를 호출해 상태 코드 확인
  5. 확인 끝나면 파드와 임시 이미지 삭제
kubectl exec 임시파드 -n portal -- python3 -c "
import urllib.request
paths = ['/tools', '/tools/ip-calculator', ...]
for p in paths:
    r = urllib.request.urlopen('http://127.0.0.1:5000' + p, timeout=10)
    print(r.status, p)
"

22개 경로가 전부 200을 반환하는 걸 확인하고 나서야 push했다. 운영 중인 앱 인스턴스가 하나 더 떠서 같은 DB를 보게 되지만, 테이블 생성은 이미 있으면 넘어가도록 되어 있어서 부작용은 없다.

결과적으로 이번엔 오류가 없어서 이 과정에서 잡힌 건 없었다. 그래도 "문제가 없다는 걸 확인하고 올린 것"과 "문제가 없기를 바라며 올린 것"은 다르다고 생각한다.

중간에 한 번 되돌린 것

처음엔 생활 도구(단위변환·주소검색)와 IT 도구를 별도 페이지로 나눠서 배포했다. 사용자층이 다르니 섞지 않는 게 낫다고 판단했었다.

그런데 막상 올려놓고 보니 메뉴에 "도구"와 "IT 도구"가 나란히 떠 있었다. 내가 만들어놓고도 어느 쪽을 눌러야 할지 헷갈렸다.

다시 생각해보니 처음 판단의 전제가 틀렸다. 검색으로 들어오는 사람은 허브 페이지를 거치지 않는다. "chmod 계산기"를 검색한 사람은 chmod 페이지로 바로 떨어진다. 허브를 나눠서 얻는 이득이 사실상 없고, 메뉴만 지저분해진 것이다.

그래서 한 페이지로 합쳤다. 생활 도구는 그냥 카테고리 하나가 됐다. 없앤 주소는 삭제하지 않고 301 리다이렉트로 넘기게 했는데, 이미 사이트맵에 색인 요청을 보낸 뒤라 404를 내면 검색엔진에 불필요한 오류로 잡히기 때문이다.

마무리

만들고 나서 가장 좋은 점은, 이제 서브넷 계산하려고 검색하지 않아도 된다는 것이다. 주소창에 k0.co.kr/tools만 치면 된다. 애초에 이것 때문에 시작한 일이니 목적은 달성한 셈이다.

앞으로 몇 주 동안은 검색 유입이 실제로 생기는지 지켜볼 생각이다. 도구를 20개 더 늘리는 것보다, 지금 만든 것 중 어떤 게 사람들이 실제로 찾는 것인지 확인하는 게 먼저인 것 같다. 그 결과에 따라 다음에 뭘 만들지 정하려고 한다.

혹시 써보시고 계산이 이상하거나 있었으면 하는 도구가 있다면 알려주시면 반영하겠다. 주소는 k0.co.kr/tools다.


댓글 0

로그인 후 댓글을 작성할 수 있습니다.