SSL, RSS에 관한 다채로운 삽질기
![]()
어처구니 없는 실수와 삽질에 대해 다룹니다.
node v4.2 -> node v0.10 -> node-rss 패키지와 rss 관련 코어 보기 -> 이슈 등록하기 전 Slack에서 문의 -> 문제 해결 의 과정을 거쳤습니다.
얼마 전, #이상한모임 기술 블로그에 필진으로 등록을 신청했던 적이 있었다. 이왕 블로그를 제대로 운영해보자는 마음을 먹은 김에 한번 찔러 본 것이다. 사실 내 수준을 고려하면 많이 부끄럽지만, 쪼렙 신입 수준의 글도 누군가에겐 도움 혹은 자극이 될 수도 있겠다는 생각이 들어서였다. 게다가 용기내서 뭔가를 질러놓으면 고수님께서 지나가다 보고 답답한 마음에 가르침을 주실 수도 있겠다는 어처구니 없는 묘한 상상도 들어가 있었다.
아무튼, 처음엔 긍정적으로 보시고 일단은 등록을 해 주시려고 한 것 같다. 그러나 내 블로그가 문제였다. Ghost 블로그 Github 저장소 에서 마스터 브랜치를 그대로 클론받아 Ghost 블로그를 설치했는데, 처음에는 권장사항과는 다르게 v4.2를 사용하였다.
# Node v0.10.x - recommended
# Node v0.12.x and v4.2+ LTS - supported
#
# Choose wisely
forever
패키지가 특정 버전에서는 리눅스 드라이버와의 의존성이 맞지 않았는지 정상 동작하지 않았다. 그래도 일단 밀어붙여보자는 마음에 일단은 써보기로 했다.
RSS Feed Validator로 문제 원인 혼동
문제는 RSS Feed 기능에서 발생했다. 어찌된 영문인지 Safari Feed와 Feedly 에서는 정상적으로 등록이 되는데, Slack의 Feed App이나 WordPress의 FeedWordpress 플러그인, Google의 Feedburner에는 등록이 되지 않았다. 찾아보니 xml 파일이 제대로 생성이 되지 않는 것이 이유였다. RSS Validator로 블로그를 체크하니 아래와 같은 에러를 띄웠다.
Server returned [Errno 1] _ssl.c:504: error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error
대충 TLS 1.0과 관련된 내부 에러란 소리같은데, 검색을 해보니 Stack Overflow에서 문제의 원인에 대한 힌트를 얻을 수 있었다. Cloudflare의 SSL 기능을 사용할 경우, RSS Validation이 제대로 작동하지 않는다는 이야기다. 인증서 관련 문제인가 싶어서 삽질을 해보니 이건 또 아니었다. TLS 에 대한 위키피디아와 Cloudflare에서 제공하는 문서를 확인해보니 별 문제가 없어보였다. Ubuntu의 OpenSSL TLS 관련 버그 리포트도 있었지만 결론적으로 내가 해결할 수 있는 일이 아니다.

Ghost에서 문제점을 찾기 시작
어쨌건 RSS Validator의 에러로 문제를 혼동했으나 결국 RSS 발행의 문제는 Cloudflare의 Keyless SSL, Flexible SSL이 핵심 원인이 아님을 눈치챘다. 노드 버전 때문에 자잘한 문제를 겪던 와중이라 이참에 그냥 권장사항인 v0.10.41로 버전을 낮추었고, 혹시나 모를 충돌을 피하고자 노드 패키지들을 싹 날린다음 초기 환경대로 재설치를 하였다. 그럼에도 RSS 발행 문제는 그대로였고, XML 코드를 까봐도 아무리 봐도 딱히 문제가 없었다. 혹시나 글 중간에 인식 못하는 특수문자 등이 원인인가 봤더니 이것도 별 문제가 없어보였다. 그러던 중 혹시나 하는 마음에 아래의 글을 임시글로 처리했더니 RSS가 제대로 발행이 되는 것이다.

특수문자는 XML에서 유니코드로 지원하는 문자라는 걸 이때는 확실하게 잘 몰랐다
(백슬래쉬) 문자가 들어간 글을 내리니 RSS가 정상적으로 잘 발행이 되니까 ‘아 이게 문제를 일으킨 것이군!’ 이라고 섣부른 착각을 했다. 지금 돌이켜보면 어처구니 없는 판단인데 그저 당장 눈에 보이는 결과만 좇다 보니 그랬던 것 같다.
그래서 신난 마음에 Ghost 코어의 XML, RSS 관련 코드를 훑어봤다. 애초에 문제가 없는 문자이니 당연히 글자에 대한 처리는 딱히 없었고, 멍청하게도 나는 간만에 풀리퀘 넣어서 컨트리뷰터 먹을 생각에 잠시 눈이 멀었다.

문제 해결


Slack 에 질문을 하자마자 몇몇 엔지니어가 도와줬다. 특히, Hannah1의 도움이 가장 컸다. 내 코드를 보여주지도 않았는데 문제에 대한 원인을 한번에 머릿속에 그리고 해결 방안들을 짚어주는 내공이 무서울 만큼 대단했다. 다시 생각해보면 소름이 돋는다. 초고수의 내공과 안목은 참 무서울 만큼 대단하고 신박하더라.

느낀점
눈에 보이는 에러만이라도 일단은 잘 해석해야 했다. 에러를 어설프게 받아들이면 엄한 데 삽질을 거하게 할 수 밖에 없다. 밑바탕이 되는 스펙과 기본 개념을 짚고 넘어갈 필요도 있어보인다. 글은 안 쓰고 쓸데없이 삽질을 거하게 했지만 헛된 노력으로 끝나지 않고 조금이나마 배우고 시야가 넓어져서 다행인 것 같다. 비록 자만했던 건 아니지만 항상 겸손해야겠다는 생각도 들었다. 조만간 SSL, XML과 관련된 스펙을 제대로 짚어봐야겠다.
참고
- Hannah Wolfe의 이슈
- XML에서 지원하는 유니코드 문자 관련 Stackoverflow
- Cloudflare에서 제공하는 SSL의 맹점
- Cloudflare의 SSL과 Feed Validator와의 문제
- Hannah는 Ghost의 Co-Founder 이자 Lead Developer 이다. ↩