Code

SSL, RSS에 관한 다채로운 삽질기

February 15, 2016

author:

SSL, RSS에 관한 다채로운 삽질기

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 FeedFeedly 에서는 정상적으로 등록이 되는데, 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 관련 버그 리포트도 있었지만 결론적으로 내가 해결할 수 있는 일이 아니다.

SSL, RSS에 관한 다채로운 삽질기

Cloudflare의 인증서는 Comodo에서 발급한 것으로, SHA1, 2를 모두 지원
삽질을 거하게 하는 과정에서 인증서와 SSL, TLS 암호화 등의 개념을 조금 더 알게 되었지만 이것이 문제를 해결하지는 못했다.


Ghost에서 문제점을 찾기 시작

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

SSL, RSS에 관한 다채로운 삽질기

특수문자는 XML에서 유니코드로 지원하는 문자라는 걸 이때는 확실하게 잘 몰랐다
혹시나 싶어 (백슬래쉬) 문자가 들어간 글을 내리니 RSS가 정상적으로 잘 발행이 되니까 ‘아 이게 문제를 일으킨 것이군!’ 이라고 섣부른 착각을 했다. 지금 돌이켜보면 어처구니 없는 판단인데 그저 당장 눈에 보이는 결과만 좇다 보니 그랬던 것 같다.

그래서 신난 마음에 Ghost 코어의 XML, RSS 관련 코드를 훑어봤다. 애초에 문제가 없는 문자이니 당연히 글자에 대한 처리는 딱히 없었고, 멍청하게도 나는 간만에 풀리퀘 넣어서 컨트리뷰터 먹을 생각에 잠시 눈이 멀었다.

SSL, RSS에 관한 다채로운 삽질기

저 에러코드 바이트를 먼저 제대로 확인했어야 했다
그래도 잠시 흥분을 가라앉히고, 이슈를 먼저 등록시키려고 했으나 그 전에 Ghost의 Slack 채널에서 물어봐야 할 것 같았다. 이슈나 컨트리뷰션에 대한 가이드라인의 조건이 조금 까다로워서 아무래도 한번은 이것저것 모르는 점을 물어봐야 할 것 같았다. 게다가 이슈는 한 번 등록해버리면 영구삭제가 안 되므로 쪽팔림이 영원히 박제가 될 수가 있기에 조심스러웠는데 결과적으로는 정말 다행스런 행동이었다.


문제 해결

SSL, RSS에 관한 다채로운 삽질기
SSL, RSS에 관한 다채로운 삽질기

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

SSL, RSS에 관한 다채로운 삽질기

Ghost 에디터와 Macdown 에디터에선 보이지 않는 문자가 Sublime Text에선 보임.
어쩌다 저런 문자가 입력됐는지 도통 알 길이 없지만, 이런 경우도 있나 싶다. 문자코드만 가지고 파고 들어가도 내가 모르는 거대한 우주가 나올 것 같다. 제대로 모른 채 EUC-KR, ANSI, UTF-8 등을 써온 것에 대한 잠시 반성했다.


느낀점

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


참고

  1. Hannah Wolfe의 이슈
  2. XML에서 지원하는 유니코드 문자 관련 Stackoverflow
  3. Cloudflare에서 제공하는 SSL의 맹점
  4. Cloudflare의 SSL과 Feed Validator와의 문제
  1. Hannah는 Ghost의 Co-Founder 이자 Lead Developer 이다.