RSSHub 소스 코드를 수정하거나 CookieCloud를 도입하지 않고 Edge의知乎·微博 로그인 세션을 자체 호스팅 RSSHub에 안전하게 동기화하는 도구입니다. 세션을 검증하고 교체·롤백하며 알림까지 처리합니다.
RSSHub를 직접 운영하다 보면 피하기 어려운 문제가 있습니다. Zhihu나 Weibo처럼 일부 라우트는 로그인 세션이 있어야 정상적으로 작동합니다.
하지만 쿠키는 예고 없이 만료되고 알림도 오지 않습니다. 만료 사실을 알아차렸을 때는 피드가 이미 한참 업데이트되지 않은 뒤인 경우가 많습니다. 문서를 다시 찾아보고, 브라우저에서 쿠키를 가져와 서버에 접속한 다음 Compose를 수정하고 컨테이너를 재생성해야 하죠. 절차 자체가 어렵지는 않지만 꽤 시간을 잡아먹습니다.
더 골치 아픈 점은 ‘피드에 새 글이 한동안 없다’고 해서 쿠키가 만료됐다고 단정할 수 없다는 겁니다. 작성자가 글을 올리지 않았을 수도 있고, 상류 서비스가 요청을 제한하거나 일시적으로 장애를 겪고 있을 수도 있습니다. RSS 업데이트 여부만 보고 판단하면 건드리지 말아야 할 쿠키를 교체하기 쉽습니다.
이 문제를 해결하려고 RSSHub Cookie Sync를 만들었습니다. Microsoft Edge에서 로그인된 Zhihu와 Weibo 쿠키를 자체 RSSHub 서버로 보내고, 먼저 후보 세션을 검증한 뒤 실제로 필요할 때만 교체합니다. 다시 로그인해야 하는 경우에는 Bark로 알려줍니다. RSSHub 소스 코드를 수정하지 않으며 CookieCloud에도 의존하지 않습니다.
단순히 ‘쿠키 복사’가 아니라, 이후의 유지 관리까지
쿠키를 한 번 복사하는 일은 간단합니다. 장기간 운영하면서 필요한 건 다음과 같은 판단입니다.
브라우저에 사용할 수 있는 새 로그인 세션이 있는가;
서버에서 쓰는 쿠키가 정말 만료됐는가;
현재 실패가 인증 문제인가, 아니면 요청 제한·시간 초과·상류 장애인가;
교체 후에도 RSSHub가 정상적으로 작동하는가;
교체가 실패하면 자동으로 이전 상태로 돌아갈 수 있는가;
언제 조용히 재시도하고, 언제 사용자가 돌아와 다시 로그인해야 하는가.
그래서 이 프로젝트는 브라우저의 쿠키를 RSSHub에 바로 덮어쓰지 않고 새 쿠키를 ‘후보’로 취급합니다. 서버는 후보를 검증하는 동시에 현재 사용 중인 쿠키(live 쿠키)도 별도로 모니터링합니다. 검증과 교체 조건이 모두 충족되어야 후보가 실제 값으로 승격되고, 그렇지 않으면 기존 live 값을 유지합니다.
네 단계로 이어지는 구조
Edge 확장 프로그램은 브라우저와 가장 가까운 단계입니다. Manifest V3를 사용하며 쿠키, 예약 작업, Native Messaging, 로컬 상태에 필요한 권한만 요청합니다. Zhihu와 Weibo의 호스트 권한은 선택 사항이므로 사용자가 직접 허용해야 합니다. 자동 동기화는 Edge 시작 시, 15분마다, 대상 쿠키가 변경된 뒤에 실행됩니다. 쿠키 변경은 잠시 모아서 처리하므로 짧은 시간 안에 반복 업로드되는 일을 막을 수 있습니다.
Native Host는 브라우저 확장 프로그램과 로컬 시스템 기능을 연결하는 다리입니다. 확장 프로그램은 SSH 개인 키에 직접 접근하지 않으며, 서버 연결 정보도 확장 프로그램 패키지에 하드코딩하지 않습니다. Host는 제한된 형식의 서버 주소와 포트, 그리고 ~/.ssh/ 아래 한 단계에 있는 키 파일명만 받아 시스템 OpenSSH를 실행합니다.
SSH 제한 계정은 rsshub-sync로 고정되어 있습니다. 일반 셸 권한이 없고 Docker 그룹에도 속하지 않습니다. 서버는 forced command를 통해 이 계정이 동기화 프로토콜만 사용하도록 제한합니다. 쿠키는 SSH 표준 입력으로 전달되어 명령행 인수에 나타나지 않습니다.
서버는 RSSHub에 영향을 주는 모든 결정을 담당합니다. 입력값 검증, 상류 서비스 확인, 후보 저장, live env 갱신, Compose 검사, 대상 서비스 재생성, 상태 확인 대기, 실패 시 롤백까지 처리합니다. systemd timer를 사용하므로 Mac이 잠자기 상태이거나 Edge가 닫혀 있어도 점검을 계속할 수 있습니다.
실패했다고 바로 쿠키를 바꾸지 않는 이유
로그인 상태를 확인할 때는 새 글이 올라왔는지 보는 대신 Zhihu와 Weibo의 로그인 API 및 RSSHub의 상태를 직접 확인합니다. 서버는 결과를 인증 실패, 일시적 장애, 정상 상태로 나눕니다. 명확한 인증 실패는 누적 확인하고,403는429는432와 시간 초과, 5xx은 일시적인 상류 장애로 처리하므로 쿠키를 즉시 교체하지 않습니다.
이 구분은 중요합니다. 요청이 제한된 상황에서 무작정 쿠키를 바꿔도 문제가 해결되지 않을뿐더러, 정상적으로 사용할 수 있는 세션을 잃을 수도 있습니다. live 쿠키가 만료된 것으로 확인되고 서버에 검증을 통과한 후보가 있을 때만 자동 복구가 의미가 있습니다. 사용할 후보가 없으면 Bark가 Edge에서 다시 로그인하라고 알려줍니다. 일시적 장애가 계속되거나 복구되는 경우에도 정책에 따라 알림을 보냅니다.
Zhihu와 Weibo의 상태는 서로 독립적입니다. 한쪽 서비스에 문제가 생겨도 다른 쪽의 유효한 로그인 세션을 지우거나 차단하지 않습니다.
RSSHub 업데이트에서는 실패도 정상적인 흐름으로 다룹니다
처음 연결할 때 설치 프로그램은 대상 RSSHub service의 ZHIHU_COOKIES와 WEIBO_COOKIES 및 TWITTER_AUTH_TOKEN을 Compose의 environment에서 Compose 파일 옆의 secrets/rsshub.env로 옮기고, env_file의 raw 형식으로 불러옵니다. 따라서 쿠키에 포함된 $나 # 같은 문자를 Compose가 다시 해석하지 않으며, secret 파일은 root만 읽을 수 있도록 권한을 제한합니다.
이후 쿠키 교체는 ‘파일을 쓰고 잘되길 비는’ 방식이 아닙니다. 서버는 잠금을 잡고 트랜잭션을 실행해 새 env를 원자적으로 기록하고, 먼저 Compose 설정을 검사한 다음 대상 RSSHub service만 재생성하고 상태를 확인합니다. 어느 단계에서든 실패하면 이전 env를 복원하고 기존 실행 상태를 다시 만듭니다. docker compose down를 실행하지 않고 Redis나 browserless를 재생성하지도 않습니다. 이미지도 내려받지 않고 볼륨도 삭제하지 않습니다.
이 부분은 ‘쿠키를 어떻게 가져오는가’보다 더 중요합니다. 자동화의 가장 위험한 점은 작업을 못 하는 것이 아니라, 절반만 처리한 채 모호한 상태를 남기는 것입니다. 이 프로젝트는 설치·이전·교체·제거 과정에서 중단 후 복구, 경계 검사, 멱등성을 예외가 아닌 정상 흐름으로 다룹니다.
자격 증명은 어디에 저장되는가
쿠키는 사실상 로그인 자격 증명입니다. 프로젝트는 쿠키가 노출될 수 있는 경로를 최대한 줄입니다.
확장 프로그램은 대상 요청 주소에 맞는 쿠키만 골라내며, live 값은 확장 프로그램의 영구 저장 상태에 기록하지 않습니다.
전송 중인 쿠키는 한 번의 호출 동안 메모리와 SSH 표준 입력에만 잠시 존재합니다. 로컬 명령행 인수나 환경 변수, 로그에는 넣지 않습니다. 마지막 단계에서 RSSHub가 필요로 하는 서버의 root 전용 env 파일과 컨테이너 환경에만 저장합니다.
Native Host는 정해진 형식의 비식별 상태만 반환하며, 서버의 임의 오류 메시지를 확장 프로그램으로 전달하지 않습니다.
로컬에서는 기본적으로 프로젝트 전용 Ed25519 키를 사용하며, 일반 id_ed25519로 조용히 대체하지 않습니다.
SSH에서 엄격한 호스트 키 검증을 사용하므로 알 수 없는 호스트를 자동으로 신뢰하지 않습니다.
서버의 live env, 후보 값, 상태 정보, Bark 설정은 모두 root만 읽을 수 있습니다.
이런 조치로 호스트 자체의 신뢰 경계를 없앨 수는 없습니다. Mac의 현재 사용자 권한을 가진 프로그램은 브라우저를 공격하거나 해당 사용자가 읽을 수 있는 SSH 파일을 열 수 있습니다. 서버의 root 또는 Docker 관리 권한을 가진 사람 역시 RSSHub 컨테이너의 쿠키를 읽을 수 있습니다. 이 프로젝트가 보호하는 것은 동기화 경로이지, 이미 침해된 운영체제에서 빠져나오는 샌드박스가 아닙니다.
설치 과정
일반적인 설치는 세 곳에서 진행합니다. 먼저 Mac의 현재 사용자 계정으로 Native Host를 설치하고, 설치 프로그램이 마지막에 출력하는 프로젝트 공개 키를 복사합니다.
Shell
curl -fsSL https://github.com/Jaaayden/rsshub-cookie-sync/releases/latest/download/install-macos.sh | sh
그다음 일반 SSH로 서버에 처음 접속해 호스트 지문을 확인하고 수락합니다. 같은 root 세션에서 서버 설치 프로그램을 실행하고, 안내에 따라 RSSHub Compose를 선택한 뒤 앞에서 복사한 공개 키를 붙여 넣습니다.
Shell
curl -fsSL https://github.com/Jaaayden/rsshub-cookie-sync/releases/latest/download/install-server.sh | sh
마지막으로 GitHub Releases에서 확장 프로그램 ZIP을 내려받고, edge://extensions에서 ‘압축해제된 확장 프로그램을 로드합니다’를 선택해 설치합니다. 확장 프로그램의 연결 설정으로 이동해 Native Host가 읽히는지 확인하고, 서버 주소와 SSH 포트를 입력한 뒤 rsshub-cookie-sync 전용 키를 선택합니다. 이후 Zhihu와 Weibo 사이트 권한을 허용하고 첫 동기화를 실행합니다.
Warning
쿠키, Bark Device Key, SSH 개인 키, 실제 서버 주소, 또는 민감한 정보를 지우지 않은 Compose 출력을 Issue·채팅·스크린샷에 올리지 마세요. Release에는 SHA256SUMS도 함께 제공되므로 설치 전에 다운로드 파일의 체크섬을 확인할 수 있습니다.
지원 범위와 한계
현재 이 프로젝트는 macOS, Microsoft Edge Chromium의 Default Profile, 그리고 Linux·systemd·Docker Engine·Docker Compose v2.30 이상을 사용하는 자체 호스팅 RSSHub를 대상으로 합니다. 지원 provider는 Zhihu와 Weibo이며, 서버 실행 시에는 Python 3.9 이상 표준 라이브러리만 필요합니다. Node.js는 확장 프로그램 테스트에만 사용합니다.
비밀번호를 자동 입력하거나 인증 문자·MFA를 우회하지 않으며, 만료된 세션을 되살리지도 않습니다. 직접 로그인해야 한다면 브라우저로 돌아가 로그인하는 것이 올바른 방법입니다. 이 프로젝트의 역할은 언제 돌아와야 하는지 판단하고, 나머지 반복 작업을 안정적으로 처리하는 것입니다.
이 글을 작성하는 시점의 최신 버전은 v1.1.3입니다. 저장소에는 Edge 확장 프로그램, macOS Native Host, Linux 서버 구성 요소, 설치·제거 스크립트와 함께 프로토콜 검증, 키 이전, 트랜잭션 롤백, Compose 이전, 모니터링 정책을 다루는 자동화 테스트가 포함되어 있습니다.
프로젝트 주소
코드와 설치 문서, 문제 해결 안내, 보안 정책은 GitHub에서 확인할 수 있습니다: Jaaayden/rsshub-cookie-sync. MIT License로 배포됩니다. 자체 호스팅 RSSHub를 운영하면서 로그인 세션 만료로 자주 작업이 끊긴다면, 반복적이고 실수하기 쉬운 유지 관리 작업을 줄이는 데 도움이 될 수 있습니다.
RSSHub를 직접 운영하다 보면 피하기 어려운 문제가 있습니다. Zhihu나 Weibo처럼 일부 라우트는 로그인 세션이 있어야 정상적으로 작동합니다.
하지만 쿠키는 예고 없이 만료되고 알림도 오지 않습니다. 만료 사실을 알아차렸을 때는 피드가 이미 한참 업데이트되지 않은 뒤인 경우가 많습니다. 문서를 다시 찾아보고, 브라우저에서 쿠키를 가져와 서버에 접속한 다음 Compose를 수정하고 컨테이너를 재생성해야 하죠. 절차 자체가 어렵지는 않지만 꽤 시간을 잡아먹습니다.
더 골치 아픈 점은 ‘피드에 새 글이 한동안 없다’고 해서 쿠키가 만료됐다고 단정할 수 없다는 겁니다. 작성자가 글을 올리지 않았을 수도 있고, 상류 서비스가 요청을 제한하거나 일시적으로 장애를 겪고 있을 수도 있습니다. RSS 업데이트 여부만 보고 판단하면 건드리지 말아야 할 쿠키를 교체하기 쉽습니다.
이 문제를 해결하려고 RSSHub Cookie Sync를 만들었습니다. Microsoft Edge에서 로그인된 Zhihu와 Weibo 쿠키를 자체 RSSHub 서버로 보내고, 먼저 후보 세션을 검증한 뒤 실제로 필요할 때만 교체합니다. 다시 로그인해야 하는 경우에는 Bark로 알려줍니다. RSSHub 소스 코드를 수정하지 않으며 CookieCloud에도 의존하지 않습니다.
단순히 ‘쿠키 복사’가 아니라, 이후의 유지 관리까지
쿠키를 한 번 복사하는 일은 간단합니다. 장기간 운영하면서 필요한 건 다음과 같은 판단입니다.
그래서 이 프로젝트는 브라우저의 쿠키를 RSSHub에 바로 덮어쓰지 않고 새 쿠키를 ‘후보’로 취급합니다. 서버는 후보를 검증하는 동시에 현재 사용 중인 쿠키(live 쿠키)도 별도로 모니터링합니다. 검증과 교체 조건이 모두 충족되어야 후보가 실제 값으로 승격되고, 그렇지 않으면 기존 live 값을 유지합니다.
네 단계로 이어지는 구조
Edge 확장 프로그램은 브라우저와 가장 가까운 단계입니다. Manifest V3를 사용하며 쿠키, 예약 작업, Native Messaging, 로컬 상태에 필요한 권한만 요청합니다. Zhihu와 Weibo의 호스트 권한은 선택 사항이므로 사용자가 직접 허용해야 합니다. 자동 동기화는 Edge 시작 시, 15분마다, 대상 쿠키가 변경된 뒤에 실행됩니다. 쿠키 변경은 잠시 모아서 처리하므로 짧은 시간 안에 반복 업로드되는 일을 막을 수 있습니다.
Native Host는 브라우저 확장 프로그램과 로컬 시스템 기능을 연결하는 다리입니다. 확장 프로그램은 SSH 개인 키에 직접 접근하지 않으며, 서버 연결 정보도 확장 프로그램 패키지에 하드코딩하지 않습니다. Host는 제한된 형식의 서버 주소와 포트, 그리고 ~/.ssh/ 아래 한 단계에 있는 키 파일명만 받아 시스템 OpenSSH를 실행합니다.
SSH 제한 계정은 rsshub-sync로 고정되어 있습니다. 일반 셸 권한이 없고 Docker 그룹에도 속하지 않습니다. 서버는 forced command를 통해 이 계정이 동기화 프로토콜만 사용하도록 제한합니다. 쿠키는 SSH 표준 입력으로 전달되어 명령행 인수에 나타나지 않습니다.
서버는 RSSHub에 영향을 주는 모든 결정을 담당합니다. 입력값 검증, 상류 서비스 확인, 후보 저장, live env 갱신, Compose 검사, 대상 서비스 재생성, 상태 확인 대기, 실패 시 롤백까지 처리합니다. systemd timer를 사용하므로 Mac이 잠자기 상태이거나 Edge가 닫혀 있어도 점검을 계속할 수 있습니다.
실패했다고 바로 쿠키를 바꾸지 않는 이유
로그인 상태를 확인할 때는 새 글이 올라왔는지 보는 대신 Zhihu와 Weibo의 로그인 API 및 RSSHub의 상태를 직접 확인합니다. 서버는 결과를 인증 실패, 일시적 장애, 정상 상태로 나눕니다. 명확한 인증 실패는 누적 확인하고,403는429는432와 시간 초과, 5xx은 일시적인 상류 장애로 처리하므로 쿠키를 즉시 교체하지 않습니다.
이 구분은 중요합니다. 요청이 제한된 상황에서 무작정 쿠키를 바꿔도 문제가 해결되지 않을뿐더러, 정상적으로 사용할 수 있는 세션을 잃을 수도 있습니다. live 쿠키가 만료된 것으로 확인되고 서버에 검증을 통과한 후보가 있을 때만 자동 복구가 의미가 있습니다. 사용할 후보가 없으면 Bark가 Edge에서 다시 로그인하라고 알려줍니다. 일시적 장애가 계속되거나 복구되는 경우에도 정책에 따라 알림을 보냅니다.
Zhihu와 Weibo의 상태는 서로 독립적입니다. 한쪽 서비스에 문제가 생겨도 다른 쪽의 유효한 로그인 세션을 지우거나 차단하지 않습니다.
RSSHub 업데이트에서는 실패도 정상적인 흐름으로 다룹니다
처음 연결할 때 설치 프로그램은 대상 RSSHub service의 ZHIHU_COOKIES와 WEIBO_COOKIES 및 TWITTER_AUTH_TOKEN을 Compose의 environment에서 Compose 파일 옆의 secrets/rsshub.env로 옮기고, env_file의 raw 형식으로 불러옵니다. 따라서 쿠키에 포함된 $나 # 같은 문자를 Compose가 다시 해석하지 않으며, secret 파일은 root만 읽을 수 있도록 권한을 제한합니다.
이후 쿠키 교체는 ‘파일을 쓰고 잘되길 비는’ 방식이 아닙니다. 서버는 잠금을 잡고 트랜잭션을 실행해 새 env를 원자적으로 기록하고, 먼저 Compose 설정을 검사한 다음 대상 RSSHub service만 재생성하고 상태를 확인합니다. 어느 단계에서든 실패하면 이전 env를 복원하고 기존 실행 상태를 다시 만듭니다. docker compose down를 실행하지 않고 Redis나 browserless를 재생성하지도 않습니다. 이미지도 내려받지 않고 볼륨도 삭제하지 않습니다.
이 부분은 ‘쿠키를 어떻게 가져오는가’보다 더 중요합니다. 자동화의 가장 위험한 점은 작업을 못 하는 것이 아니라, 절반만 처리한 채 모호한 상태를 남기는 것입니다. 이 프로젝트는 설치·이전·교체·제거 과정에서 중단 후 복구, 경계 검사, 멱등성을 예외가 아닌 정상 흐름으로 다룹니다.
자격 증명은 어디에 저장되는가
쿠키는 사실상 로그인 자격 증명입니다. 프로젝트는 쿠키가 노출될 수 있는 경로를 최대한 줄입니다.
이런 조치로 호스트 자체의 신뢰 경계를 없앨 수는 없습니다. Mac의 현재 사용자 권한을 가진 프로그램은 브라우저를 공격하거나 해당 사용자가 읽을 수 있는 SSH 파일을 열 수 있습니다. 서버의 root 또는 Docker 관리 권한을 가진 사람 역시 RSSHub 컨테이너의 쿠키를 읽을 수 있습니다. 이 프로젝트가 보호하는 것은 동기화 경로이지, 이미 침해된 운영체제에서 빠져나오는 샌드박스가 아닙니다.
설치 과정
일반적인 설치는 세 곳에서 진행합니다. 먼저 Mac의 현재 사용자 계정으로 Native Host를 설치하고, 설치 프로그램이 마지막에 출력하는 프로젝트 공개 키를 복사합니다.
그다음 일반 SSH로 서버에 처음 접속해 호스트 지문을 확인하고 수락합니다. 같은 root 세션에서 서버 설치 프로그램을 실행하고, 안내에 따라 RSSHub Compose를 선택한 뒤 앞에서 복사한 공개 키를 붙여 넣습니다.
마지막으로 GitHub Releases에서 확장 프로그램 ZIP을 내려받고, edge://extensions에서 ‘압축해제된 확장 프로그램을 로드합니다’를 선택해 설치합니다. 확장 프로그램의 연결 설정으로 이동해 Native Host가 읽히는지 확인하고, 서버 주소와 SSH 포트를 입력한 뒤 rsshub-cookie-sync 전용 키를 선택합니다. 이후 Zhihu와 Weibo 사이트 권한을 허용하고 첫 동기화를 실행합니다.
쿠키, Bark Device Key, SSH 개인 키, 실제 서버 주소, 또는 민감한 정보를 지우지 않은 Compose 출력을 Issue·채팅·스크린샷에 올리지 마세요. Release에는 SHA256SUMS도 함께 제공되므로 설치 전에 다운로드 파일의 체크섬을 확인할 수 있습니다.
지원 범위와 한계
현재 이 프로젝트는 macOS, Microsoft Edge Chromium의 Default Profile, 그리고 Linux·systemd·Docker Engine·Docker Compose v2.30 이상을 사용하는 자체 호스팅 RSSHub를 대상으로 합니다. 지원 provider는 Zhihu와 Weibo이며, 서버 실행 시에는 Python 3.9 이상 표준 라이브러리만 필요합니다. Node.js는 확장 프로그램 테스트에만 사용합니다.
비밀번호를 자동 입력하거나 인증 문자·MFA를 우회하지 않으며, 만료된 세션을 되살리지도 않습니다. 직접 로그인해야 한다면 브라우저로 돌아가 로그인하는 것이 올바른 방법입니다. 이 프로젝트의 역할은 언제 돌아와야 하는지 판단하고, 나머지 반복 작업을 안정적으로 처리하는 것입니다.
이 글을 작성하는 시점의 최신 버전은 v1.1.3입니다. 저장소에는 Edge 확장 프로그램, macOS Native Host, Linux 서버 구성 요소, 설치·제거 스크립트와 함께 프로토콜 검증, 키 이전, 트랜잭션 롤백, Compose 이전, 모니터링 정책을 다루는 자동화 테스트가 포함되어 있습니다.
프로젝트 주소
코드와 설치 문서, 문제 해결 안내, 보안 정책은 GitHub에서 확인할 수 있습니다: Jaaayden/rsshub-cookie-sync. MIT License로 배포됩니다. 자체 호스팅 RSSHub를 운영하면서 로그인 세션 만료로 자주 작업이 끊긴다면, 반복적이고 실수하기 쉬운 유지 관리 작업을 줄이는 데 도움이 될 수 있습니다.