- 저자는 20년 전에 전부 Atom으로 갔어야 했다고 보고 RSS가 죽기를 바란다고 씀. 이념적 순수성이 아니라 쓸모 있는 이유로 설득하고 싶다는 게 글의 목적
- RSS라는 이름이 아홉 개 비호환 포맷을 가리키고 경쟁하는 조직들이 같은 버전 번호를 쓰기도 하는데, 저자는 이것마저 표면 차이라며 걷어냄
- 남는 진짜 차이가 제목의 인코딩 의미. Atom의 text construct는 값이 텍스트인지 엔티티 인코딩된 HTML인지 XHTML인지 선언하게 하는데, RSS 제목에는 그 자리가 없음
- 팟캐스트가 유일한 예외. 20년 넘게 거의 모든 피드 리더가 둘 다 지원하지만 주요 배포처는 RSS만 받고, 애플 팟캐스트는 남아 있던 Atom 지원마저 2023년에 걷어냄
- 이 글은 2026년 4월에 시작해 아직 초안임. 근거가 될 리더 실태 조사가 본문에 TODO로 적혀 있고, 두 번째 차이를 다루는 절은 “RSS 나쁘고 Atom 좋다. 알겠지?” 한 줄로 비어 있음
Chris Morgan이 자기 블로그에 실제로 썼다는 제목 하나가 이 문제의 난이도를 보여줍니다.
<_>::v::<_>
제목에 <code>를 쓰려는 순간
CMS는 대개 본문 안의 제목(heading)에는 마크업을 허용하면서 글의 제목(title)에는 허용하지 않습니다. Chris Morgan은 이걸 비극이라고 부릅니다. <code>나 <em>이 필요한 글이 많고, 본인도 자주 그렇게 쓰거든요.
문제는 그 제목을 피드로 내보낼 때 터집니다. 예를 들어 이런 제목이 있다고 하죠.
All about the
<xmp>element
Atom에는 갈림길이 명시돼 있고, 무엇을 골랐는지가 태그에 적힙니다.
type="text"— 마크업을 버리고 텍스트로 인코딩<title type="text">All about the <xmp> element</title>
type="html"— 마크업을 살리고 HTML을 엔티티로 인코딩<title type="html">All about the <code>&lt;xmp></code> element</title>
type="xhtml"— HTML을 XML로 표현<title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">All about the <code><xmp></code> element</div></title>
RSS에는 그 선언 자리가 없습니다. 본문(<description>)조차 인코딩 의미를 갖지 못했는데요. 그건 한동안 실제 문제였다가 시간이 지나며 다들 “언제나 HTML”로 합의해 덮였습니다. 제목은 그 합의조차 못 받았고, 구현마다 다르게 처리하죠.
원문 요약에 적힌 문장은 <나 & 같은 글자를 RSS 제목에 신뢰성 있게 쓸 수 없다는 것입니다. 위에 든 <_>::v::<_>가 그 난이도의 실물이에요. 꺾쇠가 네 번 들어간 제목을 RSS로 안전하게 내보낼 방법이 없습니다.
팟캐스트에서 애플이 한 일
원문이 선의로 인정하는 예외가 팟캐스트입니다. 지난 20년간 나온 피드 리더와 오픈소스 라이브러리는 거의 전부 RSS와 Atom을 함께 지원하는데, 규모가 큰 팟캐스트 리더나 배포처는 대부분 RSS만 받아요.
시간 순서는 이렇습니다. 팟캐스팅이 뜨기 시작했고, RSS 2.0이 거기 맞춰 enclosure를 넣었습니다. 그 뒤에 Atom이 RSS의 문제 대부분을 고치려고 설계돼 안정화됐고요. 그런데 애플이 iTunes 팟캐스팅을 RSS만 지원하는 채로 냈습니다. iTunes 클라이언트는 나중에 Atom 지원을 얻었지만 iTunes 뮤직 스토어는 아니었고, 뮤직 스토어와 그 후신인 애플 팟캐스트 카탈로그가 Atom을 지원했다는 명확한 증거는 Chris Morgan도 찾지 못했어요. 남아 있던 것마저 2023년에 제거됐습니다.
“그래서 나는 애플을 탓하고 싶다. 그들이 결정적인 초기에 이 공간을 지배했고, 망쳐놨다.”
(“So I want to blame Apple. They controlled the space in the critical early days, and they ruined it.”)
지금 상태를 원문은 세 문장으로 끊어 적습니다. 어떤 팟캐스트 리더나 배포처는 Atom을 지원합니다. 어떤 곳은 지원한다고 해놓고 안 하죠. 어떤 곳은, 아마 제일 중요한 곳들이, 그냥 안 합니다.
“RSS는 엉망이다. 팟캐스트 RSS는 더 엉망이다. 시간이 멈춘 채 RSS의 결함을 우회하는 핵 위에 핵이 쌓여 있다. 아이고.”
(“RSS is a mess. Podcast RSS is even more of a mess. Frozen in time, hack is piled upon hack to work around RSS’s shortcomings. Ugh.”)
지원 부재를 말한 koala 밑에서 스레드는 팟캐스트 바깥으로 번졌습니다. spc476은 파이어폭스가 RSS와 Atom 지원을 뺐다는 걸 상기시켰고, mro는 구글 리더 폐쇄가 팀 버너스리의 제안 이후 웹에 가장 큰 영향을 준 사건이었다고 봤어요. 블로고스피어를 죽이고 플랫폼 몇 개만 남겼다는 거죠.
@astrojs/rss가 내보내는 제목
이 사이트도 표적입니다. src/pages/rss.xml.ts는 @astrojs/rss 4.0.18을 쓰는데, 패키지 소스를 열어보면 루트가 이렇게 고정돼 있습니다.
root.rss = { "@_version": "2.0" };
// ...
root.rss.channel.item = items.map(result => {
const item = {};
if (result.title) { item.title = result.title; } // 평문 문자열, type 선언 없음
제목은 문자열 그대로 XML 빌더에 넘어가 엔티티로 이스케이프됩니다. 리더 입장에서는 그게 원래 텍스트였는지 마크업이었는지 알 방법이 없죠. 우리 제목이 지금까지 전부 평문이라 사고가 안 났을 뿐입니다.
Atom을 같이 내보내는 데 새 의존성이 필요하지도 않아요. src/pages/atom.xml.ts 하나를 만들어 <feed xmlns="http://www.w3.org/2005/Atom">을 직접 조립하고, 제목마다 type을 붙여 주면 됩니다.
// 마크업이 없으면 type="text", <code> 같은 걸 쓰려면 type="html"
const title = (t: string, kind: "text" | "html" = "text") =>
`<title type="${kind}">${escapeXml(t)}</title>`;
<link rel="alternate" type="application/atom+xml">을 레이아웃 <head>에 추가하면 리더가 알아서 찾아갑니다. 기존 /rss.xml은 남겨 두고요. adam_d_ruppe가 로브스터스에서 자백한 것처럼, 사람들이 달라고 하는 이름은 여전히 RSS니까요.
안 쓰인 두 절과 TODO 한 줄
여기서 글이 멈춥니다.
제목 인코딩 다음에 오는 절의 제목은 “요약과 전문의 구분”인데, 본문은 이렇게만 적혀 있습니다.
“RSS 나쁘고, Atom 좋고. 알겠지? 😁 휴리스틱, interop에 나쁨, 기타 등등.”
(“RSS bad, Atom good. Capiche? 😁 / Heuristics, bad for interop, &c. &c.”)
그게 전부입니다. 원문이 쓰려던 게 뭔지는 짐작이 갑니다. Atom은 <summary>와 <content>를 따로 두는데 RSS에는 <description>과 나중에 얹힌 content:encoded밖에 없어서, 지금 온 게 요약인지 전문인지를 리더가 휴리스틱으로 알아맞혀야 하죠. 그러면 구현마다 답이 갈리고 interop이 무너집니다. 이어서 세 번째 차이가 뭐였는지 기억이 안 난다고, 발행 전에 떠오르길 바란다고 적혀 있어요. 제목 절 끝에는 표시가 하나 붙어 있고요.
“TODO: RSS 리더들이 이 경우들을 어떻게 처리하는지 조사할 것. (이게 내가 이 글을 여태 발행하지 않은 가장 큰 이유다. 아마 2020년쯤엔 냈어야 했다.)”
(“TODO: survey RSS readers to find out how they handle all of these cases. (This is the biggest reason I haven’t published this previously. Probably should have by 2020 or so.)”)
주장은 “어떤 내용은 RSS로 신뢰성 있게 표현할 수 없다”인데, 그 신뢰성을 재는 조사가 본인 밝힌 대로 아직 없습니다. 그러면 무엇을 근거로 이 주장을 믿어야 할까요. 검증이 빈 채로 로브스터스 첫 화면에 올라 댓글 64개를 받았고, 그 댓글들이 저자 대신 답을 채웠습니다. 스레드는 결국 Atom을 “RSS 3”으로 개명하자는 데까지 갔고, RSS 3이 이미 존재한다는 답이 돌아오자 누군가 “그럼 RSS 4로 가죠”라고 했어요. 이름을 두고 벌어진 그 줄기에서 표를 제일 많이 받은 게 이 농담입니다.
Loading comments...