yceffort
◆ 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): 런타임 선택부터 에러율과 지연까지

#web-scraping#backend#nodejs
원인이 다른 실패 다섯 종류가 섞여 있는 링크 미리보기 서버의 "에러율 10%". 런타임 선택이 실제로 영향을 주는 네 가지 지점, User-Agent와 인코딩 처리로 에러율 낮추기, CP949 확장 문자를 에러 없이 다른 글자로 바꾸는 Node 내장 TextDecoder, 캐시 히트율에서 역산해 200만 건 시뮬레이션으로 검증한 "P95 1초 미만" 목표
수정
53분 · read
02

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

#security#nodejs#backend
사용자가 준 URL을 서버가 대신 열어 줄 때의 SSRF 방어. 화이트리스트 우회 여섯 가지와 이를 막는 방어 원칙 다섯 가지를 Node에서 직접 실행하며 찾은 함정들: 손으로 푼 IPv4-mapped 주소의 16진 표기 우회, 호스트가 IP 리터럴이면 호출되지 않는 undici의 lookup 훅
수정
39분 · read