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

4 weeks ago 15

XSSR은 HTTP 연결을 계속 열어 두고 HTML과 CSS를 흘려보내, 프런트엔드 JavaScript 없이 서버에서 페이지를 동적으로 갱신하는 방식임 브라우저의 점진적 렌더링과 숨겨진 iframe을 대상으로 하는 폼 제출을 결합해, 메인 페이지를 새로고침하지 않고 화면 갱신과 사용자 입력을 처리함 Flappy Bird 클론에서는 서버가 물리 엔진을 실행하고 CSS를 60 FPS로 전송해 점수 표시, 장애물 이동, 클릭에 따른 점프를 구현함 Rust 구현은 오래된 홈서버에서 코어당 약 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가 제안한 숨겨진 iframe 기법을 사용하면 폼 제출 시 메인...

Read Entire Article