극단적인 서버 사이드 렌더링 (2025)

1 hour ago 1

HTTP 응답을 끝내지 않고 HTML과 CSS를 계속 보내면, 프론트엔드 JavaScript 없이도 화면을 동적으로 바꿀 수 있다는 발상에서 출발한 실험 브라우저가 도착한 내용을 즉시 렌더링하는 특성을 이용하고, 사용자 입력은 숨겨진 iframe으로 폼을 제출해 메인 페이지를 새로고침하지 않고 서버에 전달함 이 방식으로 Flappy Bird 클론까지 구현했으며, 서버가 물리 연산을 하고 초당 60회 CSS를 보내므로 게임을 하는 동안에도 브라우저의 로딩 표시가 끝나지 않음 오래된 홈서버에서도 코어당 약 500개 게임을 실행하고 게임당 대역폭은 약 20 KiB/s로 의외로 감당할 만했지만, 클릭할 때마다 서버를 왕복해야 해 멀리서는 플레이하기 어려움 완성한 게임을 자랑하려고 Pleroma에 링크를 올렸더니 끝나지 않는 응답에 링크 미리보기 처리가 막혀 서버가 반복적으로 다운됐고, 결국 DoS 취약점 신고와 패치로 이어짐 일반 SSR과 XSSR의 출발점 구식 SSR에서는 요청마다 백엔드가 HTML을 동적으로 생성함 /users/39 요청에 데이터베이스 등의 정보를 이용해 사용자 39의 페이지를 생성하며, 디스크에 대응하는 39.html 파일이 있을 필요는 없음 프런트엔드 JavaScript나 별도 렌더링 로직은 필요 없지만, 로드가 끝난 페이지를 동적으로 바꾸지는 못함 신식 SSR에서는 사용자 상호작용 때 프런트엔드 JavaScript가 백엔드에 요청하고, 반환된 HTML을 페이지에 삽입함 동적인 페이지를 만들 수 있지만 프런트엔드 로직을 유지해야 함 HTTP 응답을 끝내지 않고 화면 갱신하기 HTTP 서버는 헤더와 HTML 본문을 전송하며, netcat으로 사람이 직접 천천히 응답을 보내도 브라우저는 수신한 HTML을 그때그때 렌더링함 실험에 사용한 netcat은 줄 단위로 버퍼링하므로 Enter를 누를 때마다 한 줄이 브라우저로 전송됨 이 동작은 Firefox와 Chromium에서 모두 확인됨 추가로 보내는 CSS도 적용되므로 요소를 계속 이동시키거나, 기존 요소를 숨기고 새 요소를 추가할 수 있음 따라서 HTTP 연결을 무기한 유지하면 JavaScript 없이도 서버가 페이지를 동적으로 갱신할 수 있음 숨겨진 iframe으로 사용자 입력 받기 JavaScript 없이 입력을 보내는 일반적인 <form>은 페이지를 다시 로드하므로, 연결을 유지하려는 XSSR의 목적에 맞지 않음 DJ Chase가 제안...

Read Entire Article