본문으로 건너뛰기
yceffort
PostsSeriesTagsAbout🧪 Research
EN

Tweaks

theme
accent palette
film grain
minimal mode
◆ SERIES · 2 POSTS

OG 스크래핑 서버 설계 노트

링크 미리보기 서버를 짓는다면 무엇을 먼저 정해야 하는가. 런타임 선택의 근거부터 SSRF, 인코딩, 캐시 스탬피드까지 원리로 따라가고, 그렇게 쓴 코드를 전부 돌려본 기록

README

링크 미리보기는 명세만 보면 세 줄짜리 기능이다. URL을 열고, HTML을 파싱하고, og: 태그를 꺼내면 된다. 그런데 그 세 줄이 프로덕션에서 무너지는 지점이 꽤 많고, 그중 상당수는 "에러율이 높다"는 하나의 숫자 뒤에 뭉쳐서 잘 보이지 않는다.

이 시리즈는 그 세 줄이 무너지는 자리를 순서대로 따라가는 설계 노트다. 1편은 실패를 원인별로 갈라놓고 런타임 선택이 실제로 갈리는 지점을 따진 뒤, User-Agent와 인코딩으로 커버리지를 올리고 캐시와 목표 수치를 세우는 데까지 간다. 2편은 사용자가 준 URL을 서버가 대신 여는 일의 위험을 다루는데, 막는 법보다 뚫리는 법을 먼저 보는 순서로 잡았다.

사용법보다 왜 그렇게 설계하게 되는지에 무게를 두었고, 등장하는 코드는 전부 Node.js v24.14.1에서 직접 돌려봤다. 그 과정에서 처음에 그럴듯하게 적어둔 것 중 넷이 틀렸다는 것을 알게 됐는데, 틀린 자리를 지우지 않고 그대로 남겨 두었다. 그 대비가 이 시리즈에서 가장 하고 싶은 이야기이기도 하다.

02 ITEMS

전체 글

in order
01

OG 스크래핑 서버를 Node.js로 짓는다면 (1): 런타임 선택부터 에러율과 지연까지

#nodejs#web#scraping
링크 미리보기 서버의 "에러율 10%"는 성질이 다른 다섯 종류의 실패가 뭉친 숫자다. 이 워크로드가 왜 I/O 바운드에 저 TPS인지, 런타임 선택이 실제로 갈리는 네 지점은 어디인지 따져본 뒤, User-Agent와 인코딩으로 에러율을 낮추는 일로 넘어간다. Node 내장 TextDecoder는 CP949 확장 문자를 에러 없이 다른 글자로 바꾸고, 스크랩해 온 og:title은 API 응답이 아니라 사용자 입력이다. 캐시 스탬피드와 negative caching, 그리고 "P95 1초 미만"을 캐시 히트율에서 역산해 검증하는 200만 건 시뮬레이션까지 담았다. OG 스크래핑 서버 설계 노트 2부작의 첫 편이다.
2026-08-2253분 · read
02

OG 스크래핑 서버를 Node.js로 짓는다면 (2): SSRF는 어떻게 뚫리는가

#nodejs#security#ssrf
사용자가 준 URL을 서버가 대신 여는 기능은 SSRF의 교과서적 조건을 명세로 갖고 있다. 화이트리스트를 뚫는 우회 여섯 가지를 먼저 보고, 그것을 막는 방어 원리 다섯 개를 Node에서 실제로 돌려본 기록. 손으로 IPv4-mapped를 벗기면 16진 표기에서 뚫리고, undici의 lookup 훅은 호스트가 IP 리터럴이면 아예 호출되지 않으며, URL.hostname은 IPv6 리터럴의 대괄호를 남긴다. OG 스크래핑 서버 설계 노트 2부작의 마지막 편이다.
2026-08-2239분 · read
mailMail icongithubtwitter
yceffort
•
© 2026
•
https://yceffort.kr