웹 요청의 숨겨진 진실, TRMNL 플러그인 개발기

by DD
1시간 전
조회수 0

개인 맞춤형 이잉크(e-ink) 디스플레이 TRMNL의 커스텀 플러그인 개발 시도

스토리그래프(StoryGraph) 공개 API 부재로 웹 스크래핑(Web Scraping) 방식으로 데이터 수집 결정

Cloudflare의 TLS 핑거프린팅(TLS Fingerprinting) 우회를 위한 curl-impersonate 도입 성공

개발 환경과 실제 배포 환경의 IP 평판(IP Reputation) 차이로 인한 배포 실패 경험

Cloudflare의 TLS 핑거프린팅과 우회 전략

Cloudflare는 TLS 핸드셰이크(TLS Handshake)의 고유한 패턴을 분석하여 봇(Bot)을 탐지하고 차단함. 일반적인 `curl` 요청은 브라우저와 다른 TLS 시그니처를 가지므로 HTTP 403 Forbidden 응답을 받게 됨.

curl-impersonate는 Chrome 등 실제 브라우저의 TLS 핑거프린트와 동일한 시그니처를 생성하여 Cloudflare의 탐지를 우회함.

이 기술은 애플리케이션 레벨(Application Level) 이전의 네트워크 계층(Network Layer)에서 작동하므로, HTTP 헤더(Header)를 아무리 위조해도 해결되지 않는 문제였음.

결과적으로, 정교한 봇 탐지 시스템(Sophisticated Bot Detection System)을 통과하기 위해선 프로토콜 레벨에서의 완벽한 모방이 필수적임을 시사함.

웹 스크래핑(Web Scraping) 시도와 데이터 격리 아키텍처(Data Isolation Architecture)

스토리그래프(StoryGraph)는 공개 API를 제공하지 않아, 개인 프로필 페이지의 HTML을 직접 파싱하는 웹 스크래핑(Web Scraping) 방식을 사용함. 이는 데이터 격리 아키텍처(Data Isolation Architecture) 관점에서 외부 서비스의 변경에 취약할 수 있음.

Nokogiri 라이브러리를 사용하여 HTML 구조를 파싱하고 필요한 데이터(제목, 저자, 표지)를 추출함.

캐싱(Caching) 전략을 적용하여 스토리그래프(StoryGraph) 서버에 대한 과도한 요청을 방지하고 응답 속도를 개선함 (TTL 30분).

실패 시에도 오류 필드(Error Field)를 포함한 200 OK 응답을 반환하여 클라이언트(TRMNL)의 안정적인 작동을 보장함.

이러한 접근 방식은 빠른 프로토타이핑(Rapid Prototyping)에는 효과적이나, 대상 웹사이트의 HTML 구조 변경 시 유지보수 비용이 증가할 수 있음.

개발 환경과 배포 환경의 IP 평판(IP Reputation) 차이

로컬 개발 환경에서는 성공했던 스크래핑 로직이 Fly.io와 같은 클라우드 호스팅 환경에서는 실패함. 이는 IP 주소의 평판(IP Address Reputation) 차이 때문임.

개발자 노트북의 IP는 주거용 IP(Residential IP)로 간주되어 Cloudflare의 봇 탐지 시스템을 통과하기 쉬움.

Fly.io의 서버 IP는 데이터센터 IP(Datacenter IP)로 분류되어, 알려진 호스팅 제공업체 범위에 속하므로 Cloudflare에 의해 차단될 가능성이 높음.

결과적으로, 동일한 코드와 요청 내용에도 불구하고 출발지의 차이만으로 접근이 거부되는 현상은 네트워크 인프라(Network Infrastructure)의 중요성을 강조함.

웹 요청의 숨겨진 속성: TLS 핑거프린트와 IP 평판

본 프로젝트는 웹 요청이 애플리케이션 코드에 도달하기 전에 발생하는 여러 계층의 검증 과정을 보여줌. TLS 핸드셰이크(TLS Handshake)의 세부 정보출발지 IP의 평판(IP Reputation)은 개발자가 직접 제어하기 어려운 영역임.

TLS 핑거프린팅(TLS Fingerprinting): 브라우저마다 고유한 TLS 연결 설정 방식을 이용한 봇 탐지.

IP 평판(IP Reputation): 데이터센터 IP는 봇으로 간주될 가능성이 높아 차단될 수 있음.

이러한 요소들은 애플리케이션 로직(Application Logic)과는 별개로 작동하며, 외부 서비스 연동 시 예상치 못한 문제를 야기할 수 있음. 근본적인 해결책으로는 주거용 IP를 사용하는 서비스 라우팅이나, IP 평판 관리 서비스 도입 등이 고려될 수 있음.

It Worked on My Machine (Literally)