@leekh8
보안, 웹 개발, Python을 다루는 기술 블로그


📦 빌드는 실패했는데 사이트는 멀쩡했다

August 19, 2026 · 6 min read

패키지 이름을 바꾸면서 버전 범위를 그대로 뒀다. 포크는 이름만 새로 시작하고 버전은 이어받는다. npm은 ETARGET으로 죽고 빌드는 실패했지만 프로덕션 도메인은 이전 배포를 계속 가리켰다. 사이트가 200인 것과 배포가 성공한 것은 다른 일이다.


📉 4% 룰을 한국에 그대로 쓰면 안 되는 이유

August 13, 2026 · 14 min read

은퇴 안전인출률 4% 룰의 원 출처인 Bengen 1994와 Trinity Study 1998을 직접 확인하고, 수익률 순서 위험을 Python 시뮬레이션으로, 미국 데이터 편향을 17개국, 38개국 국제 비교로 정량화한다. 한국에서 무엇을 기준으로 삼아야 하는지 국민연금 차감 후 부족액 계산까지 정리한다.


🔎 DNS 완전 정복 — 도메인이 IP로 바뀌기까지, 그리고 그 사이의 보안

August 06, 2026 · 19 min read

DNS가 도메인 이름을 IP로 바꾸는 전 과정을 재귀 질의·레코드 타입·캐싱·TTL 중심으로 뜯어봅니다. UDP 53이 언제 TCP로 넘어가는지, dig로 직접 확인하는 방법, 그리고 캐시 포이즈닝·터널링·리바인딩 같은 DNS 공격과 DNSSEC·DoT·DoH 방어까지 보안 엔지니어 관점으로 정리합니다.


📘 CRA에서 Vite로 넘어올 때 조용히 발목 잡는 것들

August 05, 2026 · 4 min read

create-react-app 프로젝트를 Vite 5로 옮기면서 만난 세 가지 함정 — JSX 확장자, %PUBLIC_URL%, react-helmet. 어느 것도 에러 메시지가 친절하지 않았다.


📘 드래그 앤 드롭이 조용히 죽었다 — react-beautiful-dnd와 React 18 StrictMode

July 14, 2026 · 5 min read

할 일 목록을 드래그해도 아무 일도 일어나지 않았습니다. 콘솔 에러조차 없었습니다. 원인은 개발이 중단된 react-beautiful-dnd가 React 18 StrictMode에서 Droppable을 등록하지 못하는 것이었고, API가 똑같은 포크 @hello-pangea/dnd로 import 한 줄만 바꿔 해결했습니다.


⚡ 백그라운드 탭에서 setInterval 타이머가 느려지는 이유와 벽시계 해법

July 10, 2026 · 6 min read

Pomodoro 타이머를 다른 탭에 두고 작업하다 돌아오니 25분이 한참 남아 있었습니다. 원인은 브라우저의 백그라운드 탭 setInterval 스로틀링이었고, tick 카운트다운을 Date.now() 기반 벽시계 재계산으로 바꿔 해결했습니다.


🐍 보안 권고문 모니터링 자동화 — 의존성 0으로 만드는 RSS 수집기

July 02, 2026 · 8 min read

KISA 보호나라와 벤더 PSIRT의 보안 권고문 RSS를 표준 라이브러리만으로 수집하고, SQLite UNIQUE 제약으로 중복을 걸러 새 권고문만 메일로 알려주는 수집기를 처음부터 만들어봅니다. 재시도 전략, 첫 실행 seed 모드 등 운영에서 겪는 함정까지 다룹니다.


Kaggle 무료 GPU로 LLM 파인튜닝하다 quota가 끊겼다 — checkpoint 재개 전략 총정리

June 23, 2026 · 6 min read

Kaggle T4로 3B 모델을 파인튜닝하던 중 주간 무료 quota가 46% 지점에서 소진됐습니다. checkpoint에서 학습을 이어붙이는 과정에서 만난 세 가지 함정 — 텐서 수 불일치, 디스크 풀, OOM 메모리 잔존 — 과 해결책을 정리합니다.


Nuclei 스캔 결과가 실행할 때마다 달라진 이유 — sshd MaxStartups 경합

June 18, 2026 · 4 min read

같은 타겟에 같은 템플릿으로 Nuclei 스캔을 돌렸는데 매칭 수가 런마다 258~275로 흔들렸습니다. 원인은 OpenSSH 템플릿들이 SSH 포트에 동시 핸드셰이크를 날려 sshd MaxStartups에 걸린 것이었고, -concurrency를 낮춰 100% 재현성을 확보한 과정을 정리합니다.


PyInstaller 바이너리를 CentOS 6부터 Rocky 9까지 돌리는 법

June 09, 2026 · 4 min read

Rocky 9에서 빌드한 바이너리가 CentOS 6에서 GLIBC_2.34 not found로 실행이 안 됐습니다. 빌드 서버를 CentOS 6.5로 낮추는 전략과, 보안 하드닝 서버에서 만나는 /tmp noexec 문제와 --runtime-tmpdir 해결법을 정리합니다.